2009-02-28 3 views
1

私は2つのテーブルを持っています。トリガーを使用して複数のテーブルにレコードを挿入するにはどうすればよいですか?

同じレコードを両方のテーブルに同時に挿入したいとします。
つまり、最初のテーブルのレコードを挿入している間、この同じレコードもトリガを使用して2番目のテーブルに挿入されます。

このプロセスでの経験やアドバイスはありますか?

+0

キャップで簡単.... – Alex

+0

どのようにレコードを元のテーブルに挿入して始めますか? – GregD

答えて

4

ストアドプロシージャを使用している場合、あなたは簡単にこの

CREATE PROCEDURE sp_Insert 
@Value varchar(10) 
AS 
insert into table1 (...,...) values (@value,...) 
insert into table2 (...,...) values (@value,...) 
+0

これは、1つのSPで扱う簡単な方法です。より読みやすく、簡単にデバッグできます。トリガーは、一度設定すると、そこにいることを忘れることができ、データが変化している理由を理解できないため、トリシックにすることができます。 – schooner

+0

私はあなたの環境が何であるか知っていませんが、VSでC#を使用している場合は、このチュートリアルをご覧ください。これは、C#でADO.Netとストアドプロシージャを使用する方法です。 http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson07.aspx – erik404

1

を管理することができ、私はトリガーを超えるエリックのメソッドを使用してお勧めします。トリガーはパフォーマンス上の問題を引き起こす傾向があり、多くの場合、トリガーが存在することを忘れて予期しない動作が発生します。しかし、トリガーを使用したい場合、それは動作します。ここに例があります:

CREATE TRIGGER trgTest ON Test 
FOR INSERT 
AS 
INSERT Test2 
    (Id, value) 
SELECT Id, Value 
FROM Inserted 
0

カーソルコンセプトを使用できます!

CREATE OR REPLACE TRIGGER bi_order 
BEFORE INSERT 
ON ord 
REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW 
WHEN (NEW.payment_type = 'CREDIT') 
DECLARE 
CURSOR cur_check_customer IS 
    SELECT 'x' 
    FROM customer 
    WHERE customer_id = :NEW.customer_id 
    AND credit_rating = 'POOR'; 
lv_temp_txt   VARCHAR2(1); 
lv_poor_credit_excep EXCEPTION; 
BEGIN 
OPEN cur_check_customer; 
FETCH cur_check_customer INTO lv_temp_txt; 
IF (cur_check_customer%FOUND) THEN 
    CLOSE cur_check_customer; 
    RAISE lv_poor_credit_excep; 
ELSE 
    CLOSE cur_check_customer; 
END IF; 
EXCEPTION 
WHEN lv_poor_credit_excep THEN 
    RAISE_APPLICATION_ERROR(-20111, 'Cannot process CREDIT ' || 
     'order for a customer with a POOR credit rating.'); 
WHEN OTHERS THEN 
    RAISE_APPLICATION_ERROR(-20122, 'Unhandled error occurred in' || 
     ' BI_ORDER trigger for order#:' || TO_CHAR(:NEW.ORDER_ID)); 
END bi_order; 
関連する問題