SQL建立DDL觸發器

2021-09-10 15:49:43 字數 2290 閱讀 3954

當伺服器或資料庫中發生資料定義語言(ddl)事件時將被呼叫。如create,alter,drop等操作。如果要執行以下操作,可以使用ddl觸發器:

防止對資料庫架構進行更改

希望資料庫中發生某些情況以響應資料庫架構中的更改

要記錄資料庫架構中的更改或事件

use [xxhis_kf]

go/****** object: ddltrigger [ddl_log] script date: 09/12/2017 20:31:28 ******/

set ansi_nulls on

goset quoted_identifier on

gocreate trigger [ddl_log] on database

for ddl_database_level_events

asbegin

set nocount on;

declare @eventtxt xml,@eventtype varchar(50)=』』,@parame varchar(50)=』』,

@schemaname varchar(30)=』』,@objtype varchar(50)=』』,

@objname varchar(100)=』』,@sqltext varchar(max)=』』,

@sqltexts varchar(max)=』』,@stext varchar(max)=』』;

set @eventtxt=eventdata();

;with tab as(

select

@eventtxt as xmls

)select

@eventtype= xmls.value(』(/event_instance/eventtype)[1]』 ,『varchar(50)』 ) ,

@schemaname=xmls.value(』(/event_instance/schemaname)[1]』 ,『varchar(30)』 ) ,

@objtype= xmls.value(』(/event_instance/objecttype)[1]』 ,『varchar(50)』 ) ,

@objname= xmls.value(』(/event_instance/objectname)[1]』 ,『varchar(100)』) ,

@parame = xmls.value(』(/event_instance/parameters)[1]』 ,『varchar(100)』) ,

@sqltext=xmls.value(』(/event_instance/tsqlcommand)[1]』,『varchar(max)』)

from tab;

if @objname in(『proc_version_script』,『ddl_renametrigger』,『ddl_renametrigger』)

begin

–set @objname=『不能對』+@objname+『物件進行操作』;

– raiserror (@objname, 16,1);

–proc_version_script

return;

end;

if @eventtype in(『create_view』 ,『alter_view』 ,『drop_view』,

『create_trigger』 ,『alter_trigger』 ,『drop_trigger』,

『create_table』 ,『alter_table』 ,『drop_table』,

『create_function』 ,『alter_function』 ,『drop_function』,

『create_procedure』 ,『alter_procedure』 ,『drop_procedure』,

『create_synonym』 ,『drop_synonym』,

『create_index』 ,『alter_index』 ,『drop_index』

)insert into ddl_log

(eventtype,schemaname,objtype,objname,execdate,terminal)

select @eventtype,@schemaname,@objtype,@objname,sysdatetime(),host_name();

end;

goset ansi_nulls off

goset quoted_identifier off

godisable trigger [ddl_log] on database

goenable trigger [ddl_log] on database

go

DDL觸發器與DML觸發器比較

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

DDL觸發器的應用

一般來說,dml觸發器可以監測得到具體物件的具體資料的變更。然而,ddl觸發器則能夠對一些伺服器的行為作出監控,比如我們可以利用ddl觸發器來做登入限制啊,做一些日誌控制啊之類的。好,然後簡單粗暴上例子 首先我們做乙個監控建立表的觸發器,ddl觸發器,乙個關鍵點是在於 eventdata 這個函式提...

建立觸發器

視覺化資料庫工具 對於 microsoft sql server 資料庫,可以在 transact sql 中編寫觸發器,而對於 oracle 資料庫,則可以在 pl sql 中進行編寫。通過指定下列內容建立觸發器 建立觸發器 在 伺服器資源管理器 中,展開 表 資料夾。右擊要在其上建立觸發器的表名...