在 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 ! 它使用正确的、基于集合的方法一次处理多个插入的行。由于它是基于集合的,因此它也非常适合性能。
我正在使用 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 ! 它使用正确的、基于集合的方法一次处理多个插入的行。由于它是基于集合的,因此它也非常适合性能。