我在sql server 2000中有一个很长的脚本(17k行和不断增长)。
问题是大约一半,必须放弃几个触发器。作为远程安装过程的一部分重新创建。
有时,正在使用一个或两个表,并且在没有警告我的情况下停止安装,直到我查看消息选项卡并找到它。
我想要一个半无人值守的安装,我至少有两个选择:
a)悲观的方法: 如果某个表正在使用中,则在开头确认所有表可用性并显示警告+“设置exec off”(在启动和触发器创建之间不太可能使用)
b)乐观的做法: 在某些表正在使用时在开头显示警告,如果安装可以继续,请将其保留给我,使用set exec off / on code封装违规触发器。 我可以这样做,因为触发代码往往非常稳定(几年前)
无论如何,我只需要知道表是否可用于触发器删除/创建而不停止我的进程(表锁定?)。 我登录了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)
答案 0 :(得分:1)
这种方法比挖掘系统表更好:
set lock_timeout 1
select top 1 * from <your_[usr.]table_name_here> (tablockx)
select @@error