Sql server SQL Server 2014在为表创建触发器的创建表上创建DDL触发器
我正在使用第三方工具创建数据库和表。我想在正在创建的其中一个表上设置触发器。我想我会尝试创建一个服务器DDL触发器,当在新数据库中创建表时触发该触发器,这反过来又会在该表上创建一个触发器。我无法将触发器添加到“模型”数据库中,因为此表是通过该工具动态创建的 我尝试了以下方法:Sql server SQL Server 2014在为表创建触发器的创建表上创建DDL触发器,sql-server,ddl,Sql Server,Ddl,我正在使用第三方工具创建数据库和表。我想在正在创建的其中一个表上设置触发器。我想我会尝试创建一个服务器DDL触发器,当在新数据库中创建表时触发该触发器,这反过来又会在该表上创建一个触发器。我无法将触发器添加到“模型”数据库中,因为此表是通过该工具动态创建的 我尝试了以下方法: CREATE TRIGGER ddl_trig_createTable ON ALL SERVER FOR CREATE_TABLE AS DECLARE @databaseName var
CREATE TRIGGER ddl_trig_createTable
ON ALL SERVER
FOR CREATE_TABLE
AS
DECLARE @databaseName varchar(255)
DECLARE @AffectedTables varchar(255)
SELECT @AffectedTables = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(100)')
IF (@AffectedTables IN ('DynamicallyCreatedTable'))
BEGIN
select @databaseName = CAST(eventdata().query('/EVENT_INSTANCE/DatabaseName[1]/text()') as NVarchar(128))
EXEC('CREATE TRIGGER ' + @databaseName + '.[dbo].[tgrDynamicTableTrigger]
ON
' + @databaseName + '.[dbo].[DynamicallyCreatedTable]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON
-- trigger code here
END')
END
GO
它在创建表时产生以下错误:
消息166,第15级,状态1,第1行“创建/更改触发器”不存在
允许将数据库名称指定为对象名称的前缀
我尝试通过替换完全限定表名来更改动态sql,以尝试使用“use”语句:
--- 8< ---
EXEC('use ' + @databaseName + '
CREATE TRIGGER [dbo].[tgrDynamicTableTrigger]
ON
--- 8< ---
--8<---
EXEC('use'+@databaseName+'
创建触发器[dbo]。[tgrDynamicTableTrigger]
在…上
--- 8< ---
但是,在创建表时会产生以下错误:
消息111,级别15,状态1,第2行“创建触发器”必须是第一个
查询批处理中的语句
有什么想法吗
我正在使用SQL Server 2014。我相信我已经找到了答案,这主要要感谢这一点 代码如下:
CREATE TRIGGER ddl_trig_createTable
ON ALL SERVER
FOR CREATE_TABLE
AS
DECLARE @statement nvarchar(max) = 'CREATE TRIGGER [dbo].[tgrDynamicTableTrigger]
ON
[dbo].[DynamicallyCreatedTable]
AFTER UPDATE
AS
BEGIN
-- trigger code here
END'
DECLARE @databaseName varchar(255)
DECLARE @AffectedTables varchar(255)
SELECT @AffectedTables = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(100)')
IF (@AffectedTables IN ('DynamicallyCreatedTable'))
BEGIN
SET @databaseName = CAST(eventdata().query('/EVENT_INSTANCE/DatabaseName[1]/text()') as NVarchar(128))
DECLARE @sql NVARCHAR(MAX) = QUOTENAME(@databaseName) + '.sys.sp_executesql';
EXEC @sql @statement;
END
GO
我想问你为什么首先需要触发器。触发器可能很有用,但它们通常不是工作的正确工具。这对我来说似乎是一个xy问题。