在 SQL 服务器的视图上创建触发器的差异

Difference in creating triggers on views in SQL Server

我正在使用 SQL Server 2012。

视图定义为:

create view dbo.emp
as
   select 
       e.eid, e.enm, p.fnm, p.lnm 
   from 
       employee e 
   inner join 
       person p on e.eid = p.id
go

第一个触发器定义是:

CREATE trigger emptrgg on emp
instead of insert 
as
begin 
    insert into person(id, fnm, lnm)
       select 
           id, fnm, lnm 
       from inserted

    insert into employee(eid, enm)
       select 
           eid, enm 
       from inserted
end

触发器#2(与触发器#1相同,但值是通过参数插入的)

CREATE TRIGGER emptrgg
ON emp
INSTEAD OF INSERT
AS
BEGIN
     DECLARE @ID INT, @FName NVARCHAR(25), @LName NVARCHAR(25), @PID INT,
@EmNum NVARCHAR(15)

     SELECT @ID = eid, @FName =fnm, @LName = lnm
     FROM inserted

     INSERT INTO Person(Id, fnm, lnm)
     VALUES(@ID, @FName, @LName)

     INSERT INTO Employee(eid, enm)
     VALUES(@PID, @ENum)
 end

以上哪个效率高或者性能好?

我不知道,你能帮我解决这个问题吗?

此致, 乔.

您的触发器 #2 有一个 MAJOR 缺陷,因为您认为它会被调用 每行一次 - 即 不是这种情况。

触发器将在每个语句中触发一次,因此如果您的INSERT语句影响 25 行,您将触发触发器一次,但是 Inserted 伪 table 将包含 25 行。

您的代码 select 将在这 25 行中的哪一行??

SELECT @ID = eid, @FName = fnm, @LName = lnm 
FROM inserted

它是不确定的 - 您将得到任意一行并忽略所有其他 24 行。

仅使用触发器 #1 它使用正确的、基于集合的方法一次处理多个插入的行。由于它是基于集合的,因此它也非常适合性能。