【问题标题】:Instead of trigger to update view with multiple tables而不是触发器来更新具有多个表的视图
【发布时间】:2013-09-01 06:38:43
【问题描述】:

我正在尝试查找如何使用而不是触发器更新多个表上的视图的示例。

也就是说,我想更新这个视图从中选择的多个表。

我找不到任何示例。如果有人能告诉我如何做到这一点,那就太好了。

【问题讨论】:

  • 您使用的是什么 RDBMS(SQL Server、Oracle、Postgres...)?

标签: sql-server view triggers sql-update


【解决方案1】:

假设您在这里使用的是 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演示

【讨论】:

  • 非常感谢。你能向我解释一下它是语句而不是行范围的后果吗?
  • @AllenHo 不客气 :) 您在触发器中的所有处理都应该面向设置。您不能指望虚拟表中只有一行(插入、删除)进行处理。
猜你喜欢
  • 2012-03-02
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 2012-08-29
  • 1970-01-01
相关资源
最近更新 更多