【问题标题】:Update data during insert in a Trigger and then insert在触发器中插入期间更新数据,然后插入
【发布时间】:2013-05-16 01:17:21
【问题描述】:

我的情况是,我在一个表中有 10 列。我从程序中插入 5 列,对于 5 列,我想创建一个触发器。可能吗?如果是,我该怎么做?

col1 col2 col3 col4 col5 col6 col7 col8 col9 col10

CREATE TRIGGER Fill_Trigger
   ON  DB 
   AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for trigger here
    DECLARE @COL6 INT
    DECLARE @COL7 INT -- and so on.


   SET @COL6 = (SELECT COL1 FROM inserted) * (SELECT COL2 FROM inserted)
   SET @COL7 = (SELECT COL3 FROM inserted) * (SELECT COL4 FROM inserted)

   --Is it possible to do the following?
  UPDATE inserted SET COL6 = @COL6
  UPDATE inserted SET COL7 = @COL7
END
GO

【问题讨论】:

    标签: sql-server triggers


    【解决方案1】:

    您不应在触发器中使用局部变量,因为它会使其“仅单行”

    另外,我假设您有一个名为 KeyColumn 的主键。你的表被称为“DB”。

    CREATE TRIGGER Fill_Trigger
       ON DB 
       AFTER INSERT
    AS 
    BEGIN
       SET NOCOUNT ON;
    
       UPDATE DB
       SET
           Col6 = I.COL1 * COL2,
           Col7 = I.COL3 * COL4
       FROM
           DB
           JOIN
           INSERTED I ON DB.KeyColumn = I.KeyColumn;
    END
    GO
    

    但是,有些列是基于其他列的,我会使用 COMPUTED columns 而没有触发器

    CREATE TABLE MyTable (
        KeyColumn ...,
        Col1 ...,
        Col2 ...,
        Col3 ...,
        Col4 ...,
        Col5 ...,
    
        Col6 AS Col1 * Col2,
        Col7 AS Col3 * Col4,
        Col8 AS ...
    
        );
    

    【讨论】:

    • 我没有得到这部分“你不应该在触发器中使用局部变量,因为它使它成为“仅单行””,你能解释一下吗?因为我在这个触发器中做了很多事情,我需要使用变量。我也在调用 CLR 函数。
    • 如果你插入 2+ 行,那么你不知道变量会得到什么值。它将来自任何一行。这对于触发器来说听起来太复杂了。
    • 我在 OP 中的示例只是一个示例。我这里有一点复杂的计算。
    • 仅当您插入一行时。
    • 是的,一次是 1 行。非常感谢您的帮助。
    猜你喜欢
    • 2015-11-06
    • 2016-10-13
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    相关资源
    最近更新 更多