更新触发器 SQL Server 2008

Posted

技术标签:

【中文标题】更新触发器 SQL Server 2008【英文标题】:Update Trigger SQL Server 2008 【发布时间】:2012-11-13 14:51:30 【问题描述】:

我在 SQL Server 2008 中创建了一个视图,其中包含大约 5 个不同的表的连接以访问我需要的数据。

如何创建更新触发器来更新此视图中的字段?例如,如果我想在姓氏是 smith 的情况下将所有名字更新为 peter。

If Fname = peter
update Sname to Smith
end if

在此先感谢

更新 这就是我目前所拥有的

CREATE TRIGGER SurName
   ON  ViewCustomer
   AFTER UPDATE
AS 
if FName= 'Peter'
BEGIN
    update ViewCustomer set SName= 'Smith'
    SET NOCOUNT ON;

END
GO

【问题讨论】:

到目前为止,您尝试了哪些方法,遇到了什么具体问题?您是否阅读过 documentation says 关于在视图上创建触发器的内容? 嗨 Pondlife,我已经用我尝试过的代码更新了我的问题,但它显示一个错误,说它可以找到我的视图“ViewCustomer”。 "对象 'ViewCustomer' 不存在或对该操作无效。" 你能给我们看看ViewCustomer吗? 您需要使用instead of trigger并根据虚拟表“插入”和“删除”中的行更新基础表 正如我所说,您是否阅读过文档中关于向视图添加触发器的内容?它明确指出只能在视图上创建 INSTEAD OF 触发器,因此您不应期望 AFTER 触发器起作用。如果将触发器重写为INSTEAD OF 触发器会发生什么?您是否还阅读了 has to say 关于可更新视图的文档? 【参考方案1】:

这应该可以完成工作。

表和视图定义。

CREATE TABLE Customer
  (ID int,
   FName varchar(200),
   SName varchar(200),
   RoleID int);

CREATE TABLE CustomerRole
 (RID int,
  Name varchar(100));

CREATE VIEW ViewCustomer AS
SELECT *
FROM Customer JOIN CustomerRole on RoleID = RID;

触发器定义。

CREATE TRIGGER ViewCustomerTrigger ON ViewCustomer
INSTEAD OF UPDATE
AS
BEGIN
SET NOCOUNT ON

UPDATE Customer 
SET FName = I.FName,
    SName = CASE I.FName WHEN 'Peter' THEN 'Smith' ELSE I.SName END,
    RoleID = I.RoleID
FROM INSERTED I JOIN Customer C ON I.ID = C.ID

UPDATE CustomerRole
SET Name = I.Name
FROM INSERTED I JOIN CustomerRole R ON I.RID = R.RID
END
GO

样本数据

INSERT INTO Customer (ID, FName, SName, RoleID)
VALUES (1, 'John', 'Wayne', 1);

INSERT INTO Customer (ID, FName, SName, RoleID)
VALUES (2, 'Jack', 'Jackson', 1);

INSERT INTO CustomerRole (RID, Name)
VALUES (1, 'Manager');

此更新将导致触发器将 SName 更新为“Smith”

UPDATE ViewCustomer
SET FName = 'Peter'
WHERE ID = 1

Here 是它的 SQLFiddle。

【讨论】:

【参考方案2】:

您需要为视图创建一个 INSTEAD OF 触发器。您可以查看:

http://msdn.microsoft.com/en-us/library/ms188601.aspx

【讨论】:

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

如何:使用 SQL Server 2008 为自动更新修改日期创建触发器

在 SQL Server 2008 R2 中为每个表创建创建触发器

如何将一个触发器写入 SQL Server 2008 的所有表

SQL server 2008创建触发器实例

SQL Server2008 触发器中,根据一个表修改另外一个表

日志触发器(更新前)- SQL Server