Triggers 在SQL Server 2012中使用“不用于复制”更新所有触发器

Triggers 在SQL Server 2012中使用“不用于复制”更新所有触发器,triggers,sql-server-2012,database-replication,Triggers,Sql Server 2012,Database Replication,我们有505个触发器需要NOT FOR REPLICATION标志集。找到一个搜索“%AS%”的用户查询,并在该查询之前添加NOT以进行复制 问题是它会命中AS的第一个实例,可能是注释,即-触发器,以防止更新LastUpdated列或触发器名称,即trgLastUpdated 下面是我们一直在尝试的。是否有人对找到正确的AS以及如何将非复制放置在其前面有任何建议 主要查询: 在FixingScript列中具有示例输出: 已尝试更改此项,但结果不成功: PATINDEX(''%AS%'', 到

我们有505个触发器需要NOT FOR REPLICATION标志集。找到一个搜索“%AS%”的用户查询,并在该查询之前添加NOT以进行复制

问题是它会命中AS的第一个实例,可能是注释,即-触发器,以防止更新LastUpdated列或触发器名称,即trgLastUpdated

下面是我们一直在尝试的。是否有人对找到正确的AS以及如何将非复制放置在其前面有任何建议

主要查询:

在FixingScript列中具有示例输出:

已尝试更改此项,但结果不成功:

PATINDEX(''%AS%'',

您以前是否尝试过%AS%空间

你试过区分大小写的搜索吗? PATINDEX%AS%,[skipped],是否将SQL\u Latin1\u General\u Cp1\u CS\u排序为或任何其他大小写排序


顺便说一句,非常感谢您的脚本:。

我建议使用以下解决方案:


在我的代码中,我使用“case”而不是PATINDEX

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
PATINDEX(''%AS%'',
PATINDEX(char(13)+''%AS%''
PATINDEX(''%''+char(13)+''AS%''
PATINDEX(''%''+char(13)+char(10)+''AS%''
// 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);
                }
            }
}
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