什么是SQL触发器?
触发器是一种特殊类型的储存过程。他在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应或者执行一段相应的 INSERT、UPDATE 或 DELETE 语句程序。也即在执行某个事件时触发另外一个事件的执行。
SQL触发器特点
- 触发器是一种主要机制来强制业务规则和数据完整性的事务机制。
- 将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。
- 触发器可以查询其它表,并可以包含复杂的Transact-SQL语句。
SQL触发器的功能
- 触发器可通过数据库中的相关表实现级联更改。
- 触发器可以强制用比 CHECK 约束定义的约束更为复杂的约束。
- 触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
- 触发器还可以强制执行业务规则。
创建触发器
语法:
CREATE TRIGGER trigger_name
ON {table_name | view_name}
{FOR | After | Instead of } [ insert, update,delete ]
AS
sql_statement
go
创建一个触发器实例:
功能:newtable1中至多能存40个班级。
解析:只需让newtable1.Cid<=40即可,或者约束newtable1.Cid>40时,时间回滚报错。
创建表newtable1:SQL语句创建表单table
--建表
create table newtable1
(
Cid int not null,
CName nvarchar(50) null
)
功能实现:
第一种:Check约束实现,建约束SQL数据完整性介绍和SQL语句创建约束
--check constraint
if exists (select * from sysobjects where name = 'CK_newtable1_Cid')
alter table newtable1
drop constraint CK_newtable1_Cid
go
--add constraint
alter table newtable1
add constraint CK_newtable1_Cid check (Cid>0 and Cid<=40)
go
执行插入语句:
insert into newtable1 values (42 , '028班')
注:
check约束已生效。
第二种:触发器trigger实现
1.判断触发器是否存在
----trigger constraint
if object_id(N'newtable1Insert',N'tr') is not null
drop trigger newtable1Insert
go
2.创建功能触发器,事务回滚参见:SQL 事务机制-transaction
--create trigger
create trigger newtable1Insert
on newtable1
for insert
as
declare @Cid int
select @Cid = newtable1.Cid from newtable1 inner join inserted on newtable1.Cid=inserted.Cid
print @Cid
if(@Cid>40)
begin
raiserror('班级编号不能超过40个!',16,8)
rollback tran
end
go
注:
触发器约束:Cid<=39
3.执行违法插入语句,如果错误,输出错误提示“班级编号不能超过39个!”并实现回滚。
insert into newtable1 values (40,'028班')
如果在tigger中设置 Cid<43,则会满足最小的约束check约束
insert into newtable1 values (40 , '028班')
选择了check约束,是数据更完整!
raiserror('', , )函数
用于抛出一个错误。
语法:
raiserror (
{ msg_id | msg_str | @local_variable }
{ ,severity }
{,state }
[ ,argument [ ,...n ] ]
)
[ with option [ ,...n ] ]
注:
msg_id:表示可以是一个sys.messages表中定义的消息代号; 使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消息号。用户定义错误消息的错误号应当大于 50000。
msg_str:表示也可以是一个用户定义消息,该错误消息最长可以有 2047 个字符;(如果是常量,请使用N'xxxx',因为是nvarchar的) 当指定 msg_str 时,RAISERROR 将引发一个错误号为 5000 的错误消息。
@local_variable:表示也可以是按照 msg_str 方式的格式化字符串变量。
severity:用户定义的与该消息关联的严重级别,任何用户都可以指定 0 到 18 之间的严重级别: [0,10]的闭区间内,不会跳到catch;如果是[11,19],则跳到catch;如果[20,无穷),则直接终止数据库连接。
state: 如果在多个位置引发相同的用户定义错误, 则针对每个位置使用唯一的状态号有助于找到引发错误的代码段。介于 1 至 127 之间的任意整数,state 默认值为1。当state 值为 0 或大于 127 时会生成错误!
argument:用于代替 msg_str 或对应于 msg_id 的消息中的定义的变量的参数。
option:错误的自定义选项,可以是下表中的任一值:
- log :在错误日志和应用程序日志中记录错误;
- nowait:将消息立即发送给客户端;
- seterror:将 @@error 值和 error_number值设置为 msg_id 或 50000;
简单实例:
抛出错误:I am a good boy!
raiserror('I am a good boy!',16,8)
本文部分内容参考博客,如有错误敬请指正,如有侵权,请联系修改,谢谢。
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付
转载请注明:首页 > 投稿 » mysql触发器怎么写(SQL创建触发器教程)
发表评论
版权声明
求资源网所发布的一切破解补丁,软件,以及其他分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途。
否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。