我试图创建一个触发器,它将替换插入具有另一个特定值的特定列的特定值。
实施例。每次' 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
感谢任何帮助。
答案 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触发器执行类似操作。
只是一些想法让你思考。