首先先上**,這個**主要的作用是如果使用者建立的表的名字不是mystu或者myuser 就阻止使用者建立表
create trigger ddl_tabletrigger
on database
for create_table
as declare @event xml
declare @tablesname varchar(1024)
set @event=eventdata();
set @[email protected]('(/event_instance/objectname)[1]', 'sysname')
if @tablesname<>'mystu' and @tablesname<>'myuser'
begin
print 'sorry,you are not dba'
rollback ;
end
首先這裡用了sql server的ddl觸發器,這個觸發器的作用是:使用者增刪改資料庫表,資料庫的時候觸發的事件,並且對該事件的乙個處理
這個ddl觸發器建立之後會在 可程式設計性->資料庫觸發器 的下面有顯示
這段**的關鍵點是:獲取使用者將要建立資料表的表名
好在微軟提供了乙個函式eventdata(),這個函式返回的是觸發事件後的所有影響到的引數(包括影響的資料庫,資料庫使用者,資料庫表,登陸名,時間 等),這個函式的返回是xml,因為返回的是xml,所以要對xml進行解析,所幸,sql server提供乙個類似於xpath的解析方式:
所以:
@event.value('(/event_instance/objectname)[1]', 'sysname')
就能得到受影響的表名
其他的:
@data.value('(/event_instance/posttime)[1]
', '
sysname
'), --受影響的時間
@data.value('
(/event_instance/servername)[1]
', '
sysname
'), --受影響的伺服器名
@data.value('
(/event_instance/loginname)[1]
', '
sysname
'), --受影響的登陸名
@data.value('
(/event_instance/username)[1]
', '
sysname
'), --受影響的使用者名稱
@data.value('
(/event_instance/databasename)[1]
', '
sysname
'), --受影響的資料庫名
@data.value('
(/event_instance/schemaname)[1]
', '
sysname
'), ---受影響的架構名
@data.value('
(/event_instance/objectname)[1]
', '
sysname
'), ---受影響的表名
@data.value('
(/event_instance/tsqlcommand)[1]
', '
nvarchar(max)
'), --受影響的sql語句
@data.value('
(/event_instance/eventtype)[1]
', '
sysname
'), --事件型別
最後的兩個操作是:輸出sorry,you are not dba
回滾並且阻止操作
參考
觸發器 mysql觸發器
觸發器是一種特殊的儲存過程,它在插入 刪除或修改特定表中的資料時觸發執行,它比資料庫本身標準的功能有更精細和更複雜的資料控制能力。和儲存過程一樣,很少使用。1 觸發器的作用 2 建立觸發器 建立測試環境 mysql create database test db query ok,1 row aff...
觸發器(五 復合觸發器)
oracle11g開始提供了一種復合觸發器,簡單的說就是支援把語句級和行級觸發器組合在一起。實際應用場景不多,這裡就做個記錄。與單個觸發器語法有所區別 1.單個觸發器的頭部是 before after 動作 on 物件 for 觸發級別 而組合觸發器的頭部是 for 動作 on 物件 compoun...
mysql觸發器when MySQL觸發器
set quoted identifier on goset ansi nulls on goalter trigger trg risks on dbo.projectrisk for insert,update asbegin update projectrisk set classificat...