如何检查表是否可用于删除&创造一个触发器?

时间:2011-12-14 23:31:41

标签: sql-server triggers table-locking

我在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)  

1 个答案:

答案 0 :(得分:1)

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

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