SQL Server 2000 に長いスクリプトがあります (17,000 行以上)。
問題は、約半分のいくつかのトリガーを削除して、リモート インストール手順の一部として再作成する必要があることです。
1 つまたは 2 つのテーブルが使用中で、メッセージ タブを調べて見つけるまで、警告なしにインストールが停止することがあります。
半無人インストールを希望しており、少なくとも 2 つのオプションがあります。
a) 悲観的なアプローチ: 最初にすべてのテーブルの可用性を確認し、いくつかのテーブルが使用されている場合は、警告 + 「set exec off」を表示します (開始からトリガー作成までの間に使用される可能性はほとんどありません)。
b) 楽観的なアプローチ: 一部のテーブルが使用されているときに最初に警告を表示し、インストールを続行できるかどうかは私に任せて、set exec off/on コードで問題のトリガーをカプセル化します。トリガーコードは非常に安定している傾向があるため(数年前)、私はこれを行うことができます
とにかく、プロセスを停止せずにテーブルがトリガーの削除/作成に使用できるかどうかを知る必要があります (テーブルのロック?)。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)