【问题标题】:Avoid column update using a SQL Server trigger避免使用 SQL Server 触发器更新列
【发布时间】:2018-07-15 18:42:38
【问题描述】:

我有一张表 Product,其中包含 iddescriptioncurrentStock 列。我想避免使用INSTEAD OF UPDATE 触发器更新currentStock

我尝试更新触发器中的所有其他列,但我无法在更新语句中引用 Inserted 伪表。

我该怎么做?有没有更好的方法避免更新currentStock 列?

CREATE TRIGGER T9 ON Product 
INSTEAD OF UPDATE
AS 
    UPDATE Product
    SET Product.id = inserted.id???? ,
        Product.description =  inserted.description??????

【问题讨论】:

    标签: sql-server tsql triggers


    【解决方案1】:

    如果适用,您可以拒绝特定列的更新:

    DENY UPDATE ON dbo.Product(currentStock) TO user_name;  --role name
    

    更新语句不能引用该列,否则会报错。

    UPDATE Product
    SET currentStock = ?
    WHERE ...;
    -- error
    
    UPDATE Product
    SET currentStock = ?
      ,description = ?
    WHERE ...;
    -- error
    
    UPDATE Product
    SET description = ?
    WHERE ...;
    -- will run successfully
    

    还有触发器:

    CREATE TRIGGER T9 ON Product INSTEAD OF UPDATE
    AS 
    UPDATE p
    SET description = i.description
    FROM Product p
    JOIN inserted i
      ON p.id = i.id;
    

    DBFiddle Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      相关资源
      最近更新 更多