| |
This
is a script to convert
triggers to have the NFR attribute (supplied by Paul Canino).
create table #tLoopTable (iRow int IDENTITY (1, 1) NOT NULL, cTriggerName sysname, idObj int, iColId int, iMaxCol int)
declare @iRow int, @iMaxRow int, @cTriggerName sysname, @idObj int, @iColId int, @iColPnt int, @iMaxCol int, @cSQL varchar(8000)
insert into #tLoopTable
select o.name as cTriggerName, b.id, b.colid,
(select max(colid) from syscomments where id = o.id) as iMaxCol
from syscomments b
inner join sysobjects o on o.id = b.id
where o.xtype = 'TR'
and o.id in(select id from syscomments where colid = 1 and patindex( '%not for replication%', text ) = 0)
and colid = 1
and o.name not like 'ins_%' /*Do not update replication triggers - still working on a better way to define these*/
and o.name not like 'upd_%' /*Do not update replication triggers - still working on a better way to define these*/
and o.name not like 'del_%' /*Do not update replication triggers - still working on a better way to define these*/
order by o.name, b.colid
select @iRow = 0, @iMaxRow = Max(iRow) from #tLoopTable
while @iRow < @iMaxRow
begin
set @iRow = @iRow + 1
select @idObj = idObj, @iColId = iColId, @iMaxCol = iMaxCol,
@cTriggerName = cTriggerName from #tLoopTable where iRow = @iRow
set @cSQL = ''
set @iColPnt = @iColId
set @cSQL = @cSQL + ' DECLARE @cTgrStringNFR' + ltrim(rtrim(@iRow + @iColPnt ))
+ ' varchar(8000) '
while @iColPnt <= @iMaxCol
begin
set @cSQL = @cSQL + ' DECLARE @cTgrString' + ltrim(rtrim(@iRow + @iColPnt )) + ' varchar(8000)
SELECT @cTgrString' + ltrim(rtrim(@iRow + @iColPnt)) + ' = text from syscomments where id = ' +
rtrim(@idObj) + ' and colid = ' + rtrim(@iColPnt) + '
'
set @iColPnt = @iColPnt + 1
end
set @cSQL = @cSQL + ' drop trigger [dbo].[' + rtrim(ltrim(@cTriggerName)) + ']'
set @iColPnt = @iColId
set @cSQL = @cSQL + ' if CHARINDEX(''AS'', @cTgrString'
+ ltrim(rtrim(@iRow + @iColPnt )) + ', CHARINDEX(''FOR '', @cTgrString'
+ ltrim(rtrim(@iRow + @iColPnt)) + ')) > 0
set @cTgrStringNFR' + ltrim(rtrim(@iRow + @iColPnt )) + ' = substring(@cTgrString'
+ ltrim(rtrim(@iRow + @iColPnt )) + ', 1, CHARINDEX(''AS'', @cTgrString'
+ ltrim(rtrim(@iRow + @iColPnt )) + ', CHARINDEX(''FOR '', @cTgrString' + ltrim(rtrim(@iRow +
@iColPnt)) + '))-1) + '' NOT FOR REPLICATION '' + substring(@cTgrString'
+ ltrim(rtrim(@iRow + @iColPnt )) + ', CHARINDEX(''AS'', @cTgrString'
+ ltrim(rtrim(@iRow + @iColPnt )) + ', CHARINDEX(''FOR '', @cTgrString'
+ ltrim(rtrim(@iRow + @iColPnt)) + ')), len(@cTgrString' + ltrim(rtrim(@iRow + @iColPnt ))
+ ')) else set @cTgrStringNFR' + ltrim(rtrim(@iRow + @iColPnt )) + ' = @cTgrString'
+ ltrim(rtrim(@iRow + @iColPnt ))
set @cSQL = @cSQL + '
exec('while @iColPnt <= @iMaxCol
begin
if @iColPnt > 1
begin
set @cSQL = @cSQL + ' + @cTgrString' + ltrim(rtrim(@iRow + @iColPnt ))
end
else
begin
set @cSQL = @cSQL + ' @cTgrStringNFR' + ltrim(rtrim(@iRow + @iColPnt ))
end
set @iColPnt = @iColPnt + 1
end
set @cSQL = @cSQL + ')'
exec(@cSQL)
end
drop table #tLoopTable
|
|