创建一个触发器,在插入后用特定值替换空值
Creating a trigger that replaces a null with a specific value after inserts
我正在尝试创建一个触发器,它将用另一个特定值替换插入到特定列中的特定值。
例如。每次插入“1”时,都会在插入和更新后插入“2”。
这个 TRIGGER 最终会在新插入后将列下的每一行更新为“2”,而不仅仅是插入的新行:
CREATE TRIGGER trg_MakeFlag
ON Production.Product
AFTER INSERT, UPDATE AS
BEGIN
UPDATE Production.Product
SET MakeFlag = '2'
WHERE MakeFlag = '1'
END
感谢任何帮助。
所以,你需要了解和使用触发器中插入和删除的集合。您当前的触发器完全按照您的指示执行...在每次插入和更新时,将整个 table 中的所有 MakeFlag 值设置为 2(如果它们等于 1)。在任何地方,您都不会将事情限制在 "just the rows affected".
所以你真的需要更多这样的东西:
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
在这里,您将 table 与插入的集合(插入的行,或更新后的 'after update' 值)连接起来,只影响特定的行,而不影响特定的行所有行。
当然,这里还有一个问题。您有一个触发器,它在给定 table 更新后触发,然后更新 table... 这对我来说听起来有点递归。可能不是最好的主意。
您可能想看看创建两个 INSTEAD OF 触发器,一个用于插入,一个用于更新,它基本上对 table 的插入集合执行插入或更新操作,将一列替换为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
您必须列出所有列(将真实姓名放在那里代替第 3 列、第 4 列等....)并确保 select 相同列中的所有相同列在您的 SELECT FROM 中插入订单。 CASE 语句神奇地将插入的每个 1 转换为 2,同时保留所有其他值。
您可以使用 INSTEAD OF UPDATE 触发器执行类似的操作。
只是一些想法供您思考。
我正在尝试创建一个触发器,它将用另一个特定值替换插入到特定列中的特定值。
例如。每次插入“1”时,都会在插入和更新后插入“2”。
这个 TRIGGER 最终会在新插入后将列下的每一行更新为“2”,而不仅仅是插入的新行:
CREATE TRIGGER trg_MakeFlag
ON Production.Product
AFTER INSERT, UPDATE AS
BEGIN
UPDATE Production.Product
SET MakeFlag = '2'
WHERE MakeFlag = '1'
END
感谢任何帮助。
所以,你需要了解和使用触发器中插入和删除的集合。您当前的触发器完全按照您的指示执行...在每次插入和更新时,将整个 table 中的所有 MakeFlag 值设置为 2(如果它们等于 1)。在任何地方,您都不会将事情限制在 "just the rows affected".
所以你真的需要更多这样的东西:
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
在这里,您将 table 与插入的集合(插入的行,或更新后的 'after update' 值)连接起来,只影响特定的行,而不影响特定的行所有行。
当然,这里还有一个问题。您有一个触发器,它在给定 table 更新后触发,然后更新 table... 这对我来说听起来有点递归。可能不是最好的主意。
您可能想看看创建两个 INSTEAD OF 触发器,一个用于插入,一个用于更新,它基本上对 table 的插入集合执行插入或更新操作,将一列替换为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
您必须列出所有列(将真实姓名放在那里代替第 3 列、第 4 列等....)并确保 select 相同列中的所有相同列在您的 SELECT FROM 中插入订单。 CASE 语句神奇地将插入的每个 1 转换为 2,同时保留所有其他值。
您可以使用 INSTEAD OF UPDATE 触发器执行类似的操作。
只是一些想法供您思考。