SQL Server 2008中的代碼平安(二) DDL觸發器與登錄觸發器。本站提示廣大學習愛好者:(SQL Server 2008中的代碼平安(二) DDL觸發器與登錄觸發器)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server 2008中的代碼平安(二) DDL觸發器與登錄觸發器正文
本文重要 觸及DDL觸發器和登錄觸發器的運用實例。
MicrosoftSQL Server 供給兩種重要機制來強迫應用營業規矩和數據完全性:束縛和觸發器。觸發器為特別類型的存儲進程,可在履行說話事宜時主動失效。SQL Server 包含三種慣例類型的觸發器:DML 觸發器、DDL 觸發器和登錄觸發器。
1、當數據庫中產生數據操作說話 (DML) 事宜時將挪用 DML 觸發器。DML 事宜包含在指定表或視圖中修正數據的 INSERT 語句、UPDATE 語句或 DELETE 語句。DML 觸發器可以查詢其他表,還可以包括龐雜的 Transact-SQL 語句。將觸發器和觸發它的語句作為可在觸發器內回滾的單個事務看待。假如檢測到毛病(例如,磁盤空間缺乏),則全部事務即主動回滾。
關於DML觸發器運用最為普遍。這裡不再贅述。MSDN官方解釋:http://msdn.microsoft.com/zh-cn/library/ms189799.aspx
2、當辦事器或數據庫中產生數據界說說話 (DDL) 事宜時將挪用 DDL 觸發器。DDL 觸發器是一種特別的觸發器,它在呼應數據界說說話 (DDL) 語句時觸發。它們可以用於在數據庫中履行治理義務,例如,審核和標准數據庫操作。
上面我們用舉例解釋DDL觸發器(http://technet.microsoft.com/zh-cn/library/ms189799%28SQL.90%29.aspx)的運用:
示例一:創立一個DDL觸發器審核數據庫級事宜
履行成果:
示例二:創立一個DDL觸發器審核辦事器級事宜
--------/***************
--------在目的數據庫辦事器上創立一個觸發器,以避免添加登錄賬號,
[email protected]
--------*******************/
USE master
GO
-- Disallow new Logins on the SQL instance
CREATE TRIGGER srv_trg_RestrictNewLogins
ON ALL SERVER
FOR CREATE_LOGIN
AS
PRINT 'No login creations without DBA involvement.'
ROLLBACK
GO
--------/***************
--------試圖創立一個登錄賬號
[email protected]
--------*******************/
CREATE LOGIN johny WITH PASSWORD = '123456'
GO
--------/***************
--------刪除演示觸發器
[email protected]
--------*******************/
drop TRIGGER srv_trg_RestrictNewLogins
ON ALL SERVER
go
後果:
留意:要特殊謹嚴應用DDL觸發器。假如設置欠妥,將會在數據庫級乃至辦事器級激發弗成預知的效果。
3、登錄觸發器(http://msdn.microsoft.com/zh-cn/library/bb326598.aspx)將為呼應 LOGON 事宜而激起存儲進程。與 SQL Server 實例樹立用戶會話時將激發此事宜。
假如你有如許的需求:在某個特定的時光只許可某個賬號登錄辦事器(如單元和家裡應用分歧的賬號長途登錄辦事器),那末登錄觸發器是一個不錯的選擇。
示例三:創立一個登錄觸發器審核登錄事宜
--------/***************
--------創立登錄賬號
[email protected]
--------*******************/
CREATE LOGIN nightworker WITH PASSWORD = '123b3b4'
GO
--------/***************
--------演示數據庫和審核表
[email protected]
--------*******************/
CREATE DATABASE ExampleAuditDB
GO
USE ExampleAuditDB
GO
CREATE TABLE dbo.RestrictedLogonAttempt
(LoginNM sysname NOT NULL,
AttemptDT datetime NOT NULL)
GO
--------/***************
--------創立登錄觸發器,假如不是在7:00-17:00登錄,則記載審核日記,並提醒掉敗
[email protected]
--------*******************/
USE master
GO
Create TRIGGER trg_logon_attempt
ON ALL SERVER
WITH EXECUTE AS 'sa'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()='nightworker' AND
DATEPART(hh,GETDATE()) BETWEEN 7 AND 17
BEGIN
ROLLBACK
INSERT ExampleAuditDB.dbo.RestrictedLogonAttempt
(LoginNM, AttemptDT)
VALUES (ORIGINAL_LOGIN(), GETDATE())
END
END
GO
--------/***************
--------檢查審核記載
[email protected]
--------*******************/
USE ExampleAuditDB
GO
select * from dbo.RestrictedLogonAttempt
go
--------/***************
--------刪除演示數據庫及演示觸發器
[email protected]
--------*******************/
use master
go
drop TRIGGER trg_logon_attempt
ON ALL SERVER
go
drop database ExampleAuditDB
go
成果:
固然,你也能夠應用運用法式或相似於log4net的日記機制記載相似的登錄事宜,但SQL server 2008曾經為我們做到了,你所做的僅僅是有勇氣來試一試。
小結:作為對數據DDL操作和登錄事宜的審核和監控,SQL Server供給了比擬完美的事宜處置機制。這也是SQL server平安機制的一部門。下文將觸及SQL server數據庫級的通明加密,敬請存眷。
http://www.cnblogs.com/downmoon