sql触发器after
㈠ sql 触发器 instead of 和 after
create
trigger
mytrg
on
表名
instead
of
insert
as
declare
@myii
begin
select
@myii=count
from
inserted
if(@myii>0)
insert
into
表名
select
*
from
inserted
else
begin
--这里执行你说的"满足条件是触发"的事情
--范例中是count<=0执行的操作,这里我是不执行插入,所以什么都不需要写
end
end
--以上范例是当count
列的值是>0的值就执行插入新数据,否则不执行插入的范例
用update是一样的,假设表结构是
表(id[主键],count,c1,c2,c3,c4)
数据类型都是int
代码如下:
create
trigger
mytrg
on
表名
instead
of
update
as
declare
@myii
int,@id
int,@c1
int,@c2
int,@c3
int,@c4
int
begin
select
@myii=count,@id=id,@c1=c1,@c2=c2,@c3=c3,@c4=c4
from
inserted
if(@myii>0)
update
表名
set
count=@myii,c1=@c1,c2=@c2,c3=@c3,c4=@c4
where
id=@id
--如果你再要更新其他字段,必须在这一个触发器实现,所以这个范例是你更新任意字段(除id)
else
begin
--这里执行你说的"满足条件是触发"的事情
--范例中是count<=0执行的操作,这里我是不执行更新,所以什么都不需要写
end
end
--楼主说的死循环是不是你错误的理解了instead
of
--首先,instead
of触发器是执行前触发器,当执行操作触发时,所执行的任务是不执行的,只有在你的触发器里执行相应的插入或者更新操作,而触发器本身的任务执行是不存在触发本身的,所以不存在死循环
㈡ SQL触发器的种类
楼主,你好!
触发器的种类
有:
SQL
Server
2000
支持两种类型的触发器:AFTER
触发器和INSTEAD
OF
触发器。其中AFTER
触发器即为SQL
Server
2000
版本以前所介绍的触发器。该类型触发器要求只有执行某一操作(INSERT
UPDATE
DELETE)
之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER
触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder
来完成此任务。
INSTEAD
OF
触发器表示并不执行其所定义的操作(INSERT、
UPDATE、
DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD
OF
触发器,也可以在视图上定义INSTEAD
OF
触发器,但对同一操作只能定义一个INSTEAD
OF
触发器
希望能帮助到你!
㈢ 请问在sqlserver中什么是前触发型触发器,什么是后触发型触发器,怎么区分呢
前触发器:指在执行INSERT,UPDATE,DELETE之前去触发【触发器】要执行的语句
后触发器:指在执行INSERT,UPDATE,DELETE之后再去触发【触发器】要执行的语句。
比如一个update触发器,要执行删除操作。
那么有两种情况,第一先update在delete(后触发器)
第二先delete在update(前触发器)
㈣ 我想问下SQL 2005中的触发器的for,instead of,after3种触发器的区别~
FOR | AFTER
AFTER 指定触发器仅在触发 SQL 语句中指定的所有操作都已成功执行时才被触发。所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。
如果仅指定 FOR 关键字,则 AFTER 为默认值。
不能对视图定义 AFTER 触发器。
INSTEAD OF
指定执行 DML 触发器而不是触发 SQL 语句,因此,其优先级高于触发语句的操作。
如果仅指定 FOR 关键字,则 AFTER 为默认值。
也就是说, FOR = AFTER。
下面是一个触发器的例子:
-- 创建测试主表.
CREATE TABLE test_main (
id INT,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 创建测试子表.
CREATE TABLE test_sub (
id INT,
main_id INT,
value VARCHAR(10),
PRIMARY KEY(id)
);
-- 创建外键.
ALTER TABLE test_sub
ADD CONSTRAINT main_id_cons
FOREIGN KEY (main_id) REFERENCES test_main;
-- 创建 FOR 触发器.
CREATE TRIGGER InsertTest
ON test_sub
FOR INSERT
AS
BEGIN
PRINT('INSERT test_sub!');
END;
Go
INSERT INTO test_sub VALUES( 100,100,'100');
消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 FOREIGN KEY 约束"main_id_cons"冲突。该冲突发生于数据库"TestDev",表"dbo.test_main", column 'id'。
语句已终止。
从上面的结果可以看到,由于外键冲突,插入失败,导致触发器也没有被执行。
-- 修改为 AFTER 触发器.
ALTER TRIGGER InsertTest
ON test_sub
AFTER INSERT
......
INSERT INTO test_sub VALUES( 100,100,'100');
消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 FOREIGN KEY 约束"main_id_cons"冲突。该冲突发生于数据库"TestDev",表"dbo.test_main", column 'id'。
语句已终止。
可以看到,AFTER 运行结果与 FOR 一样。
-- 修改为 INSTEAD OF 触发器.
ALTER TRIGGER InsertTest
ON test_sub
INSTEAD OF INSERT
......
INSERT INTO test_sub VALUES( 100,100,'100');
INSERT test_sub!
(1 行受影响)
从上面的结果看到,触发器被执行了。
但是 test_sub 中并没有 100,100,'100' 的数据。
原因在于:
INSTEAD OF 指定执行 DML 触发器而不是触发 SQL 语句
也就是说 当你的触发器是 INSTEAD OF INSERT 的时候
你的 INSERT 语句,将直接执行这个触发器
而不是等你 INSERT 语句执行完了,数据写到表里面了以后,才触发。
㈤ SQL触发器中怎么给变量赋值
declare @Cnumber int;----销售商品的数量\x0d\x0a declare @Cid varchar(50);----库存里面商品的ID\x0d\x0a--给需要减少的商品的数量赋一个初始值,确保在重新赋值时不会出错\x0d\x0a\x0d\x0aSET @Cnumber = 0\x0d\x0a--给商品的编号赋赋一个初始值\x0d\x0aSET @Cid = '1'\x0d\x0a--如果不赋个初始值,在从inserted中获取并赋值时会出现值为NULL的情况\x0d\x0a\x0d\x0a--获取需要减少的商品的数量和商品的编号\x0d\x0a\x0d\x0aSELECT @Cnumber = Cnumber,@Cid = Cid FROM inserted\x0d\x0a--接下来的更新操作就是按照你原来的去更新就行了\x0d\x0a\x0d\x0a update Commodity---商品库存 set Cnumber=Cnumber-@Cnumber where Cid=@Cid\x0d\x0a\x0d\x0a--也可以这样更新\x0d\x0aUPDATE Commodity SET Cnumber = Cnumber - Cnumber\x0d\x0aFROM\x0d\x0a Commodity AS T\x0d\x0aINNER JOIN\x0d\x0a inserted AS T1\x0d\x0aON\x0d\x0a T.Cid = T1.Cid\x0d\x0a--这样可以批量更新,那么针对一条数据进行更新是没问题的,同事也省去了声明变量一级变量赋值的步骤
㈥ SQl中触发器怎样执行的
创建触发器 是特殊的存储过程,自动执行,一般不要有返回值。
1、后触发器 (AFTER,FOR)先执行对应语句,后执行触发器中的语句。
2、前触发器 并没有真正的执行触发语句(insert,update,delete),而是执行触发后的语句。
3、行级触发器 (FOR EACH ROW) 在SQL server 中不存在。
(6)sql触发器after扩展阅读:
创建触发的语法
CREATE TRIGGER trigger_name --触发器名称
ON table_name --触发的表
[WITH ENCRYPTION]
FOR [DELETE, INSERT, UPDATE] --选择触发器类型
AS --触发后要做的语句
T-SQL语句
GO --结束标记
㈦ 关于sql触发器调试问题
在sql中,触发器是一种特殊类型的存储过程,它不同于sql的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如update、
insert、
delete
这些操作时,sql
server
就会自动执行触发器所定义的sql
语句,从而确保对数据的处理必须符合由这些sql
语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:
(1)强化约束(enforce
restriction)
触发器能够实现比check
语句更为复杂的约束。
(2)跟踪变化(auditing
changes)
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
(3)级联运行(cascaded
operation)。
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。
(4)存储过程的调用(stored
procere
invocation)。
为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在dbms(
数据库管理系统)本身之外进行操作。
由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(insert、
update、
delete)的多个触发器能够对同一种数据操作采取多种不同的处理。
总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。
触发器的种类
sql
server
2000
支持两种类型的触发器:after
触发器和instead
of
触发器。其中after
触发器即为sql
server
2000
版本以前所介绍的触发器。该类型触发器要求只有执行某一操作(insert
update
delete)
之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于after
触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder
来完成此任务。
instead
of
触发器表示并不执行其所定义的操作(insert、
update、
delete),而仅是执行触发器本身。既可在表上定义instead
of
触发器,也可以在视图上定义instead
of
触发器,但对同一操作只能定义一个instead
of触发器。
㈧ SQL中触发器有什么作用
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。x0dx0a 触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。x0dx0a 触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。x0dx0a触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。x0dx0a SQL Server 包括三种常规类型的触发器:DML 触发器、DDL 触发器和登录触发器。x0dx0a 语法为:x0dx0a CREATE TRIGGER `
㈨ sql2000支持before 和 after吗
不支持before,可以用instead of 来替代,不过用法有很大的区别。
SQL Server 2000 支持两种类型的触发器:
AFTER 触发器和INSTEAD OF 触发器。
FOR触发器不是before,SQL Server只有INSTEAD OF和AFTER 两种触发器。默认识AFTER 的,所以说 FOR触发器就是AFTER 触发器。
<1>AFTER 触发器
AFTER 触发器即为SQL Server 2000 版本以前所介绍的触发器。该类型触发器要求只有执行某一操作(INSERT UPDATE DELETE) 之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER 触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder 来完成此任务。
<2>INSTEAD OF触发器
INSTEAD OF 触发器表示并不执行其所定义的操作(INSERT、 UPDATE、 DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器,但对同一操作只能定义一个INSTEAD OF 触发器。
<3>异同点
<3.1>After触发器只能用于数据表中,Instead Of触发器可以用于数据表和视图上,但两种触发器都不可以建立在临时表上。
<3.2>一个数据表可以有多个触发器,但是一个触发器只能对应一个表。
<3.3>在同一个数据表中,对每个操作(如Insert、Update、Delete)而言可以建立许多个After触发器,但Instead Of触发器针对每个操作只有建立一个。
<3.4>如果针对某个操作即设置了After触发器又设置了Instead Of触发器,那么Instead of触发器一定会激活,而After触发器就不一定会激活了。
㈩ SQL触发器怎么用
在SQL中,触发器是一种特殊类型的存储过程,它不同于SQL的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:
(1)强化约束(Enforce restriction)
触发器能够实现比CHECK 语句更为复杂的约束。
(2)跟踪变化(Auditing changes)
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
(3)级联运行(Cascaded operation)。
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。
(4)存储过程的调用(Stored procere invocation)。
为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。
由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、 UPDATE、 DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理。
总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。
触发器的种类
SQL Server 2000 支持两种类型的触发器:AFTER 触发器和INSTEAD OF 触发器。其中AFTER 触发器即为SQL Server 2000 版本以前所介绍的触发器。该类型触发器要求只有执行某一操作(INSERT UPDATE DELETE) 之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER 触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder 来完成此任务。
INSTEAD OF 触发器表示并不执行其所定义的操作(INSERT、 UPDATE、 DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器,但对同一操作只能定义一个INSTEAD OF触发器。