我在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)
Wy的你能不能改變觸發?您可以使用sp_lock獲取有關獲取的鎖的信息,您可以將其解析爲對象,但該信息可能會瞬間改變。 – 2011-12-15 00:31:14
我沒有鎖定信息,因爲這是一個數據庫。 – OldyGuy 2011-12-15 04:51:01