【问题标题】:Create a Trigger to insert a rows in another table创建触发器以在另一个表中插入行
【发布时间】:2013-12-31 00:50:22
【问题描述】:

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

它显示了一个错误

【问题讨论】:

  • 另外,为什么不将额外的插入添加到您的存储过程中?
  • 在触发器中,错误太多,我认为我的语法错误.. 任何信息!?
  • 我想作为触发器来解决。。不知道语法对错

标签: sql sql-server datatrigger


【解决方案1】:

哇,我仍然很惊讶触发器被赋予了糟糕的包装!我很久以前就写过十几篇文章了……

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

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。 “插入表 1 中选择 * from table 2 where etl_flag = 0;”。当然,让它成为事务性的,并在插入完成后更新标志。我只是考虑插入没有删除或更新。

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

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

等...

希望我的帖子能提醒大家,形势决定解决方案。

触发器在某些情况下很好用,否则它们早就从产品中删除了。

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

【讨论】:

    【解决方案2】:

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

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

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

    尽量保持简单。

    【讨论】:

      【解决方案3】:

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

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

      一个例子是:

        INSERT INTO dbo.term_prop VALUES
        SELECT * FROM inserted
      

      所以你不能使用 FOR EACH ROW。

      触发器的正确​​定义是

      CREATE TRIGGER triggername ON table AFTER INSERT
      AS BEGIN
      
      END
      

      【讨论】:

      • 对不起,你能说的更清楚点吗..我听不懂:/
      • @AmeenChaabani:首先 - 你看到你的触发器定义了吗?用我的改变。
      • CREATE TRIGGER EnterValue ON dbo.term_prop AFTER INSERT AS BEGIN "我应该让她在行中插入数据" END GO
      • @AmeenChaabani:此代码:INSERT INTO dbo.term_prop VALUES SELECT FROM inserted 将您的 term_prop 中的所有行插入事务中的术语中。您可以更改要插入的每列的值,如示例中所示
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多