2012-11-29 53 views
0

我有一個帶有標識列的表A,它是主鍵。 主鍵是在同一時間指向另一個表B的外鍵。用於在標識列上插入的觸發器

我想建立一個插入觸發器插入到表B中即將在表A中創建的標識列和另一個表自定義值,例如'1'。

我試過使用@@身份但我不斷收到外鍵衝突。謝謝你的幫助。

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

'@@ IDENTITY'無效這裏。嘗試'INSERT表B SELECT identity_column_name,1從插入;' –

+0

我試過,但也有一個外鍵問題。看起來,標識列只在插入後計算出來,而我之前需要它以避免錯誤... – alexolb

+0

您確定您正在向正確的表格追逐外鍵嗎?這應該和'BEGIN TRAN; INSERT tableA; INSERT TableB SELECT SCOPE_IDENTITY(); COMMIT TRAN;' –

回答

0

alexolb自己在上面的評論中回答了這個問題。另一種選擇是使用IDENT_CURRENT函數,而不是從表中選擇。這種方法的缺點是它總是比種子開始高一號,但是通過將種子設置爲一個較低的單位可以很容易地解決這個問題。我覺得使用函數比子查詢更好。

例如:

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