我有一个使用CHECKSUM
来比较插入和删除之间某些列的触发器。有时,我需要更新检查哪些列,因此我创建了另一个读取触发器文本的过程,更改了CHECKSUM
逻辑,并发出新的UPDATE
触发器或DROP / CREATE触发器命令做出改变。
这是我的挑战:我不知道是否首先发出DROP TRIGGER
命令,因为我无法检测sysComments.text
是代表ALTER TRIGGER
还是CREATE TRIGGER
语法。
我可以使用类似PATINDEX('%CREATE%PROC%', @triggerText)
的内容,但这样做会不可靠,因为它可能会收集评论和其他不合适的文字。
有什么想法吗?
答案 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。没什么大不了的,但值得转换。