程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL2008 >> SQL Server 2008中的代碼平安(二) DDL觸發器與登錄觸發器

SQL Server 2008中的代碼平安(二) DDL觸發器與登錄觸發器

編輯:MSSQL2008

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觸發器審核數據庫級事宜


/***************
創立一個審核表,個中EventData是一個XML數據列
[email protected]
*******************/

USE master
GO
CREATE TABLE dbo.ChangeAttempt
(EventData xml NOT NULL,
AttemptDate datetime NOT NULL DEFAULT GETDATE(),
DBUser char(50) NOT NULL)
GO

/***************
在目的數據庫上創立一個觸發器,以記載該數據庫的索引變更舉措,
包含Create|alter|Drop
[email protected]
*******************/

CREATE TRIGGER db_trg_RestrictINDEXChanges
ON DATABASE
FOR CREATE_INDEX, ALTER_INDEX, DROP_INDEX
AS
SET NOCOUNT ON
INSERT dbo.ChangeAttempt
(EventData, DBUser)
VALUES (EVENTDATA(), USER)
GO

/***************
創立一個索引,以測試觸發器
[email protected]
*******************/

CREATE NONCLUSTERED INDEX 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 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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved