创建触发器以在另一个表中插入行

时间:2013-12-12 14:39:00

标签: sql sql-server datatrigger

在表“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;

它显示错误

3 个答案:

答案 0 :(得分:1)

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

这是一个特殊的表格,其中填充了在您的交易中插入的行。

一个例子是:

  INSERT INTO dbo.term_prop VALUES
  SELECT * FROM inserted

所以你不能使用FOR EACH ROW。

触发器的正确​​定义是

CREATE TRIGGER triggername ON table AFTER INSERT
AS BEGIN

END

答案 1 :(得分:0)

Joe回答很好,这是一个更好的建议。

避免触发,它们可能导致维护噩梦:是维护和调试的技巧。 如果要在插入第一个表后插入另一个表中的表,只需将该代码放在同一个SP中。

如果您需要自动标识生成的值,可以使用@@ identity或scope_identity()或ident_current()来完成。

尽量保持简单。

答案 2 :(得分:0)

哇,我仍然感到惊讶的是,触发器被赋予糟糕的包裹!我很久以前就写了十几篇文章......

与生活中的任何事物一样,触发器的使用取决于具体情况。

1 - 触发器非常适合跟踪DDL更改。谁改变了那张桌子?

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

2 - 触发器可以跟踪DML更改(插入,更新,删除)。但是,在具有大事务编号的大型表上,它们可能会降低处理速度。

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

然而,对于今天的硬件,对我来说缓慢的事情对你来说可能并不慢。

3 - 触发器非常适合跟踪登录和/或服务器更改。

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

所以,让我们回到中心,谈谈你的情况。

您为什么要尝试仅对插入操作进行重复输入?

SQL Server Engine解决此问题的其他选项是:

1 - 通过自定义作业将数据从表1移动到表2。 “插入表1,从表2中选择*,其中etl_flag = 0;”。当然使它成为事务性的并在插入完成后更新标志。我只是考虑插入没有删除或更新。

2 - 如果您只想跟踪更改,请查看更改数据捕获。它从事务日志中读取。它不像触发器那样瞬间,即 - 不会为每个记录触发。只需在后台作为SQL代理作业运行即可加载cdc.tables。

3 - 将数据从一个server1.database1.table1复制到server2.database2.table2。

ETC ......

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

触发器在某些情况下很好,否则,它们很久以前就会从产品中删除。

如果情况发生变化,那么解决方案可能需要改变......

相关问题