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

时间:2015-11-18 10:49:15

标签: sql sql-server triggers views

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

触发器;

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

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

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

由于

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

2 个答案:

答案 0 :(得分:1)

我认为您的错误消息是正常的。我猜您的观点基于多个表格

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

检查此链接:

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

答案 1 :(得分:1)

正如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