Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2014在为表创建触发器的创建表上创建DDL触发器_Sql Server_Ddl - Fatal编程技术网

Sql server SQL Server 2014在为表创建触发器的创建表上创建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

我正在使用第三方工具创建数据库和表。我想在正在创建的其中一个表上设置触发器。我想我会尝试创建一个服务器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 
它在创建表时产生以下错误:

消息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问题。