Sql-Server

使用變數 Select 和 Order by 觸發

  • December 15, 2019

有沒有辦法設置觸發器,一旦創建新表就會啟動並獲取新表名稱?我能夠提出下面的查詢,但它只能按字母順序而不是按創建日期獲取第一個查詢

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

你不看sys.tables那個……即使你創建了最後一個,在一個繁忙的系統上,你怎麼知道其他人最近沒有創建一個?隨之TOP而來ORDER BY的是,以下方法可能在大多數情況下都有效,但這是一個完全壞主意:

SELECT TOP (1) @table = name FROM sys.tables ORDER BY create_date DESC;

不,相反,您需要從以下位置提取表名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

引用自:https://dba.stackexchange.com/questions/218094