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 触发器更新视图中的多个列的主要内容,如果未能解决你的问题,请参考以下文章