1. 程式人生 > >DML 觸發器、DDL 觸發器和登入觸發器

DML 觸發器、DDL 觸發器和登入觸發器

MicrosoftSQL Server 提供兩種主要機制來強制使用業務規則和資料完整性:約束和觸發器。觸發器為特殊型別的儲存過程,可在執行語言事件時自動生效。SQL Server 包括三種常規型別的觸發器:DML 觸發器DDL 觸發器登入觸發器

1、當資料庫中發生資料操作語言 (DML) 事件時將呼叫 DML 觸發器。DML 事件包括在指定表或檢視中修改資料的 INSERT 語句、UPDATE 語句或 DELETE 語句。DML 觸發器可以查詢其他表,還可以包含複雜的 Transact-SQL 語句。將觸發器和觸發它的語句作為可在觸發器內回滾的單個事務對待。如果檢測到錯誤(例如,磁碟空間不足),則整個事務即自動回滾。

2、當伺服器或資料庫中發生資料定義語言 (DDL) 事件時將呼叫 DDL 觸發器。DDL 觸發器是一種特殊的觸發器,它在響應資料定義語言 (DDL) 語句時觸發。它們可以用於在資料庫中執行管理任務,例如,稽核以及規範資料庫操作。

     示例一:建立一個DDL觸發器稽核資料庫級事件

