带你深入了解T-SQL的十一种设计模式
2008-09-04 10:00:41 来源:WEB开发网注:因想在加入到基表前处理数据,所以使用INSTEAD OF触发器分析输入并执行插入数据,即对视图的简单插入被转换为对基表稍微复杂一些的插入。
十、Chain Of Responsibility(职责链)
此模式目标:为避免通过多个对象提供机会处理请求,合并请求的发送者与接收者。为实现该模式,必须串联接收对象并沿此链传送请求,直到某个对象处理它。
前面的Conveyor模式已接到责任链模式,这里再作深入讨论。在T-SQL中最接近此模式所描述行为的是嵌套触发器(触发器的执行导致其他触发器激活并实现串联行为的操作)。
create TABLE employee (id int identity ,name varchar(10))
GO
create TABLE laborage (id int ,salary int)
GO
create TABLE laborage2(id int,number int)
GO
insert employee (name) values(’zs’)
insert laborage values(101,101)
insert laborage2 values(101,102)
GO
create TRIGGER up_employee ON Employee
FOR update
AS
update laborage Set Salary = Salary + 100 where id =101
GO
create TRIGGER up_laborage ON laborage
FOR update
AS
update laborage2 SET number = number + 200 where id = 101
GO
update Employee SET Name = ’Zxm’ where id = 1
GO
注:SP_CONFIGURE ’NESTED TRIGGER’,0 可以禁止触发器嵌套,同时触发器最多嵌套32次。从功能角度考虑,在触发器未设定激活顺序情况下,插入请求从一个触发器传送给另一个。在任何情况下,如果其中的任一触发器拒绝插入并回滚事务,则整个操作都将被取消。
十一、COMMAND(命令)
这种模式目标:将请求一个对象来封装,允许你参数化包含不同请求、队列或日志请求的客户端,并支持可撤消操作。在T-SQL中与此模式对应的是事务。
create PROC prClearLS
@intLsID int
AS
BEGIN TRAN
update Inventory SET Lease = 0 where LsID = @intLsID
IF @@ERROR <> 0
GOTO PROBLEM
update LeaseSchedule
SET PeriodTotalAmount = 0
where ScheduleID = @intLsID
IF @@ERROR <> 0
GOTO PROBLEM
COMMIT TRAN
RETURN 0
PROBLEM:
PRINT ’Unable to eliminate lease amounts from the database.’
ROLLBACK TRAN
RETURN 1
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接