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



我正在尝试创建一个触发器,将替换插入到特定列中的特定值与另一个特定值。

交货。每次插入一个'1',一个'2'就会在insert和Update之后占据它的位置。

这个TRIGGER最终会在新插入后将列下的每一行更新为'2',而不仅仅是插入的新行:

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

因此,您需要了解并使用触发器中插入和删除的集合。你现在的触发点正在做你让它做的事情……在每次插入和更新时,如果整个表中的所有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

在这里,您将表与插入的集合(即正在插入的行,或更新后的'after update'值)连接起来,只影响特定的行,而不是所有行。

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

您可能想要创建两个INSTEAD OF触发器,一个用于插入,一个用于更新,它基本上对插入的集合进行INSERT或UPDATE操作,将1列替换为2列(使用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触发器做类似的事情。

只是一些想法供你思考。

最新更新