快捷搜索:  汽车  科技

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 触发器:SQL创建触发器(1)

什么是SQL触发器?

触发器是一种特殊类型的储存过程。他在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应或者执行一段相应的 INSERT、UPDATE 或 DELETE 语句程序。也即在执行某个事件时触发另外一个事件的执行。

SQL触发器特点
  1. 触发器是一种主要机制来强制业务规则和数据完整性的事务机制。
  2. 将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。
  3. 触发器可以查询其它表,并可以包含复杂的Transact-SQL 语句。

sql 触发器:SQL创建触发器(2)

SQL触发器的功能
  1. 触发器可通过数据库中的相关表实现级联更改。
  2. 触发器可以强制用比 Check 约束定义的约束更为复杂的约束。
  3. 触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
  4. 触发器还可以强制执行业务规则。

sql 触发器:SQL创建触发器(3)

创建触发器

语法:

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

sql 触发器:SQL创建触发器(4)

执行插入语句:

insert into newtable1 values (42 '028班')

sql 触发器:SQL创建触发器(5)

注:

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

sql 触发器:SQL创建触发器(6)

注:

触发器约束:Cid<=39

3.执行违法插入语句,如果错误,输出错误提示“班级编号不能超过39个!”并实现回滚。

insert into newtable1 values (40 '028班')

sql 触发器:SQL创建触发器(7)

如果在tigger中设置 Cid<43,则会满足最小的约束check约束

insert into newtable1 values (40 '028班')

sql 触发器:SQL创建触发器(8)

选择了check约束,是数据更完整!

sql 触发器:SQL创建触发器(9)

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:错误的自定义选项,可以是下表中的任一值:

  1. log :在错误日志和应用程序日志中记录错误;
  2. nowait:将消息立即发送给客户端;
  3. seterror:将 @@error 值和 error_number值设置为 msg_id 或 50000;

简单实例:

抛出错误:I am a good boy!

raiserror('I am a good boy!' 16 8)

sql 触发器:SQL创建触发器(10)

本文部分内容参考博客,如有错误敬请指正,如有侵权,请联系修改,谢谢。

猜您喜欢: