【问题标题】:Creating a trigger that replaces a null with a specific value after inserts创建一个触发器,在插入后用特定值替换空值
【发布时间】:2016-10-13 06:30:47
【问题描述】:

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

例如。每次插入“1”时,插入和更新后都会出现“2”。

此触发器最终会在新插入后将列下的每一行更新为“2”,而不仅仅是插入的新行:

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

感谢任何帮助。

【问题讨论】:

  • 您需要发布您的架构。表的主键是什么?
  • 此表的主键是 ProductID。

标签: sql-server database-trigger


【解决方案1】:

因此,您需要了解和使用触发器中的插入和删除集合。您当前的触发器正在执行您告诉它的操作...在每次插入和更新时,如果它们等于 1,则在整个表中将所有 MakeFlag 值设置为 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,将一列替换为 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 触发器执行类似的操作。

只是一些想法供你思考。

【讨论】:

  • 谢谢!这很有帮助。
猜你喜欢
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 2013-01-21
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
相关资源
最近更新 更多