2013-09-01 41 views
2

我想找到一个如何更新多个表使用而不是触发器的视图的示例。而不是触发器更新与多个表的视图

这就是我想更新多个表,该视图选择。

我找不到任何例子。如果有人能告诉我如何做到这一点会很棒。

+1

什么RDBMS(SQL服务器,Oracle,Postgres的,...)您使用的? – peterm

回答

3

假设你正在使用的SQLServer这里是一个过于简单化例如

CREATE TABLE persons 
(personid int, 
firstname varchar(32), 
lastname varchar(32)); 

CREATE TABLE employees 
(employeeid int, 
personid int, 
title  varchar(32)); 

CREATE VIEW vwEmployees AS 
SELECT p.personid, employeeid, firstname, lastname, title 
    FROM employees e JOIN persons p 
    ON e.personid = p.personid; 

CREATE TRIGGER tgEmployeesInsert ON vwEmployees 
INSTEAD OF INSERT AS 
BEGIN 
    INSERT INTO persons (personid, firstname, lastname) 
    SELECT personid, firstname, lastname 
    FROM INSERTED 

    INSERT INTO employees (employeeid, personid, title) 
    SELECT employeeid, personid, title 
    FROM INSERTED 
END; 

INSERT INTO vwEmployees (personid, employeeid, firstname, lastname, title) 
VALUES(1, 1, 'Jhon', 'Doe', 'SQL Developer'); 

注:在现实中,你最肯定要处理IDENTITY列在SQL Server中的触发器的事实语句而不是行范围。

这里是SQLFiddle演示

+0

非常感谢。你可以向我解释一下,与行范围相比,它的陈述的分歧是什么? – TheWommies

+0

@AllenHo你非常欢迎:)所有在触发器中的处理都应该设置为导向。你不能指望在虚拟表中只有一行(插入,删除)进行处理。 – peterm