2011-12-14 35 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 
相關問題