使用变量 Select 和 Order by 触发

Rox*_*afa 1 trigger sql-server table

有没有办法设置触发器,它会在创建新表后激活并获取新表名称?我能够提出下面的查询,但它只能按字母顺序获取第一个查询,而不是按创建日期

CREATE TRIGGER CreateTable
ON DATABASE
    FOR CREATE_TABLE
AS
     DECLARE
       @table varchar(max);
     SELECT  top 1  @table =   [name] FROM sys.tables 
     insert into NewTable values(@table)
     ;
     end
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 6

你不注意sys.tables那个......即使你创建了最后一个,在一个繁忙的系统上,你怎么知道其他人最近没有创建一个?随着TOP来,ORDER BY所以下面的大部分时间可能会起作用,但这是一个完全坏的主意:

SELECT TOP (1) @table = name FROM sys.tables ORDER BY create_date DESC;
Run Code Online (Sandbox Code Playgroud)

不,相反,您需要从EVENTDATA()以下位置提取表名:

CREATE TRIGGER CreateTable
ON DATABASE
FOR CREATE_TABLE
AS
BEGIN
    DECLARE
      @sql       nvarchar(MAX),
      @EventData xml = EVENTDATA();

    ;WITH x(s,o) 
    AS
    (
      SELECT
        @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]',  'nvarchar(128)'), 
        @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]',  'nvarchar(128)')
    )
    INSERT dbo.NewTable(ColumnName)
      SELECT QUOTENAME(s) + N'.' + QUOTENAME(o)
      FROM x;
END
GO
Run Code Online (Sandbox Code Playgroud)