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
数据 *** 纵语言DML,用户通过它可以实现对数据库的基本 *** 作。而数据库模式定义语言DDL,是用于描述数据库中要存储的现实世界实体的语言。DDL描述的模式,必须由计算机软件进行编译,转换为便于计算机存储、查询和 *** 纵的格式,完成这个转换工作的程序称为模式编译器。而DML主要是对表中数据的插入、删除和修改。
DML和DDL的简介
数据库模式定义语言并非程序设计语言,DDL数据库模式定义语言是SQL语言的组成部分。SQL语言包括四种主要程序设计语言类别的语句:数据定义语言DDL,数据 *** 作语言DML,数据控制语言DCL和事务控制语言TCL。查询语句重写的实现主要是对SQL语言中的两大类语句进行重写,即数据定义语言DDL和数据 *** 纵语言DML。
1、原理是监听表上都某一字段进行的DML *** 作,然后得到DML *** 作的数据,重新在另一个表上执行DML *** 作。
2、优点:简单,编写一个触发器就可以,不需要过多的配置。易修改,遇到了问题很好定位。
3、缺点:表大的话是有性能问题,如果表中含有blob列,是无法监听到其改变的,而且整个insert必须先insert一个空的blob,再进行update *** 作,而且很有可能出现数据不为空,blob为空的情况。
sql语句类型:
DDL:数据库定义语言
DML:数据库 *** 作语言 增删改
DCL:数据控制语言
DML:
增加:insert into 表名(字段名) values (字段值);
删除:delect from 表名 where 字段
改:update 表名 set 字段=‘值’ where 字段
插入:
& 动态插入insert into emp(ename) values (&ename);
插入批量数据
创建新表并插入数据: create table myemp as select from emp;
创建表只有结构:create table myemp as select from emp where 1=0;
在旧的表插入:insert into myemp(empno,ename,sal) select empno,ename,sal from emp ;
begin … end /
海量数据 :数据泵 sql loader 外部表
全表删除:
delete from emp; 可回退
truncate table emp ; 不可回退
原因:dml 可以回退 truncate 是ddl, ddl不可回退
对于少量数据 delete效率高
对于大量数据truncate效率高
delete支持闪回 truncate不支持
delete不会释放空间 truncate会
delete会产生碎片 truncate不会 整理碎片alter table 表名 move;
DDL:create/drop/truncate/alter
crate注意事项:
1权限和空间问题
2表名规定:必须以字母开头,不能与保留字和其他对象(视图,索引等)重名,长度1-30
增加新列
alter table 表名 add 字段名 长度
修改长度
alter table 表名 modufy 字段名 长度
注意:blob/clob不能修改
删除列
alter table 表 drop column 列明
重命名列
alter table 表名 rename column 原列名 to 新列名
删除表
drop table 表名 (放入回收站)
show recyclebin 查看回收站
purge recycle 清空回收站
还原使用闪回
drop table 表名 purge ;不放入回收站
这里介绍DML语句(数据 *** 纵语言),用于数据的 增加 、 删除 和 更改 ,也就是我们常说的 增删改 。
示例表:
示例数据库:testDatabase,示例表:myTable
格式:
示例:
1)只插入某一列的值
2)按规矩指定所有列名,并且每列都插入值
注意数据类型,如字符类型values值需要加 ` " " `
显示如下:
3)如果不知道列,就要按规矩为每列都插入恰当的值
示例:
注: 这种方式,需要注意自增项的列(id),也需要赋值,可以自定义id值,也可以null,让自增。
4)批量插入数据的方法,提升效率
Delete,意为删除,顾名思义就是删除表中已有的某些记录。
格式:
示例:
注: 以上会删除所有同名为“lisi”的列,所有实际中以唯一量的值删除,如id。
例:
删除id为9和12的列。
Update,意为更新,顾名思义,就是修改表中原有的数据。
格式:
示例:
或者改多项值:
以上是基本的DML(数据 *** 纵语言)语句。
以上就是关于SQL中,触发器是什么全部的内容,包括:SQL中,触发器是什么、DML和DDL的区别、oracledds全同步原理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)