Sql server SQL Server:在触发器文本中检测ALTER vs CREATE

Sql server SQL Server:在触发器文本中检测ALTER vs CREATE,sql-server,triggers,Sql Server,Triggers,我有一个触发器,它使用校验和来比较插入和删除的某些列。有时,我需要更新选中的列,因此我创建了另一个过程来读取触发器文本,更改校验和逻辑,并发出新的更新触发器或DROP/CREATE触发器命令来进行更改 这是我的挑战:我不知道是否首先发出DROP TRIGGER命令,因为我无法检测sysComments.text是否表示ALTER TRIGGER或CREATE TRIGGER语法 我可以使用类似于PATINDEX(“%CREATE%PROC%”,@triggerText)的东西,但这是不可靠的,因

我有一个触发器,它使用
校验和
来比较插入和删除的某些列。有时,我需要更新选中的列,因此我创建了另一个过程来读取触发器文本,更改
校验和
逻辑,并发出新的
更新
触发器或DROP/CREATE触发器命令来进行更改

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

我可以使用类似于
PATINDEX(“%CREATE%PROC%”,@triggerText)
的东西,但这是不可靠的,因为它可能会拾取注释和其他不合适的文本


有什么想法吗?

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

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_模块。这不是什么大问题,但值得进行切换。

如果(object_id('triggername)为null)创建触发器…,然后始终使用alter trigger,您可以创建一个批处理吗?
,在我尝试更改它之前,触发器将始终存在,我只是不知道我从sys.sql\u模块返回的文本是否有ALTER或CREATE。由于我计划重新运行这个精确的文本(只是插入我的更改),所以如果触发器的语法是CREATE,而不是ALTER,我只需要删除触发器。Hey@Xedni-这是一个高流量表(读/写),因此性能至关重要。我不希望触发器中有动态sql,我希望它100%预编译。即使我延迟了校验和,另一个函数我也不希望该函数使用任何动态SQL。@sisdog重新创建触发器不会更好,事实上可能会更糟。如果您连接sql并使用
sp_executesql
,它将在那里缓存计划(只有
exec(“”)
不缓存执行计划)。如果您正在修改或上帝禁止删除并重新创建触发器,这将导致触发器上的模式锁定,并重新编译它。