2011-12-14 59 views
1

我在sql server 2000中有一个很长的脚本(17k行和越来越多)。如何检查表是否可用于删除和创建触发器?

问题是,大约一半,几个触发器必须丢弃&作为远程安装过程的一部分重新创建。

有时,一个或两个表正在使用中,并且在未警告我的情况下停止安装,直到我查看消息选项卡并找到它。

我想一个半无人参与的安装,我已经至少有两个选项:

一)悲观的方法: 确认开头的所有表的可用性和显示警告+“设置exec的关”如果一些表在使用(不太可能在启动和创建触发器之间使用)

b)乐观态度: 显示在开始警告当一些表在使用中,如果安装交给我吧可以继续,用set e封装违规触发器xec关闭/打开代码。 我可以做到这一点,因为触发代码往往非常稳定(几岁)

无论如何,我只需要知道,如果表可用于触发删除/创建而不停止我的过程(表锁定?)。 我登录到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

Wy的你能不能改变触发?您可以使用sp_lock获取有关获取的锁的信息,您可以将其解析为对象,但该信息可能会瞬间改变。 – 2011-12-15 00:31:14

+0

我没有锁定信息,因为这是一个数据库。 – OldyGuy 2011-12-15 04:51:01

回答

1

这种方法比挖成系统表更好:

set lock_timeout 1 
select top 1 * from <your_[usr.]table_name_here> (tablockx) 
select @@error