複製程式碼 /***************
建立一個稽核表,其中EventData是一個XML資料列
[email protected]
******************
*/USE master
GOCREATETABLE dbo.ChangeAttempt
(EventData xml 
NOTNULL
,
AttemptDate 
datetimeNOTNULLDEFAULTGETDATE(),
DBUser 
char(50NOTNULL)
GO/***************
在目標資料庫上建立一個觸發器,以記錄該資料庫的索引變化動作,
包括Create|alter|Drop
[email protected]
******************
*/CREATETRIGGER db_trg_RestrictINDEXChanges
ONDATABASEFOR CREATE_INDEX, ALTER_INDEX, DROP_INDEX
ASSET NOCOUNT ONINSERT dbo.ChangeAttempt
(EventData, DBUser)
VALUES (EVENTDATA(), USER)
GO/***************
建立一個索引,以測試觸發器
[email protected]
******************
*/CREATENONCLUSTEREDINDEX ni_ChangeAttempt_DBUser ON
dbo.ChangeAttempt(DBUser)
GO/***************
檢視稽核記錄
[email protected]
******************
*/SELECT EventData
FROM dbo.ChangeAttempt



--------/***************
--
------刪除測試觸發器和記錄表
--
[email protected]
--
------*******************/----drop TRIGGER [db_trg_RestrictINDEXChanges]
--
--ON DATABASE
--
--go
--
--drop table dbo.ChangeAttempt
--
--go 複製程式碼

執行結果:

邀月工作室

    示例二:建立一個DDL觸發器稽核伺服器級事件 

複製程式碼 --------/***************
--
------在目標資料庫伺服器上建立一個觸發器,以防止新增登入賬號,
--
[email protected]
--
------*******************/USE master
GO-- Disallow new Logins on the SQL instanceCREATETRIGGER srv_trg_RestrictNewLogins
ONALL SERVER
FOR CREATE_LOGIN
ASPRINT'No login creations without DBA involvement.'ROLLBACKGO--------/***************
--
------試圖建立一個登入賬號
--
[email protected]
--
------*******************/CREATE LOGIN johny WITH PASSWORD ='123456'GO--------/***************
--
------刪除演示觸發器
--
[email protected]
--
------*******************/dropTRIGGER srv_trg_RestrictNewLogins
ONALL SERVER
go 複製程式碼

效果:

邀月工作室

注意:要特別謹慎使用DDL觸發器。如果設定不當,將會在資料庫級甚至伺服器級引發不可預知的後果。

如果你有這樣的需求:在某個特定的時間只允許某個賬號登入伺服器(如單位和家裡使用不同的賬號遠端登入伺服器),那麼登入觸發器是一個不錯的選擇。

    示例三:建立一個登入觸發器稽核登入事件

複製程式碼 --------/***************
--
------建立登入賬號
--
[email protected]
--
------*******************/CREATE LOGIN nightworker WITH PASSWORD ='123b3b4'GO--------/***************
--
------演示資料庫和稽核表
--
[email protected]
--
------*******************/CREATEDATABASE ExampleAuditDB
GOUSE ExampleAuditDB
GOCREATETABLE dbo.RestrictedLogonAttempt
(LoginNM sysname 
NOTNULL,
AttemptDT 
datetimeNOTNULL)
GO--------/***************
--
------建立登入觸發器,如果不是在7:00-17:00登入,則記錄稽核日誌,並提示失敗
--
[email protected]
--
------*******************/USE master
GOCreateTRIGGER trg_logon_attempt
ONALL SERVER
WITHEXECUTEAS'sa'FOR LOGON
ASBEGINIF ORIGINAL_LOGIN()='nightworker'ANDDATEPART(hh,GETDATE()) BETWEEN7AND17BEGINROLLBACKINSERT ExampleAuditDB.dbo.RestrictedLogonAttempt
(LoginNM, AttemptDT)
VALUES (ORIGINAL_LOGIN(), GETDATE())
ENDENDGO--------/***************
--
------檢視稽核記錄
--
[email protected]
--
------*******************/USE ExampleAuditDB
GOselect*from dbo.RestrictedLogonAttempt
go--------/***************
--
------刪除演示資料庫及演示觸發器
--
[email protected]
--
------*******************/use master
godropTRIGGER trg_logon_attempt
ONALL SERVER
godropdatabase ExampleAuditDB
go 複製程式碼

結果:

邀月工作室

邀月工作室

當然,你也可以使用應用程式或類似於log4net的日誌機制記錄類似的登入事件,但SQL server 2008已經為我們做到了,你所做的僅僅是有勇氣來試一試。

小結:作為對資料DDL操作和登入事件的稽核和監控,SQL Server提供了比較完善的事件處理機制。這也是SQL server安全機制的一部分。下文將涉及SQL server資料庫級的透明加密,敬請關注。

相關推薦

DML 觸發器DDL 觸發器登入觸發器

MicrosoftSQL Server 提供兩種主要機制來強制使用業務規則和資料完整性:約束和觸發器。觸發器為特殊型別的儲存過程,可在執行語言事件時自動生效。SQL Server 包括三種常規型別的觸發器:DML 觸發器、DDL 觸發器和登入觸發器。 1、當資料庫中發生

Oracle loop循環while循環for循環if選擇case選擇更改讀取數據遊標觸發器存儲過程

bsp 邏輯或 pda 傳遞依賴 函數 名稱 執行 count 記錄 數據庫的設計(DataBase Design): 針對於用戶特定的需求,然後我們創建出來一個最使用而且性能高的數據庫! 數據庫設計的步驟: 01.需求分析 02.概念

觸發器事務

分享 刪除 llb blog exists 技術 eat values 繼續 觸發器是與表相關的數據對象,在滿足條件時觸發,可以協助應用在數據庫端保證數據的完整性 觸發器只能創建在永久表上,不能用於臨時表(create temporary table ) create tr

觸發器中的inserteddeletedupdate

一﹕ 觸發器是一種特殊的儲存過程﹐它不能被顯式地呼叫﹐而是在往表中插入記錄﹑更新記錄或者刪除記錄時被自動地啟用。所以觸發器可以用來實現對錶實施複雜的完整性約`束。二﹕ SQL Server為每個觸發器都建立了兩個專用表﹕Inserted表和Deleted表。這兩個表由系統來

sqlite 檢視觸發器索引事務總結

一 檢視 檢視即虛擬表,它的內容都是派生自其他表的查詢結果,雖然看起來像基本表,但不是基本表,因為檢視的內容是動態生成的。 檢視的用處是將頻繁使用的複雜的查詢放進一個虛擬表,方便查詢。 建立檢視 creat view name as select-stm

索引檢視遊標儲存過程觸發器的理解

1、索引        1-1、索引的概述                 我們把一個表中的一列或者多列和列中元素所在表中記錄的實體地址組合成一個新的表。這個表的記錄大致為列的內容和該列所在記錄的實體地址。        1-2、索引的優缺點   www.2cto.com                  優

檢視儲存過程函式以及觸發器

一、檢視1.檢視的定義檢視是一種虛擬存在的表,它本身在資料庫中並不存在,而是在我們出於某種目的想要去使用檢視的時候,使用我們資料庫中已經存在的表的行和列資料來自定義的一種動態生成的,便於檢索的安全的資料獨立的一種虛擬表。2.優點①簡單。檢視是一種已經經過過濾篩選之後的符合條件

Oracle的觸發器序列預設值sql約束的建立刪除

--建立表時,設定是否為空,是否有預設值(DEFAULT) create table SITE_TEA_CALLER ( ID NUMBER(8) not null, TEACHE

PostgreSQL環境下,觸發器索引角色的建立

建立表觸發器的SQL語句 CREATE TRIGGER example_trigger BEFORE INSERT ON tea

數據庫存儲過程觸發器連接

upd 事件 連接 存儲 安全 for after 相關 用戶 存儲過程:存儲過程就是編譯好了的一些sql語句。1.存儲過程因為SQL語句已經預編繹過了,因此運行的速度比較快。2. 可保證數據的安全性和完整性。通過存儲過程可以使沒有權限的用戶在控制之下間接地存取數據庫,從

FPGA基礎知識(四)鎖存器觸發器寄存器和緩沖器的區別

高端 指示器 領域 串行 方法 register 緩沖區 計算機 字節 一、鎖存器鎖存器(latch)---對脈沖電平敏感,在時鐘脈沖的電平作用下改變狀態鎖存器是電平觸發的存儲單元,數據存儲的動作取決於輸入時鐘(或者使能)信號的電平值,僅當鎖存器處於使能狀態時,輸出才會隨著

SQL server觸發器存儲過程操作遠程數據庫插入數據,解決服務器已存在的問題

定義 ims val rom 記錄 插入記錄 其它 pre 項目 近期弄了一個小項目,也不是非常復雜,須要將一個數據庫的一些數據備份到另外一個庫。不是本地,可能是網絡上其它的數據庫。想了一下,用了存儲過程和觸發器。也不是非常復雜,首先我須要操作遠程數據庫,於是寫了一個存

mysql觸發器(Trigger)簡明總結使用實例

clas 一個表 喜歡 更改 code 多個 重要 個人理解 一行 一,什麽觸發器 1,個人理解觸發器,從字面來理解,一觸即發的一個器,簡稱觸發器(哈哈,個人理解),舉個例子吧,好比天黑了,你開燈了,你看到東西了。你放炮仗,點燃了,一會就炸了。2,官方定義觸發器(trigg

python-day48--mysql之視圖觸發器事務存儲過程函數

3-9 func 部分 負責 lap str1 mar 可執行 sele 一、視圖(不推薦使用) 1).視圖是一個虛擬表(非真實存在) 2).使用視圖我們可以把查詢過程中的臨時表摘出來,用視圖去實現,這樣以後再想操作該臨時表的數據時就無需重寫復雜的sql了,直接去視圖中查找

mysql數據庫從刪庫到跑路之mysql:視圖觸發器事務存儲過程函數

存儲過程、函數 命名 復雜 使用 耦合 查找 根據 數據集 並且 一 視圖 視圖是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的數據集,並為其命名】,用戶使用時只需使用【名稱】即可獲取結果集,可以將該結果集當做表來使用。 使用視圖我們可以把查詢過程中的臨時表摘

MySQL數據庫學習【第十篇】(視圖觸發器事物)

註意 onf action 聲明 concat_ws base 循環 5-0 print 一、視圖 視圖是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的數據集,並為其命名】,用戶使用時只需使用【名稱】即可獲取結果集,可以將該結果集當做表來使用。 使用視圖我們可

mysql七:視圖觸發器事務存儲過程函數

mysql視圖、觸發器、事務、存儲過程一、視圖視圖是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的數據集,並為其命名】,用戶使用時只需使用【名稱】即可獲取結果集,可以將該結果集當做表來使用。 使用視圖我們可以把查詢過程中的臨時表摘出來,用視圖去實現,這樣以後再想操作該臨時表的數據時就無需重

5月14日 python學習總結 視圖觸發器事務存儲過程函數流程控制索引

頻繁 表結構 可執行 開頭 好處 你在 get 16進制轉換 自帶 一、視圖 1、什麽是視圖 視圖就是通過查詢得到一張虛擬表,然後保存下來,下次用的直接使用即可 2、為什麽要用視圖 如果要頻繁使用一張虛擬表,可以不用重復查詢 3、如何用視圖 create vie

oracle索引視圖存儲過程觸發器oracle數據類型

real 輸出數據 image gin demo 同名 全表掃描 cas 業務規則 1、索引:索引是幫助用戶在表中快速地找到記錄的數據庫結構。 a) 自動創建索引:當你為一張表定義主關鍵或唯一性約束條件時一個惟一的索引就已經被創建了。 b) 手動創建索引: 用戶可以自己創建

mysql-視圖觸發器事務存儲過程流程控制

沖突 hid png -s name 新的 update pro def 目錄 視圖 觸發器 事務 存儲過程 流程控制 一、視圖 視圖是由查詢結果構成的一張虛擬表,和真實的表一樣,帶有名稱的列和行數據 強調:視圖是永久存儲的,但是視圖存儲的不是數據,