sql 触发器:SQL创建触发器
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 执行插入语句:第一种:Check约束实现,建约束SQL数据完整性介绍和SQL语句创建约束解析:只需让newtable1.Cid<=40即可,或者约束newtable1.Cid>40时,时间回滚报错。创建表newtable1:SQL语句创建表单table--建表 create t
什么是SQL触发器?触发器是一种特殊类型的储存过程。他在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应或者执行一段相应的 INSERT、UPDATE 或 DELETE 语句程序。也即在执行某个事件时触发另外一个事件的执行。
SQL触发器特点- 触发器是一种主要机制来强制业务规则和数据完整性的事务机制。
- 将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。
- 触发器可以查询其它表,并可以包含复杂的Transact-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)
本文部分内容参考博客,如有错误敬请指正,如有侵权,请联系修改,谢谢。