看数据库下的所有触发器及状态
SELECT a.name 数据表名 ,
sysobjects.name AS 触发器名 ,
sysobjects.crdate AS 创建时间 ,
sysobjects.info ,
sysobjects.status
FROM sysobjects
LEFT JOIN ( SELECT *
FROM sysobjects
WHERE xtype = 'U'
) AS a ON sysobjects.parent_obj = a.id
WHERE sysobjects.xtype = 'TR';
--type的含义
/*
C CHECK 约束
D 默认值或 DEFAULT 约束
F FOREIGN KEY 约束
L 日志
FN 标量函数
IF 内嵌表函数
P 存储过程
PK PRIMARY KEY 约束(类型是 K)
RF 复制筛选存储过程
S 系统表
TF 表函数
TR 触发器
U 用户表
UQ UNIQUE 约束(类型是 K)
V 视图
X 扩展存储过程
*/
--根据触发器名称查询触发器SQL如下
exec sp_helptext 触发器名称
--创建触发器语法
CREATE TRIGGER trigger_nameON table_name[WITH ENCRYPTION]FOR [DELETE, INSERT, UPDATE]AST-SQL语句GO
WITH ENCRYPTION
表示加密触发器定义的SQL文本
DELETE, INSERT, UPDATE
指定触发器的类型
1.创建insert类型的触发器
插入触发器
--GradeInfo表中插入一条数据,MyStudentInfo表中插入一条记录
IF (object_id('tr_insert','tr') is not null)drop trigger tr_insert
GO
CREATE trigger tr_insert
on GradeInfo
after insert --插入触发
asbegin--定义变量declare @GradeId int--在inserted表中查询已经插入记录信息select @GradeId=id from INSERTED--MyStudentInfo表中插入数据insert INTO MyStudentInfo (GradeId) VALUES (@GradeId)print '插入成功!'end
插入数据
insert INTO GradeInfo VALUES (11,'C++')
查询数据
select * from MyStudentInfo where GradeId=11
2、delete触发器
删除MyStudentInfo表中的数据,插入备份表
--删除MyStudentInfo表中的数据,插入备份表IF (object_id('tr_Delete','tr') is not null)drop TRIGGER tr_DeleteGOCREATE trigger tr_Deleteon MyStudentInfofor deleteasbeginprint '正在备份数据......'IF (object_id('MyStudentInfo_Back','U') is not null)--存在表,直接插入数据insert INTO MyStudentInfo_Back SELECT * from DELETEDelseselect * into MyStudentInfo_Back from DELETEDPRINT '备份完成'end
删除前查询MyStudentInfo表数据
select * from MyStudentInfo
删除id=9的数据
delete FROM MyStudentInfo where Id=9
查询备份表数据
select * from MyStudentInfo_Back
3、update触发器
IF (object_id('tr_Update','tr') is not null)drop TRIGGER tr_UpdateGOCREATE trigger tr_Updateon MyStudentInfofor updateasbegin--声明变量,存储更新前和更新后的姓名declare @OldName varchar(16),@NewName varchar(16)select @OldName=name from DELETEDprint '更新前姓名:'+@OldNameselect @NewName=name from INSERTEDprint '更新后姓名:'+@NewNameend
把张三更新为"张三测试"
update MyStudentInfo SET Name='张三测试' where Id=1
update更新列级触发器
--update更新列级触发器IF (object_id('tr_update_column','tr') is not null)drop TRIGGER tr_update_columnGOCREATE trigger tr_update_columnon GradeInfofor updateasbeginIF(update(id))beginprint '系统提示:主键ID不能更新'rollbackendend
更新id列
update GradeInfo SET Id=15 where Id=4
4、instead of触发器
instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身的内容,其优先级高于定义的SQL语句的执行
语法:
create trigger tgr_name
on table_name
with encryptioninstead of update...
asbeginT-SQLend
创建 instead of 触发器
--创建instead of触发器
/*MyStudentInfo表里面插入数据之前,先判断GradeInfo表中是否有对应的班级ID,如果没有,不允许插入,如果存在,则插入 */
IF (object_id('tr_insteadOf','tr') is not null)drop TRIGGER tr_insteadOf
GO
CREATE trigger tr_insteadOf
on MyStudentInfo
instead of insert
asbeginIF exists(SELECT * FROM GradeInfo WHERE Id=(SELECT GradeId FROM INSERTED))print '该班级存在,可以插入'elsebeginprint '该班级不存在,不可以插入'rollbackendend
测试1,插入不存在的班级id
insert INTO MyStudentInfo (GradeId) VALUES (15)
测试2,插入存在的班级id
insert INTO MyStudentInfo (GradeId) VALUES (5)
DDL触发器
create trigger tr_DDL on databasefor DROP_TABLE,ALTER_TABLEasbeginprint '别想着删库!好好打你的代码'rollback --回滚end
测试删除表
drop TABLE MyStudentInfo
测试修改表结构
alter table MyStudentInfo
alter column Name varchar(32)
删除触发器
drop trigger 触发器名称
禁用DML触发器
disable trigger tr_insteadOf on MyStudentInfo
启用DML触发器
enable trigger tr_insteadOf on MyStudentInfo
禁用DDL触发器
disable trigger tr_DDL on database
启用DDL触发器
enable trigger tr_DDL on database