Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新触发器SQL Server 2008_Sql_Sql Server 2008_View_Triggers_Sql Update - Fatal编程技术网

更新触发器SQL Server 2008

更新触发器SQL Server 2008,sql,sql-server-2008,view,triggers,sql-update,Sql,Sql Server 2008,View,Triggers,Sql Update,我在SQLServer2008中创建了一个视图,其中包括连接大约5个不同的表以访问我需要的数据 如何创建更新触发器来更新此视图中的字段?举个例子,如果我想把所有的名字都更新为peter,如果姓氏是smith If Fname = peter update Sname to Smith end if 非常感谢 更新 这就是我目前所拥有的 CREATE TRIGGER SurName ON ViewCustomer AFTER UPDATE AS if FName= 'Peter'

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

如何创建更新触发器来更新此视图中的字段?举个例子,如果我想把所有的名字都更新为peter,如果姓氏是smith

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

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


这应该可以完成这项工作

表和视图定义

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

SQLFiddle。到目前为止,您尝试了什么?您有什么具体问题?你读过关于在视图上创建触发器的内容吗?嗨,Pondlife,我已经用我尝试过的代码更新了我的问题,但是它显示了一个错误,说它可以找到我的视图“ViewCustomer”。“对象‘ViewCustomer’不存在或对此操作无效。”能否向我们展示view
ViewCustomer
?您需要使用instead of触发器,并根据虚拟表“inserted”和“deleted”中的行更新基础表。如我所说,您是否阅读了文档中关于向视图添加触发器的说明?它明确指出,只能在视图上创建
而不是
触发器,因此您不应该期望
之后的
触发器工作。如果将触发器重新编写为
而不是
触发器,会发生什么情况?您是否也阅读了有关可更新视图的文档?