2012-11-13 269 views
1

我已經在SQL Server 2008中創建了一個視圖,該視圖由加入大約5個不同的表以訪問我需要的數據組成。更新觸發器SQL Server 2008

我將如何創建更新觸發器來更新此視圖中的字段?因此,例如,如果我想更新所有的名字,彼得,如果姓氏是史密斯。

If Fname = peter 
update Sname to Smith 
end if 

提前感謝

UPDATE 這是我迄今爲止

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

END 
GO 
+1

你到目前爲止嘗試過什麼,你有什麼具體問題?你有沒有讀過關於在視圖上創建觸發器的[文檔說明](http://msdn.microsoft.com/zh-cn/library/ms189799(v=sql.100).aspx)? – Pondlife

+0

嗨Pondlife,我用我試過的代碼更新了我的問題,但它顯示一個錯誤,說它可以找到我的視圖'ViewCustomer'。 「對象'ViewCustomer'不存在或對此操作無效。」 – Annoscia

+0

你能告訴我們View'ViewCustomer'嗎? – Parado

回答

3

這應該做的工作。

表和視圖定義。

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爲 '史密斯'

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

Here是它的一個SQLFiddle。