A. sql中触发器有几种,各自的语法是什么
insert
delete
update
三种
语法都差不多的
创建触发器的SQL语法
DELIMITER |
CREATE TRIGGER `<databaseName>`.`<triggerName>`
< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >
ON <tableName>
FOR EACH ROW
BEGIN
--do something
END |
B. SQL中,触发器是什么
1. 基本概念
触发器是特殊的存储过程,基于一个表创建,主要作用就是实现由主键和外键所不能保证的复杂的参照完整性和数据一致性。
当触发器所保护的数据发生变化(update,insert,delete)后,自动运行以保证数据的完整性和正确性。通俗的说:通过一个动作(update,insert,delete)调用一个存储过程(触发器)。
2. 类型
(1)DML触发器
在数据库中发生数据操作语言(DML)事件时将启用。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 T-SQL 语句。系统将触发器和触发它的语句作为可在触发器内回滚的单个事务对待,如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。
(2)DDL 触发器
SQL Server 2005 的新增功能。当服务器或数据库中发生数据定义语言(DDL)事件时将调用这些触发器。但与DML触发器不同的是,它们不会为响应针对表或视图的UPDATE、INSERT或DELETE语句而激发,相反,它们会为响应多种数据定义语言(DDL)语句而激发。这些语句主要是以CREATE、ALTER和DROP开头的语句。DDL触发器可用于管理任务,例如审核和控制数据库操作。
创建DML触发器
1. 使用存储过程模板创建存储过程
在【对象资源管理器】窗口中,展开“数据库”节点,再展开所选择的具体数据库节点,再展开“表”节点,右击要创建触发器的“表”,选择“新建触发器”命令,如图所示:
在右侧查询编辑器中出现触发器设计模板,用户可以在此基础上编辑触发器,单击“执行”按钮,即可创建该触发器。
2. 使用T-SQL语句创建表
CREATE TRIGGER 触发器
ON 表名
FOR[update,insert,delete ]
AS SQL语句
例9-6:创建基于表reader ,DELETE操作的触发器。
USE Library
GO
IF EXISTS(SELECT name FROM sysobjects
WHERE name='reader_d' AND type='TR')
DROP TRIGGER reader_d --如果已经存在触发器reader_d则删除
GO
CREATE TRIGGER reader_d --创建触发器
ON reader --基于表
FOR DELETE --删除事件
AS
PRINT '数据被删除!' --执行显示输出
GO
试试吧!
应用:
USE Library
GO
DELETE reader
where Rname='aaa'
执行结果:
数据被删除!
(所影响的行数为 1 行)
例9-7:在表borrow中添加借阅信息记录时,得到该书的应还日期。
说明:在表borrow中增加一个应还日期SReturnDate。
USE Library
IF EXISTS (SELECT name FROM sysobjects
WHERE name ='T_return_date' AND type='TR')
DROP TRIGGER T_return_date
GO
CREATE TRIGGER T_return_date --创建触发器
ON Borrow --基于表borrow
After INSERT --插入操作
AS
--查询插入记录INSERTED中读者的类型
DECLARE @type int,@dzbh char(10),@tsbh char(15)
SET @dzbh=(SELECT RID FROM inserted)
SET @tsbh=(SELECT BID FROM inserted)
SELECT @type= TypeID
FROM reader
WHERE RID=(SELECT RID FROM inserted)--副本
/*把Borrow表中的应还日期改为
当前日期加上各类读者的借阅期限*/
UPDATE Borrow SET SReturnDate=getdate()+
CASE
WHEN @type=1 THEN 90
WHEN @type=2 THEN 60
WHEN @type=3 THEN 30
END
WHERE RID=@dzbh and BID=@tsbh
应用:
USE Library
INSERT INTO borrow(RID,BID) values('2000186010','TP85-08')
查看记录:
例9-8:在数据库Library中,当读者还书时,实际上要修改表brorrowinf中相应记录还期列的值,请计算出是否过期。
USE Library
IF EXISTS(SELECT name FROM sysobjects
WHERE name='T_fine_js' AND type='TR')
DROP TRIGGER T_fine_js
GO
CREATE TRIGGER T_fine_js
ON borrow
After UPDATE
AS
DECLARE @days int,@dzbh char(10),@tsbh char(15)
SET @dzbh=(select RID from inserted)
SET @tsbh=(select BID from inserted)
SELECT @days=DATEDIFF(day, ReturnDate, SReturnDate)
--DATEDIFF函数返回两个日期之差,单位为DAY
FROM borrow
WHERE RID=@dzbh and BID=@tsbh
IF @days>0
PRINT '没有过期!'
ELSE
PRINT '过期'+convert(char(6),@days)+'天'
GO
应用:
USE Library
UPDATE borrow SET ReturnDate='2007-12-12'
WHERE RID='2000186010' and BID='TP85-08'
GO
执行结果:
过期-157 天
(1 行受影响)
例9-9:对Library库中Reader表的 DELETE操作定义触发器。
USE Library
GO
IF EXISTS(SELECT name FROM sysobjects
WHERE name='reader_d' AND type='TR')
DROP TRIGGER reader_d
GO
CREATE TRIGGER reader_d
ON Reader
FOR DELETE
AS
DECLARE @data_yj int
SELECT @data_yj=Lendnum
FROM deleted
IF @data_yj>0
BEGIN
PRINT '该读者不能删除!还有'+convert(char(2),@data_yj)+'本书没还。
ROLLBACK
END
ELSE
PRINT '该读者已被删除!'
GO
应用:
USE Library
GO
DELETE Reader WHERE RID='2005216119'
执行结果:
该读者不能删除!还有4 本书没还。
修改触发器
ALTER TRIGGER 触发器
删除触发器
DROP TRIGGER 触发器
查看触发器
sp_helptext trigger_name
sp_helptrigger table_name
C. sql中的触发器是什么举例说明
最简单的说法就是当你想往表A中插入数据的同时想表B的字段数据随表A的相同字段变化,就用到触发器
D. SQL中,触发器是什么
触发器是对表进行插入、更新、删除的时候会自动执行的特殊存储过程。
触发器一般用在check约束更加复杂的约束上面。例如在执行update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。
SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。
DML触发器分为:
1、 after触发器(之后触发)
a、 insert触发器
b、 update触发器
c、 delete触发器
2、 instead of 触发器 (之前触发)
其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。
触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。
Update数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。
E. sql server2008中的触发器有3种类型,分别为
(1)DML触发器:是指触发器在数据库中发生数据操作语言(DML)事件时将启用。DML事件即指在表或视图中修改数据的insert、update、delete语句也。
(2)DDL触发器:是指当服务器或数据库中发生数据定义语言(DDL)事件时将启用。DDL事件即指在表或索引中的create、alter、drop语句也。
(3)登陆触发器:是指当用户登录SQL SERVER实例建立会话时触发。
F. SQL中的“触发器”是什么
触发器是对表进行插入、更新、删除的时候会自动执行的特殊存储过程。x0dx0ax0dx0a触发器一般用在check约束更加复杂的约束上面。例如在执行update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。x0dx0ax0dx0aSQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。 x0dx0ax0dx0a DML触发器分为: x0dx0a 1、 after触发器(之后触发) x0dx0a a、 insert触发器 x0dx0a b、 update触发器 x0dx0a c、 delete触发器 x0dx0a 2、 instead of 触发器 (之前触发) x0dx0ax0dx0a其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。 x0dx0ax0dx0a触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。x0dx0ax0dx0aUpdate数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。