我在 sql server 2000 中有一个很长的脚本(17k 行并且还在增长)。
问题是大约一半,作为远程安装过程的一部分,必须删除和重新创建几个触发器。
有时,一两个表正在使用中,安装在没有警告我的情况下停止,直到我查看消息选项卡并找到它。
我想要一个半无人值守的安装,我至少有两个选择:
a) 悲观的方法: 在开始时确认所有表的可用性,如果某个表正在使用中,则显示警告 +“set exec off”(在启动和触发器创建之间不太可能正在使用)
b) 乐观的方法: 当某个表正在使用时,在开始时显示警告,如果安装可以继续,请留给我,用 set exec off/on 代码封装有问题的触发器。我可以这样做,因为触发代码往往非常稳定(几年前)
无论如何,我只需要知道表是否可用于触发删除/创建而不停止我的进程(表锁定?)。我登录了 BOL 和一些论坛,但我真的不知道要找什么。
更新:
使用此选择查找您的 Type_Id 和 Mode_Id 和 Sts_Id 值...
(我的分别是 5、6 和 1,但可能是其他值,这些只是来自初始测试)
%%%警告:记住 MS 可以更改或弃用它们,因为这不是最好的方法,但我发现的唯一一个'直到现在......
use <your_db_here>
go
declare @TblNam varchar(100)
select @TblNam = '<your_[usr.]table_name_here>'
select convert (smallint, l.req_spid) spId,
coalesce(s.loginame,'') UsrNam,
coalesce(s.hostname,'') HstNam,
l.rsc_dbid dbId,
db_name(l.rsc_dbid) dbNam,
l.rsc_objid objId,
object_name(l.rsc_objid) objNam,
l.rsc_indid indId,
substring(v.name, 1, 4) Type,
substring(l.rsc_text, 1, 16) Resource,
substring(u.name, 1, 8) Mode,
substring(x.name, 1, 5) Status,
l.rsc_type Type_Id,
l.req_mode+1 Mode_Id,
l.req_status Sts_Id
from master.dbo.syslockinfo l inner join
master.dbo.spt_values v on v.type = 'LR' and v.number = l.rsc_type inner join
master.dbo.spt_values x on x.type = 'LS' and x.number = l.req_status inner join
master.dbo.spt_values u on u.type = 'L' and u.number = l.req_mode+1
master.dbo.sysprocesses s on s.spid = l.req_spid
where db_name(l.rsc_dbid) = db_name()
and v.name = 'TAB'
and l.rsc_objid = object_id(@TblNam)