1

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)  
4

1 に答える 1

1

このアプローチは、システム テーブルを掘り下げるよりも優れています。

set lock_timeout 1
select top 1 * from <your_[usr.]table_name_here> (tablockx)
select @@error
于 2011-12-16T02:47:00.953 に答える