2013-12-12 70 views
1

在表中創建後存儲過程「dbo.terms」使用此代碼在裏面插入數據:創建觸發器在另一個表中插入的行

CREATE PROCEDURE dbo.terms 
     @Term_en      NVARCHAR(50) = NULL , 
     @Createdate     DATETIME  = NULL , 
     @Writer      NVARCHAR(50) = NULL , 
     @Term_Subdomain    NVARCHAR(50) = NULL 
AS 
BEGIN 
    SET NOCOUNT ON 

    INSERT INTO dbo.terms 
      (     
      Term_en      , 
      Createdate     , 
      Writer      , 
      Term_Subdomain     
     ) 
    VALUES 
      ( 
      @Term_en = 'Cat'    , 
      @Createdate = '2013-12-12'  , 
      @Writer   = 'Fadi'   , 
      @Term_Subdomain = 'English'      
     ) 

END 

GO 

我想創建一個Trigger它添加另一個表中的行dbo.term_prop

我用這個代碼:

CREATE TRIGGER triggerdata 
    AFTER INSERT 
    ON dbo.terms 
    FOR EACH ROW 
    BEGIN 
     INSERT INTO dbo.term_prop VALUES 
     ('قطة', term_ar, upper(:new.term_ar) , null , 'chat', term_fr, upper(:new.term_fr) , null ,'Animal', Def_en, upper(:new.Def_en) , null ,'حيوان', Def_ar, upper(:new.Def_ar) , null ,'Animal', Def_fr, upper(:new.Def_fr) , null); 
    END; 

,它顯示了我一個錯誤

+0

什麼是錯誤? –

+0

另外,爲什麼不只是將額外的插入添加到您的存儲過程? –

+0

在觸發器中,錯誤太多,我認爲我的語法錯誤..任何信息!? –

回答

1

要添加更多的行,您可以使用SELECTED表。

這是一個在您的交易中插入行的特殊表。

一個例子是:

INSERT INTO dbo.term_prop VALUES 
    SELECT * FROM inserted 

所以你不能每行的。

你觸發的正確定義將是

CREATE TRIGGER triggername ON table AFTER INSERT 
AS BEGIN 

END 
+0

對不起,你可以得到更清晰的..我無法理解:/ –

+0

@AmeenChaabani:首先 - 你見過你的觸發定義?隨我的改變。 –

+0

CREATE TRIGGER EnterValue ON dbo.term_prop AFTER INSERT AS BEGIN \t 「我應該把她插入的行數據」 END GO –

0

喬的回答是一個很好的,這更是一個建議。

避免觸發器,它們可能會導致維護噩夢:維護和調試技巧。 如果您希望在插入第一個表後將表插入另一個表中,只需將該代碼放入同一個SP中即可。

如果你需要一個自動生成的身份價值,你可以做到這一點通過使用@@身份或SCOPE_IDENTITY()或IDENT_CURRENT()。

儘量保持簡單。

0

哇,我仍然驚訝的是觸發器都獲得了壞包!我很久以前寫了十餘篇文章對他們...

就像生活中的任何事情,使用觸發器視情況而定。

1 - 觸發器非常適合跟蹤DDL變化。誰改變了這張桌子?

http://craftydba.com/?p=2015

2 - 觸發器可以跟蹤DML更改(插入,更新,刪除)。但是,在大型交易數量較大的表上,它們可能會減慢處理速度。

http://craftydba.com/?p=2060

然而,今天的硬件,什麼是我慢可能不適合你慢。

3 - 觸發器非常適合跟蹤登錄和/或服務器更改。

http://craftydba.com/?p=1909

所以,讓我們回到中心,並談談你的情況。

你爲什麼要努力讓自己在剛插入操作重複的項目?

其他選項右出SQL Server引擎來解決這個問題,主要有:

1 - 通過自定義作業從表1將數據移動到表2。 「Insert into table 1 select * from table 2 where etl_flag = 0;」。當然,在插入完成後進行交易並更新標誌。我只是考慮插入W/O刪除或更新。

2 - 如果你想跟蹤只是改變了,檢查了變更數據捕獲。它從事務日誌中讀取。它不如觸發器那麼快,即 - 不會爲每個記錄觸發。只需在後臺運行SQL代理作業即可加載cdc.tables。

3 - 中的數據複製從一個server1.database1.table1到server2.database2.table2。

ETC ...

我希望我的帖子提醒大家,這種情況決定了解決方案。

觸發器是在某些情況良好,否則,他們將被從產品很久以前刪除。

如果情況改變,那麼解決方案可能不得不改變...

相關問題