--創建空數據庫
create database chl_fromempty
use chl_fromempty
--創建表存儲xml數據
create table chl_ddlevendate(fdata xml,fid int identity(1,1),fdatetime datetime default getdate())
--創建DDL觸發器獲取觸發事件的詳細信心
create trigger chl_tableddl_getdata on database
for create_table,alter_table,drop_table
as
insert into chl_ddlevendate(fdata) select EVENTDATA()
--測試,創建表
create table chl001(a int,b char(1),c date)
--查詢獲取到的XML
select * from chl_ddlevendate
--以下爲獲取到的xml的內容
<EVENT_INSTANCE>
<EventType>CREATE_TABLE</EventType>
<PostTime>2019-08-15T09:48:23.967</PostTime>
<SPID>61</SPID>
<ServerName>HANLIN-PC</ServerName>
<LoginName>sa</LoginName>
<UserName>dbo</UserName>
<DatabaseName>chl_fromempty</DatabaseName>
<SchemaName>dbo</SchemaName>
<ObjectName>chl001</ObjectName>
<ObjectType>TABLE</ObjectType>
<TSQLCommand>
<SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
<CommandText>create table chl001(a int,b char(1),c date)
</CommandText>
</TSQLCommand>
</EVENT_INSTANCE>
--關於EVENTDATA 函數
--https://docs.microsoft.com/zh-cn/sql/relational-databases/triggers/use-the-eventdata-function?view=sql-server-2017
--獲取節點的值和節點的信息
SELECT fdata.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') 獲取節點的值 from chl_ddlevendate
--結果
獲取節點的值
create table chl001(a int,b char(1),c date)
SELECT fdata.query('(/EVENT_INSTANCE/TSQLCommand)') 節點的信息 from chl_ddlevendate
--結果
節點的信息
<TSQLCommand><SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" /><CommandText>create table chl001(a int,b char(1),c date)
</CommandText></TSQLCommand>