可以在表或视图上指定INSTEAD OF触发器。执行这种触发器就能够替代原始的触发动作。INSTEAD OF触发器扩展了视图更新的类型。对于每一种触发动作(INSERT、UPDATE或 DELETE),每一个表或视图只能有一个INSTEAD OF触发器。
INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图。例如,通常不能在一个基于连接的视图上进行DELETE操作。然而,可以编写一个INSTEAD OF DELETE触发器来实现删除。上述触发器可以访问那些如果视图是一个真正的表时已经被删除的数据行。将被删除的行存储在一个名为deleted的工作表中,就像AFTER触发器一样。相似地,在UPDATE INSTEAD OF触发器或者INSERT INSTEAD OF触发器中,你可以访问inserted表中的新行。
不能在带有WITH CHECK OPTION定义的视图中创建INSTEAD OF触发器。
INSTEAD OF 触发器的主要优点是可以使不能更新的视图支持更新。基于多个基表的视图必须使用
INSTEAD OF 触发器来支持引用多个表中数据的插入、更新和删除操作。INSTEAD OF 触发器的另一个优点是使您得以编写这样的逻辑代码:在允许批处理的其他部分成功的同时拒绝批处理中的某些部分。
Transact-SQL 语句创建两个基表、一个视图和视图上的 INSTEAD OF 触发器。以下表将个人数据和业务数据分开并且是视图的基表。
/*在视图上定义 instead of insert 触发器以在一个或多个基表中插入数据。*/
--部门表
create table dept
(
d_id int primary key,
d_name varchar(20)
)
--员工表
create table emp
(
e_id int primary key,
e_name varchar(20),
d_id int references dept(d_id)
)
if exists(select * from sysobjects where name='v')
drop view v
go
create view v
as
select e_id,e_name,d.d_id,d_name from emp e,dept d where e.d_id=d.d_id
go
/*******************使用instead of 触发器******************/
if exists(select * from sysobjects where name='de_em_insert')
drop trigger de_em_insert
go
create trigger de_em_insert
on v
instead of insert
as
begin
if (not exists (select d.d_id from dept d, inserted i where d.d_id = i.d_id))
insert into dept select d_id,d_name from inserted
if (not exists (select e.d_id from emp e, inserted i where e.d_id = i.d_id))
insert into emp select e_id,e_name,d_id from inserted
else
update emp set e_id = i.e_id,e_name = i.e_name from emp e, inserted i where e.d_id = i.d_id
end
select * from v
insert into v values(1001,'张珊',101,'销售部')
select * from v
select * from emp
select * from dept
可以在视图或表中定义 INSTEAD OF DELETE 触发器,以代替 DELETE 语句的标准操作。通常,在视图上定义 INSTEAD OF DELETE 触发器以便在一个或多个基表中修改数据。
可在视图上定义 INSTEAD OF UPDATE 触发器以代替 UPDATE 语句的标准操作。通常,在视图上定义 INSTEAD OF UPDATE 触发器以便修改一个或多个基表中的数据。
分享到:
相关推荐
《理解SQL中的INSTEAD OF触发器》 在SQL数据库管理中,触发器是一种非常重要的对象,它允许我们在数据修改(如INSERT、UPDATE或DELETE)时执行额外的操作。特别是INSTEAD OF触发器,它是对标准触发器的一种扩展,...
从提供的文件内容中,我们可以了解到一些有关SQL Server中的INSTEAD OF触发器的知识点。触发器是数据库管理系统中的一种特殊类型的存储过程,它会在满足某种条件时自动执行。触发器通常用于在对数据表进行插入、更新...
标题"INSTEAD OF触发器1"涉及到数据库管理系统中的一个重要概念,即`INSTEAD OF`触发器。`INSTEAD OF`触发器是一种特殊的SQL触发器,它在用户尝试对数据库表或视图执行INSERT、UPDATE或DELETE操作时被触发,而不是在...
然而,一个常见的误解是将DDL触发器等同于INSTEAD OF触发器,这实际上是不准确的。 DDL触发器的运作机制实际上类似于AFTER触发器,它在DDL操作执行之后触发。这意味着当用户尝试执行一个DDL语句,如ALTER TABLE,...
今天,我们将讨论FOR INSERT与INSTEAD OF触发器。 FOR INSERT触发器 FOR INSERT触发器是指在INSERT操作完成后执行的触发器。例如,在上面的示例中,我们创建了一个名为tri_tb1的触发器,该触发器在tb1表中插入新...
INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON IF (NOT EXISTS (SELECT P.SSN FROM Person P, inserted I WHERE P.SSN = I.SSN)) INSERT INTO Person SELECT SSN,Name,Address,Birthdate,Comment FROM ...
触发器可以分为两类:INSTEAD OF触发器和AFTER触发器。 AFTER触发器,也称为FOR触发器,是在实际的数据修改操作(INSERT、UPDATE、DELETE)完成并满足所有约束条件后触发的。这意味着,一旦在表或视图上执行了相应...
在Instead of触发器中,SQL Server接收到SQL语句请求后,会先建立临时表,然后直接触发触发器,将数据操作的执行权交给触发器。而在After触发器中,服务器首先执行实际的数据修改,然后再激活触发器。 Instead of...
由于初学者通常容易混淆AFTER触发器和INSTEAD OF触发器,本文通过通俗的语言介绍了触发器,并对触发器的工作原理进行了阐述,分析了AFTER触发器与INSTEAD OF触发器的主要区别与应用,旨在帮助初学者准确快速地掌握...
这两种触发器的差别在于他们被激活的时机:Instead of 触发器用于替代引起触发器执行的 T-SQL 语句。除表之外,Instead of 触发器也可以用于视图,用来扩展视图可以支持的更新操作。After 触发器在一个 Insert,...
触发器的种类主要包括INSTEAD OF触发器和AFTER触发器。INSTEAD OF触发器用于替代原本的T-SQL语句,可以应用于表和视图。它们常用于视图更新不支持的情况下,通过INSTEAD OF触发器来扩展视图的更新功能。而AFTER...
本篇文章将重点介绍SQL Server 2005中三种类型的触发器——After触发器、数据定义语言(DDL)触发器以及Instead Of触发器的概念、工作原理及应用场景。 #### AFTER触发器 AFTER触发器是SQL Server 2005默认创建的...
在SQL Server中,主要有两种类型的DML触发器:AFTER触发器和INSTEAD OF触发器。 AFTER触发器是在数据行已经被插入、更新或删除之后执行的触发器。它是SQL Server中较传统的一种触发器类型,通常用于执行一些附加的...
AFTER触发器在数据记录更新操作(INSERT、DELETE和UPDATE)以及INSTEADOF触发器和约束之后被激发,用于检查和处理记录变化后的数据完整性。而INSTEADOF触发器则在处理约束之前被激发,特别适用于更新视图,并允许...
2. INSTEAD OF 触发器:执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。 3. FOR 触发器:相当于 AFTER 触发器,但可以选择是否指定触发器所有者名称。 三、触发器的执行顺序 触发器的执行顺序如下所...
与AFTER触发器不同,INSTEAD OF触发器在试图进行更新操作时立即执行,而不是在操作完成后。这个触发器的作用是,当尝试更新`Student_view`中的成绩时,实际上是在`sc`表中进行更新,确保了数据更改发生在正确的位置...