0

主キーである ID 列を持つテーブル A があります。主キーは同時に、別のテーブル B を指す外部キーでもあります。

テーブル A に作成しようとしている ID 列と、「1」などの別のカスタム値をテーブル B に挿入する挿入トリガーを作成しようとしています。

@@Identity を使用してみましたが、外部キーの競合が発生し続けます。ご協力いただきありがとうございます。

create TRIGGER dbo.tr ON dbo.TableA FOR INSERT
AS 
SET NOCOUNT ON
begin
    insert into TableB
    select @@identity, 1;
end
4

1 に答える 1

0

alexolb は、上記のコメントで質問に答えました。もう 1 つの方法はIDENT_CURRENT、テーブルから選択する代わりに関数を使用することです。このアプローチの欠点は、常にシードよりも 1 番高く開始されることですが、シードを 1 単位低く設定することで簡単に解決できます。サブクエリよりも関数を使った方が気持ちいいと思います。

例えば:

CREATE TABLE [tbl_TiggeredTable](
    [id] [int] identity(0,1) NOT NULL,
    [other] [varchar](max)
)

CREATE TRIGGER [trgMyTrigger] 
    ON  [tbl_TriggeredTable] 
    INSTEAD OF INSERT,UPDATE,DELETE

    SET identity_insert tbl_TriggeredTable ON
    INSERT INTO tbl_TriggeredTable (
        [id],
        [other]
    ) 
    SELECT
        -- The identity column will have a zero in the insert table when
        -- it has not been populated yet, so we need to figure it out manually
        case i.[id]
        when 0 then IDENT_CURRENT('tbl_TriggeredTable') + IDENT_INCR('tbl_TriggeredTable') 
        ELSE i.[id]
        END,
        i.[other],
    FROM inserted i
    SET identity_insert tbl_TriggeredTable OFF

END
于 2015-07-15T01:30:37.510 に答える