创建一个触发器,在插入后用特定值替换null

时间:2016-10-12 21:09:25

标签: sql-server database-trigger

我试图创建一个触发器,它将替换插入具有另一个特定值的特定列的特定值。

实施例。每次' 1'插入,' 2'将在插入和更新后占据它的位置。

此TRIGGER最终将列下的每一行更新为' 2'在新插入之后,而不是JUST插入的新行:

CREATE TRIGGER trg_MakeFlag
ON Production.Product
AFTER INSERT, UPDATE AS
    BEGIN
    UPDATE Production.Product
    SET MakeFlag = '2'
    WHERE MakeFlag = '1'
END

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

因此,您需要了解并在触发器中使用插入和删除的集合。您当前的触发器正在完成您所告知的操作...在每次插入和更新时,如果整个表中的ALL MakeFlag值等于1,则将其设置为2。没有任何地方可以限制“仅受影响的行”。

所以你真的需要更像这样的东西:

CREATE TRIGGER trg_MakeFlag
ON Production.Product
AFTER INSERT, UPDATE AS
    BEGIN
    UPDATE p
       SET MakeFlag = '2'
      FROM Production.Product p
           INNER JOIN inserted i ON p.ProductID = i.ProductID
     WHERE MakeFlag = '1'
END

在这里,您将使用插入的集合(即插入的行或更新后的“更新后”值)加入表,以仅影响特定行,而不是所有行。

当然,这里还有一个问题。你有一个触发器在一个给定的表更新后触发,然后更新该表...这听起来像是递归给我的。可能不是最好的主意。

您可能希望查看创建两个INSTEAD OF触发器,一个用于插入,一个用于更新,这基本上对插入的集合执行INSERT或UPDATE,将一个列替换为2,其中它为1(使用CASE声明)。

这看起来像这样:

CREATE TRIGGER trg_MakeFlag
ON Production.Product
AFTER INSERT AS
BEGIN
    INSERT INTO Production.Product (ProductID, MakeFlag, column3, column4, etc...)
        SELECT ProductID,
               CASE WHEN i.MakeFlag = 1 THEN 2 ELSE i.MakeFlag END,
               column3,
               column4, 
               ...
          FROM inserted;
END

你必须列出所有列(将实名放在那里代替column3,column4等......)并确保在SELECT FROM插入的同一顺序中选择所有相同的列。 CASE语句具有将每1个插入转换为2的神奇功能,同时保留所有其他值。

您可以使用INSTEAD OF UPDATE触发器执行类似操作。

只是一些想法让你思考。