在SQL Server 2005的ddl觸發器中使用eventdata()函數

來源:互聯網
上載者:User

問題

在您的伺服器執行個體中,針對SQL Server 2005的提示裡,在運行資料定義語言 (Data Definition Language) (Create,Alter,Drop)的命令中,你就可以看到如何跟蹤DDL的活動,但我們如何 儲存這些事件,用來捕獲這些DDL觸發器並且儲存在表中為反饋的資訊呢?

Solution解決方案

在SQL Server 2005中 ,您可以通過訪問eventdata ( )函數,用來觸發ddl事 件而擷取資料。 這個函數返回的是伺服器或資料庫事件的資訊,並以XML資料類 型的方式儲存在一個變數中使用。 我們需要做的是捕捉eventdata ( )函數返回 的資料,並將它儲存在資料庫的表中為反饋的資訊。在把資料存放區在表中的列之 前,您可以把儲存的資料直接放在XML的一列或者過程中。

不過,由於返回的類型是XML ,我們需要運用的就是用XQuery所產生的資料的 功能,以確定XML元素資料的返回,關於事件使用的索引或搜尋相關的話題,請訪 問SQL Server的聯機叢書。 由於這個特殊技巧,我們將使用表有關的事件。 該 ddl_table_events類型說明什麼資料可以捕獲一個CREATE,ALTER或者DROP表的事 件。

讓我們來用Northwind資料庫來舉一個例子。 我們將建立一個表,將用來儲存 eventdata ( )函數傳回來的資料。 我們從ALTER_TABLE事件引起的架構中只將選 擇一些項目; 即在每個事件中包括TSQLCommand、PostTime、LoginName和 EventType這樣的欄位。

建立事件記錄表

USE NorthwindUSE Northwind
GO
CREATE TABLE EvtLog
(
PostTime DATETIME,
LoginName NVARCHAR(100),
EventType NVARCHAR(100),
TSQLCommand NVARCHAR(2000)
)
GO
GO

建立ddl觸發

CREATE TRIGGER trPreventTblChangeCREATE TRIGGER trPreventTblChange
ON DATABASE
FOR ALTER_TABLE
AS
DECLARE @Data XML
SET @Data = EventData()
INSERT EvtLog (PostTime, LoginName, EventType, TSQLCommand)
VALUES
(GETDATE(),
CONVERT(NVARCHAR(100), CURRENT_USER),
@Data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
@Data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
GO

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.