2013-12-12 67 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 ...

我希望我的帖子提醒大家,这种情况决定了解决方案。

触发器是在某些情况良好,否则,他们将被从产品很久以前删除。

如果情况改变,那么解决方案可能不得不改变...

相关问题