四.SQLserver数据库规范-触发器

一.触发器的概念

触发器(trigger)是SQL server提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行(insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。触发器可以从(USER_TRIGGERS,USER_TRIGGERS)数据字典中查到。

二.触发器和存储过程的区别

触发器与存储过程的区别是运行方式的不同,触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行而存储过程需要用户,应用程序或者触发器来显示地调用并执行。

三.触发器的优点

1.触发器是自动的。当对表中的数据做了任何修改立即激活。
2.触发器可以通过数据库中的相关表进行层叠修改。
3.触发器可以强制限制。这些限制比用CHECK约束所定义的更复杂。与CHECK约束不同的是,触发器可以引用其它表中的列。

四.触发器的作用

触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的一致性,它能够对数据库中的相关表进行级联修改,提高比CHECK约束更复杂的的数据完整性,并自定义错误消息。触发器的主要作用主要有以下接个方面:

1.强制数据库间的引用完整性。
2.级联修改数据库中所有相关的表,自动触发其它与之相关的操作。
3.跟踪变化,撤销或回滚违法操作,防止非法修改数据。
4.返回自定义的错误消息,约束无法返回信息,而触发器可以。
5.触发器可以调用更多的存储过程。

五.触发器的分类

SqlServer包括三种常规类型的触发器:

DML触发器、DDL触发器和登录触发器。

1.DML(数据操作语言,Data Manipulation Language)触发器

DML触发器是一些附加在特定表或视图上的操作代码,当数据库服务器中发生数据操作语言事件时执行这些操作。SqlServer中的DML触发器有三种:

1.insert触发器:向表中插入数据时被触发;
2.delete触发器:从表中删除数据时被触发;
3.update触发器:修改表中数据时被触发。

从何对象执行顺序分为,前置触发器和后置触发器。

后置触发器:FOR (AFTER) *写法一定要使用FOR
前置触发器:BEFORE

当遇到下列情形时,应考虑使用DML触发器:

1.通过数据库中的相关表实现级联更改
2.防止恶意或者错误的insert、update和delete操作,并强制执行check约束定义的限制更为复杂的其他限制。
3.评估数据修改前后表的状态,并根据该差异才去措施。

2.DDL(数据定义语言,Data Definition Language)触发器

DDL触发器是当服务器或者数据库中发生数据定义语言(主要是以create,drop,alter开头的语句)事件时被激活使用,使用DDL触发器可以防止对数据架构进行的某些更改或记录数据中的更改或事件操作。

3.登录触发器

登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。

六.触发器的工作原理

触发器触发时:

1.系统自动在内存中创建deleted表或inserted表;
2.只读,不允许修改,触发器执行完成后,自动删除。

insert表:

临时保存了插入或更新后的记录行;
可以从inserted表中检查插入的数据是否满足业务需求;
如果不满足,则向用户发送报告错误消息,并回滚插入操作。

deleted表:

临时保存了删除或更新前的记录行;
可以从deleted表中检查被删除的数据是否满足业务需求;
如果不满足,则向用户报告错误消息,并回滚插入操作。

七、触发器规范

7.1头注释规范

不需要

7.2过程注释规范

变量必须添加规范
流程语句添加注释规范

7.3过程注释规范

1.BEGIN TRY
2.错误中,必须回滚写入

      BEGIN CATCH  
        DECLARE @FErrMsg VARCHAR(255)  
        SELECT  @FErrMsg = ERROR_MESSAGE()  
        RAISERROR(@FErrMsg,16,1)  
        IF @@TRANCOUNT > 0  
            BEGIN  
                ROLLBACK TRAN  
            END             
    END CATCH  

7.4逻辑规范

1.针对触发器必须使用游标来完成记录集合的操作,不能按照使用SELECT @FName=FName FROM T_Sys_Employee
== 触发器操作的对象实际上都是一个记录集,存在一条和多条都有可能 ==

== 正确 ==

当前以更新触发器来举例子,删除和添加触发器不需要连接。

	DECLARE C_Brief CURSOR LOCAL FOR 
		SELECT a.FBillID,a.FBillTypeID,a.FStatus,b.FStatus FROM INSERTED a 
		INNER JOIN DELETED b ON (a.FBillID = b.FBillID)
		--打开游标
		OPEN C_Brief
		FETCH C_Brief INTO @FBillID,@FBillTypeID,@FStatus_New,@FStatus_Old
		
		--循环游标
		WHILE @@FETCH_STATUS = 0
			BEGIN
				--使用变量处理逻辑
				FETCH C_Brief INTO @FBillID,@FBillTypeID,@FStatus_New,@FStatus_Old
			END
		--关闭游标
		CLOSE C_Brief
		--销毁游标
		DEALLOCATE C_Brief				
== 禁止绝对 ==
@FName=FName FROM T_Sys_Employee
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值