SQL Server 2005中的DDL觸發器的實現
在sql server 2000中,只能為針對表發出的 DML 語句(INSERT、UPDATE 和 DELETE)定義 AFTER 觸發器。SQL Server 2005 可以就整個伺服器或資料庫的某個範圍為 DDL 事件定義觸發器。[@more@]
可以為單個 DDL 語句(例如,CREATE_TABLE)或者為一組語句(例如,DDL_DATABASE_LEVEL_EVENTS)定義 DDL 觸發器。在該觸發器內部,您可以透過訪問 eventdata() 函式獲得與激發該觸發器的事件有關的資料。該函式返回有關事件的 XML 資料。每個事件的架構都繼承了 Server Events 基礎架構。
比如,在SQL SERVER 2005中,建立一個叫DDLTrTest 的資料庫,並且建立一個叫mytable的表
和Usp_Querymytable 的儲存過程,如下所示
DROP DATABASE [DDLTRTEST]
GO
CREATE DATABASE DDLTRTEST
GO
USE [DDLTRTEST]
GO
IF EXISTS (SELECT * FROM SYS.OBJECTS
WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[MYTABLE]')
AND TYPE IN (N'U'))
DROP TABLE [DBO].[MYTABLE]
GO
CREATE TABLE MYTABLE(ID INT, NAME VARCHAR(100))
GO
INSERT INTO MYTABLE SELECT 1,'A'
INSERT INTO MYTABLE SELECT 2,'B'
INSERT INTO MYTABLE SELECT 3,'C'
INSERT INTO MYTABLE SELECT 4,'D'
INSERT INTO MYTABLE SELECT 5,'E'
INSERT INTO MYTABLE SELECT 6,'F'
GO
USE [DDLTrTest]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id =
OBJECT_ID(N'[dbo].[usp_querymytable]')
AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[usp_querymytable]
GO
CREATE PROC USP_QUERYMYTABLE
AS
SELECT * FROM MYTABLE
GO
接下來定義一個DDL觸發器如下
CREATE TRIGGER STOP_DDL_on_Table_and_PROC
ON DATABASE
FOR CREATE_TABLE,DROP_TABLE,
ALTER_TABLE,CREATE_PROCEDURE,
ALTER_PROCEDURE,DROP_PROCEDURE
AS
SELECT EVENTDATA().value
('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]',
'nvarchar(max)')
PRINT 'You are not allowed to CREATE,ALTER and DROP
any Tables and Procedures'
ROLLBACK;
接下來,我們嘗試如下的操作:
ALTER TABLE MYTABLE ADD X INT
結果如下,出現錯誤提示
ALTER TABLE MYTABLE ADD X INT
(1 row(s) affected)
You are not allowed to CREATE,ALTER and DROP any Tables and Procedures
Msg 3609, Level 16, State 2, Line 1
The transaction ended in the trigger. The batch has been aborted.
再執行DROP的操作,同樣觸發警告
DROP TABLE MYTABLE
(1 row(s) affected)
You are not allowed to CREATE,ALTER and DROP any Tables and Procedures
Msg 3609, Level 16, State 2, Line 1
The transaction ended in the trigger. The batch has been aborted.
因為我們的觸發器規定了不能使用CREATE_TABLE,DROP_TABLE,
ALTER_TABLE,CREATE_PROCEDURE,
ALTER_PROCEDURE,DROP_PROCEDURE等操作。 如果我們要關掉這個觸發器,可以這樣做: DISABLE TRIGGER STOP_DDL_ON_TABLE_AND_PROC
ON DATABASE 當然,我們要對整個伺服器採取策略的話,也是很簡單的,和上面的方法大致相同只不過將on database的引數改為on server,比如 CREATE TRIGGER STOP_DDL_on_Table_and_PROC
ON ALL SERVER
FOR CREATE_DATABASE,ALTER_DATABASE,DROP_DATABASE
AS
PRINT 'You are not allowed to CREATE,ALTER and DROP any Databases'
ROLLBACK;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/66009/viewspace-870307/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server 2005中使用DDL觸發器監控資料庫變化SQLServer觸發器資料庫
- SQL Server 2005系列教學_ 觸發器SQLServer觸發器
- 瞭解SQL Server觸發器及觸發器中的事務AWSQLServer觸發器
- SQL Server 觸發器SQLServer觸發器
- SQL Server觸發器SQLServer觸發器
- sql-server觸發器SQLServer觸發器
- Sql Server系列:觸發器SQLServer觸發器
- 淺談SQL Server觸發器的使用SQLServer觸發器
- 關於SQL SERVER觸發器的理解SQLServer觸發器
- 用SQL Server觸發器實現業務規則的強制執行SQLServer觸發器
- 【SQL Server】-- 一觸即發之觸發器SQLServer觸發器
- 在SQL Server 2005中實現表的行列轉換SQLServer
- SQL Server:觸發器詳解SQLServer觸發器
- SQL Server 觸發器的修改與刪除SQLServer觸發器
- ORACLE DDL觸發器Oracle觸發器
- oracle ddl 觸發器Oracle觸發器
- SQL Server中類似Oracle中before觸發器SQLServerOracle觸發器
- SQL Server 觸發器詳情HOPPSQLServer觸發器
- SQL server觸發器簡單示例SQLServer觸發器
- DML操作 DDL觸發器觸發器
- SQL Server 2005快速Web分頁的實現SQLServerWeb
- SQL Server 2000中的觸發器使用SQLServer觸發器
- 利用Sql server 2005的資料庫觸發器開發的資料庫稽核追蹤系統SQLServer資料庫觸發器
- SQL Server 2005中修改 Server Collation的方法SQLServer
- SQL Server約束和DML觸發器的比較SQLServer觸發器
- SQL Sever 2000中的前觸發器和後觸發器SQL觸發器
- 淺入淺出SQL Server 觸發器SQLServer觸發器
- Oracle 觸發器 限制DDL操作Oracle觸發器
- SQL Server實戰五:儲存過程與觸發器SQLServer儲存過程觸發器
- 透過觸發器禁止模式物件的DDL操作觸發器模式物件
- Oracle資料庫DDL審計觸發器觸發的bug問題Oracle資料庫觸發器
- SQL Server資料庫級別觸發器SQLServer資料庫觸發器
- Microsoft SQL Server 2005 中的國際功能ROSSQLServer
- oracle 觸發器實現禁止在資料庫中建立dblink ---透過觸發器實現Oracle觸發器資料庫
- 在SQL Server 2005資料庫中實現自動備份SQLServer資料庫
- SQL觸發器SQL觸發器
- 資料庫觸發器,禁止DDL操作資料庫觸發器
- SQL Server 2005中的模板引數的利用方法SQLServer