0

NOT FOR REPLICATIONフラグの設定が必要なトリガーが 505 個あります。「%AS%」を検索し、NOT FOR REPLICATIONその直前に追加するユーザー クエリが見つかりました。

問題は、AS の最初のインスタンスにヒットすることです。これは、コメント(つまり-- Trigger to prevent update of LastUpdated column) またはトリガー名(つまりtrgLastUpdated) である可能性があります。

以下は、私たちが試してきたことです。正しいものを見つけて、その直前に AS配置する方法について誰か提案がありますか?NOT FOR REPLICATION

主なクエリ:

DROP TABLE #TriggersNFR
CREATE TABLE #TriggersNFR (ServerName varchar(250), Dbname varchar(250),TableName varchar(250), TriggerName varchar(250), FixingScript varchar(max))
exec sp_MSforeachdb '
IF ''?'' NOT IN (''tempdb'',''master'',''model'',''msdb'') BEGIN
USE ?
insert into #TriggersNFR
SELECT @@servername,''?'' DBName,OBJECT_NAME(parent_object_id) TableName,
OBJECT_NAME(o.object_id) [Trigger Name],
STUFF (REPLACE(definition,''CREATE TRIGGER'',''ALTER TRIGGER''),
PATINDEX(''%AS%'',REPLACE(definition,''CREATE TRIGGER'',''ALTER TRIGGER'')),0,''
NOT FOR REPLICATION '')
+ ''
GO
''
from ?.sys.objects o
join ?.sys.sql_modules m
on o.object_id = m.object_id
where o.type = ''TR''
and OBJECTPROPERTY(o.object_id, ''ExecIsTriggerNotForRepl'') = 0
AND OBJECTPROPERTY(o.object_id, ''IsMSShipped'') = 0
END
'

select * from #TriggersNFR
order by Dbname

FixingScript 列にサンプル出力があります。

-- =============================================
-- Author:      #####
-- Create date: 9/14/2012
-- Description: Prevents updating of a L
 NOT FOR REPLICATION astUpdated date that would cause app to drop an update when the next one comes along.
-- =============================================
ALTER TRIGGER trgAppUpdates_Upd_LastUpdated
   ON APP_REGISTER_UPDATES
   AFTER UPDATE
AS 
BEGIN

これを変更しようとしましたが、結果は失敗しました:

PATINDEX(''%AS%'',

PATINDEX(char(13)+''%AS%''

また

PATINDEX(''%''+char(13)+''AS%''

また

PATINDEX(''%''+char(13)+char(10)+''AS%''
4

3 に答える 3

1

試しましたか''% AS%''(AS の前にスペース)?

大文字と小文字を区別して検索しましたか?
PATINDEX(''%AS%'', [skipped], COLLATE SQL_Latin1_General_Cp1_CS_AS)またはその他の大文字と小文字を区別する照合?

ところで、スクリプトに感謝します:)。

于 2013-09-13T04:05:18.067 に答える
0

SQL Server Management Objects (SMO)を使用したソリューションを提案します。

// compile with: 
// /r:Microsoft.SqlServer.Smo.dll
// /r:Microsoft.SqlServer.ConnectionInfo.dll
// /r:Microsoft.SqlServer.Management.Sdk.Sfc.dll 

// using System;
// using Microsoft.SqlServer.Management.Smo;
// using Microsoft.SqlServer.Management.Common;

        void M(){

            string sqlServerLogin ="__" ;
            string password = "__";
            string remoteSvrName ="__" ;
            string dbName = "__";

            ServerConnection conn = new ServerConnection(remoteSvrName);
            conn.LoginSecure = false;
            conn.Login = sqlServerLogin;
            conn.Password = password;
            Server srv = new Server(conn);

            var db = srv.Databases[dbName];

            foreach (Table tab in db.Tables)
            {
                foreach (Trigger trig in tab.Triggers)
                {
                    trig.TextMode = false;
                    trig.NotForReplication = true;
                    trig.TextMode = true;
                    trig.Alter();

                    Console.WriteLine(trig.Name);
                }
            }
}
于 2014-12-29T15:12:21.137 に答える
0

私のコードでは、PATINDEX の代わりに「case」を使用しています

select
'
---------------------------------------------------- 
---------------------------------------------------- 
----------------------------------------------------
DROP TRIGGER [dbo].[' + name + ']
GO 
----------------------------------------------------
' + 
SUBSTRING([definition], 1, FirstAsPosition) + ' NOT FOR REPLICATION ' + 
SUBSTRING([definition], FirstAsPosition, len([definition]))  
+ '
GO
----------------------------------------------------
'
AS SQLTriggersScript
 from 
(
select 
    name,[definition],
    case when 
        (case when AsIndex1 = 0 then 1000000 else AsIndex1 end)  
            < 
         (case when AsIndex2 = 0 then 1000000 else AsIndex2 end)    
             then 
        AsIndex1
    else 
        AsIndex2
    end AS FirstAsPosition
  from 
    (
        select 
            obj.name, [definition], 
            CHARINDEX(' AS', [definition]) as AsIndex1, 
            CHARINDEX(CHAR(13)+CHAR(10)+'AS', [definition]) as AsIndex2 
        from sys.sql_modules m
        inner join sys.objects obj on obj.object_id=m.object_id 
        where obj.type ='TR' 
        AND OBJECTPROPERTY(obj.object_id, 'ExecIsTriggerNotForRepl') = 0
        AND OBJECTPROPERTY(obj.object_id, 'IsMSShipped') = 0
    ) as t
) as t
于 2015-06-17T01:09:04.800 に答える