SQL Server 2014在Create Table上创建DDL触发器,为表创建触发器

时间:2018-05-23 20:51:28

标签: sql-server ddl

我正在使用创建数据库和表格的第三方工具。我想在其中一个表上创建一个触发器。我以为我会尝试创建一个服务器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。

1 个答案:

答案 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