我正在使用创建数据库和表格的第三方工具。我想在其中一个表上创建一个触发器。我以为我会尝试创建一个服务器DDL触发器,当在新数据库中创建表时会触发该触发器,从而在该表上创建一个触发器。我无法将触发器添加到“模型”数据库,因为此表是通过该工具动态创建的。
我尝试了以下内容:
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
创建表时会产生以下错误;
Msg 166,Level 15,State 1,Line 1'CREATE / ALTER TRIGGER'没有 允许指定数据库名称作为对象名称的前缀。
我尝试通过替换完全限定的表名来更改动态sql以尝试'use'语句:
--- 8< ---
EXEC('use ' + @databaseName + '
CREATE TRIGGER [dbo].[tgrDynamicTableTrigger]
ON
--- 8< ---
但是,在创建表时会产生以下错误:
Msg 111,Level 15,State 1,Line 2'CREATE TRIGGER'必须是第一个 查询批处理中的语句。
有什么想法吗?
我正在使用SQL Server 2014。
答案 0 :(得分:0)
我相信我已经弄清楚了,主要是感谢answer。
以下是代码:
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