SQL Server AFTER INSERTトリガー


10

列のテキストmarriedで挿入が行われた後にこのトリガーを発生させたいmarital_status、これが今のところ

ALTER TRIGGER [dbo].[marriage]
ON  [dbo].[applicant_personal_info]
AFTER INSERT
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF (SELECT [marital_status] FROM inserted) = 'married'
 BEGIN
     INSERT INTO [dbo].[applicant_marriage_info]([dom])
     VALUES('abc')
 END
END

回答:


11

ここで遭遇する問題は、SQL ServerにはOracleのような「FOR EACH ROW」トリガーがないという事実から来ています。複数行の変更を処理するには、トリガーを作成する必要があります。つまり、INSERTEDまたはDELETED仮想テーブルには複数の行を含めることができます。

このような更新が発生した場合、トリガーは失敗します。これは、(SELECT [marital_status] FROM inserted)複数の行を返すためです。サブクエリは、直接比較で使用される単一の値を返す必要があります。

トリガーはおそらく次のようになります。

CREATE TRIGGER [dbo].[marriage] ON  [dbo].[applicant_personal_info] FOR INSERT
AS 
BEGIN
    SET NOCOUNT ON
    IF EXISTS (SELECT [marital_status] FROM INSERTED WHERE marital_status = 'married')
    BEGIN
        INSERT INTO [dbo].[applicant_marriage_info] ([dom])
        SELECT
            'abc' --Replace with whatever you're really inserting
        FROM INSERTED
        WHERE marital_status = 'married'
    END
END

8

したがって、このトリガーは実際には必要なものにかなり近いです。ここで問題となるのは、挿入された行がある場合に1行だけがapplied_marriage_infoに挿入されることです。これはあなたが実際に欲しいものですか?一度に複数の行が挿入された場合はどうなりますか?

ALTER TRIGGER [dbo].[marriage]
ON  [dbo].[applicant_personal_info]
AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    INSERT INTO [dbo].[applicant_marriage_info]([dom])
    SELECT 'abc' 
    FROM inserted 
    WHERE marital_status = 'married'
END

おそらく、ここで示したものよりも多くの列が必要になります。


このデータを入力するたびに実行する必要があります
kabuto178

2
次に、最後の部分を次のように置き換える方法があります。BEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM inserted WHERE marital_status = 'married' END
ypercubeᵀᴹApr

これを考慮してサンプルコードを少し変更しました。IF EXISTSビットはもう必要ありません。挿入に対してクエリを実行し、そのデータを他のテーブルにロードするだけです。おそらく、私が表示したよりも多くの列、ある種のIDがおそらく必要になりますが、おそらくあなたはその考えを理解しているでしょう。
mrdenny 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.