DDL觸發器的應用

2021-07-11 15:06:02 字數 3666 閱讀 8447

一般來說,dml觸發器可以監測得到具體物件的具體資料的變更。然而,ddl觸發器則能夠對一些伺服器的行為作出監控,比如我們可以利用ddl觸發器來做登入限制啊,做一些日誌控制啊之類的。

好,然後簡單粗暴上例子

首先我們做乙個監控建立表的觸發器,ddl觸發器,乙個關鍵點是在於 eventdata() 這個函式提供的資訊。

create

trigger tr_createtable on

all server for

create_table

asbegin

select

eventdata();

endgo

在其他情況下,呼叫 eventdata(),它返回的恆定是乙個null值,然而,當在ddl觸發器裡面,它在作用就至關重大了,基本上需要捕獲的訊息,都可以通過這個函式獲取,這個對於這個函式,返回的結構可以參考如下

<

event_instance

>

<

eventtype

>create_table

eventtype

>

<

posttime

>2015-12-19t11:03:45.223

posttime

>

<

spid

>54

spid

>

<

servername

>in

servername

>

<

loginname

>sa

loginname

>

<

username

>dbo

username

>

<

databasename

>test

databasename

>

<

schemaname

>dbo

schemaname

>

<

objectname

>t1

objectname

>

<

objecttype

>table

objecttype

>

<

tsqlcommand

>

<

setoptions

ansi_nulls

="on"

ansi_null_default

="on"

ansi_padding

="on"

quoted_identifier

="on"

encrypted

="false"

/>

<

commandtext

>create table t1(id int)

commandtext

>

tsqlcommand

>

event_instance

>

要記錄的東西基本都有了。稍加處理,即可做成操作記錄了。

然後我們改造一下這個觸發器,變成新增修改表都要觸發,然後執行如下語句

alter

trigger tr_createtable on

all server for

create_table,alter_table

asbegin

select

eventdata();

select eventdata().value('

(event_instance/eventtype)[1]

','varchar(50)'),

eventdata().value(

'(event_instance/objectname)[1]

','varchar(50)');

endgo

alter table t1 add col1 varchar(50)

<

event_instance

>

<

eventtype

>alter_table

eventtype

>

<

posttime

>2015-12-19t11:19:21.947

posttime

>

<

spid

>54

spid

>

<

servername

>in

servername

>

<

loginname

>sa

loginname

>

<

username

>dbo

username

>

<

databasename

>test

databasename

>

<

schemaname

>dbo

schemaname

>

<

objectname

>t1

objectname

>

<

objecttype

>table

objecttype

>

<

altertableactionlist

>

<

create

>

<

columns

>

<

name

>col1

name

>

columns

>

create

>

altertableactionlist

>

<

tsqlcommand

>

<

setoptions

ansi_nulls

="on"

ansi_null_default

="on"

ansi_padding

="on"

quoted_identifier

="on"

encrypted

="false"

/>

<

commandtext

>alter table t1 add col1 varchar(50)

commandtext

>

tsqlcommand

>

event_instance

>

看,比前面新增table多出了  altertableactionlist 這個節點。所以說,不同的時間,顯示出來的格式都不一樣。可以做的東西也千變萬化,只是有一點,臨時物件不會觸發ddl觸發器。

ps:1、登入觸發器不能有返回結果集

2、登入觸發器不能執行出錯,慎重,不然就什麼都幹不了。(不要問我怎麼知道的)

3、任何功能都都有優點和缺點,只有最適合的,沒有最優的~麼麼麼噠

4、歡迎各位指教拍磚

DDL觸發器與DML觸發器比較

dml觸發器 要防止對資料庫架構進行某些更改。希望資料庫中發生某種情況以響應資料庫架構中的更改。要記錄資料庫架構中的更改或事件。僅在執行觸發 ddl 觸發器的 ddl 語句後,ddl 觸發器才會激發。ddl 觸發器無法作為 instead of 觸發器使用。下面的示例顯示如何使用 ddl 觸發器阻止...

SQL建立DDL觸發器

當伺服器或資料庫中發生資料定義語言 ddl 事件時將被呼叫。如create,alter,drop等操作。如果要執行以下操作,可以使用ddl觸發器 防止對資料庫架構進行更改 希望資料庫中發生某些情況以響應資料庫架構中的更改 要記錄資料庫架構中的更改或事件 use xxhis kf go object ...

DDL觸發器捕獲建表語句

sql2005 ddl觸發器捕獲激發觸發器的 transact sql 語句 create trigger safety on database for create table as select eventdata value event instance tsqlcommand command...