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