带你深入了解T-SQL的十一种设计模式
2008-09-04 10:00:41 来源:WEB开发网实际应用:禁止一个应用的多个实例连接至服务器
方法1:应用程序锁
--锁定应用程序资源
DECLARE @res int
BEGIN TRAN
exec @res = sp_getapplock @Resource = ’Check Writer’,@LockMode = ’Exclusive’
--返回到应用程序
--当检测到应用程序时执行以下代码(释放锁资源)
exec @res = sp_releaseapplock @Resource = ’Check Writer’
ROLLBACK TRAN
注:可在启动应用程序时启用一个锁,在关闭时释放该锁。通过以独占方式启用锁,可在释放该锁前禁止运行应用程序的另一个实例。
但这种方法让一个事务长期保持为打开状态。一般来说,不应该长时间或当一个用户被提示输入时让一个事务保持打开状态。
方法2:使用SET CONTEXT_INFO(推荐方法)
IF exists (select * FROM master..sysprocesses where context_info = 0x123456)
RAISERROR(’You Can run only one copy of this application at a time’,20,1) WITH LOG
ELSE
SET CONTEXT_INFO 0x123456
注:使用SET CINTEXT_INFO命令在启动时间向sysprocesses插入一个用户自定义值,每次启动程序时检查该值,如果存在,则包含特定的记号连接已存在,因此产生一个错误并中止自己的连接。如不存在,则将该值保存在sysprocesses中,并继续加载应用。
九、FACADE(外观)
此模式目标:它给位于子系统的一个接口集合提供统一的接口。
在T-SQL中与此模式类似的是包含INSTEAD OF触发器的视图(INSTEAD OF触发器接受对视图的更新,并将它们分配给适当的底层表)。
create TABLE AussieArtists
(ArtistID int identity,
LastName varchar(30),
FirstName varchar(30))
GO
insert AussieArtists VALUES(’Gibb’,’Barry’)
insert AussieArtists VALUES(’Crowe’,’Russell’)
insert AussieArtists VALUES(’Hogan’,’Paul’)
GO
create VIEW VAussieArtists
AS
select FirstName + ’’ + LastName AS Name FROM AussieArtists
GO
create TRIGGER VAussieArtists_insert ON VAussieArtists INSTEAD OF insert
AS
insert AussieArtists(FirstName,LastName)
select LEFT(Name,ISNULL(NULLIF(charINDEX(’ ’,NAME),0),255)-1),
SUBSTRING(Name,NULLIF(charINDEX(’ ’,Name),0)+1,255)
FROM inserted
GO
insert VAussieArtists(Name) VALUES(’Gerg Ham’)
GO
select * FROM AussieArtists
GO
drop TABLE AussieArtists
drop VIEW VAussieArtists
GO
- ››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表' (数...
更多精彩
赞助商链接