SQL 触发器更新视图中的多个列

Posted

技术标签:

【中文标题】SQL 触发器更新视图中的多个列【英文标题】:SQL Trigger to update multiple columns in a View 【发布时间】:2015-11-18 10:49:15 【问题描述】:

我有一个更新列的值格式的触发器,但我想让它在视图而不是表中的多个列上更新。

触发器;

CREATE TRIGGER [dbo].[TriigerName]
ON [dbo].[Table]
AFTER INSERT
AS
BEGIN
UPDATE 
    t
SET 
 t.ColName = dbo.FunctionName(i.ColName)
FROM 
    dbo.table t
INNER JOIN 
    inserted i
    ON
    i.PrimaryId = t.PrimaryId
END

我尝试在SET 下添加第二个t.colName = dbo.FunctionName(i.colName),但没有奏效。查询已运行,​​但未更新第二列中的值。

如何修改此触发器以使其在视图上运行?

谢谢

编辑 1: 我收到此错误; View or function 't' is not updatable because the modification affects multiple base tables. 我也将AFTER INSERT 更改为INSTEAD OF INSERT

【问题讨论】:

更新 t.ColName 两次? 【参考方案1】:

我认为你的错误信息是正常的。我猜你的观点是基于多个表

对连接视图的任何 INSERT、UPDATE 或 DELETE 操作一次只能修改一个基础基表。

查看此链接:

http://docs.oracle.com/cd/B10501_01/server.920/a96521/views.htm#391

【讨论】:

【参考方案2】:

正如user3238101所说,你不能用一个语句更新2个不同的表,所以你需要做2个语句。

CREATE TRIGGER [dbo].[TriigerName]
ON [dbo].[Table]
AFTER INSERT
AS
BEGIN
    UPDATE 
        t
    SET 
        t.ColName = dbo.FunctionName(i.ColName)
    FROM 
        dbo.table t
    INNER JOIN 
        inserted i
        ON
        i.PrimaryId = t.PrimaryId

    UPDATE 
        t
    SET 
        t.ColName2 = dbo.FunctionName2(i.ColName2)
    FROM 
        dbo.table t
    INNER JOIN 
        inserted i
        ON
        i.PrimaryId = t.PrimaryId
END

【讨论】:

以上是关于SQL 触发器更新视图中的多个列的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 触发器插入/更新特定列

如何在更新单独表中的列的视图上创建触发器?

在配置触发器时更新表中的列时出现错误

SQL视图&触发器

如何为没有已知列的 PostgreSQL 视图编写通用更新触发器?

Postgres视图中的默认值,触发代替更新