SQL Server:在触发器文本中检测ALTER与CREATE

时间:2017-01-29 21:10:45

标签: sql-server triggers

我有一个使用CHECKSUM来比较插入和删除之间某些列的触发器。有时,我需要更新检查哪些列,​​因此我创建了另一个读取触发器文本的过程,更改了CHECKSUM逻辑,并发出新的UPDATE触发器或DROP / CREATE触发器命令做出改变。

这是我的挑战:我不知道是否首先发出DROP TRIGGER命令,因为我无法检测sysComments.text是代表ALTER TRIGGER还是CREATE TRIGGER语法。

我可以使用类似PATINDEX('%CREATE%PROC%', @triggerText)的内容,但这样做会不可靠,因为它可能会收集评论和其他不合适的文字。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我真的不会使用字符串操作重建触发器的文本;或者真的。我只想改变触发器一次,以执行动态需要的校验和代码。您可以维护一个单独的列表,或者甚至只是其他地方的列字符串。然后在需要时将该列表连接到校验和中。像这样:

if object_id('tempdb.dbo.#ChecksumColumns') is not null drop table #ChecksumColumns
create table #ChecksumColumns
(
    ColumnName nvarchar(128) primary key clustered
)

insert into #ChecksumColumns 
values ('Col1', 'Col2', 'Col3')

declare 
    @sql nvarchar(max),
    @columns nvarchar(max)

select 
    @columns = stuff((select ',' + ColumnName
                      from #ChecksumColumns
                      for xml path('')), 1, 1, ''),
    @Sql = 'select checksum(' + @columns + ')

同样仅供参考,syscomments已被弃用,转而使用sys.sql_modules。没什么大不了的,但值得转换。