2011-11-15 79 views
1

聲明:我無法在應用程序中正確實現它,因爲我正在處理的應用程序不會以一致的方式執行數據訪問,並且重構工作對於項目範圍和截止日期的限制太大。SQLCLR觸發器或審計跟蹤存儲過程的可行性?

我該如何執行SQLCLR觸發器進行審計跟蹤?我希望它儘可能簡單,,並儘可能容易地刪除和替換適當的實施

我計劃我的審計寫入一個表(數據庫也不是很沉重的寫),有喜歡的列:

  • 時間戳(datetime) - 當變化發生了什麼?
  • 用戶名(varchar) - 誰進行了更改?
  • AffectedTableName(varchar) - 哪張表受到了影響?
  • AffectedRowKey(varchar) - 這將是要麼喜歡(Id=42A=4,B=2)的簡單或複合鍵
  • OperationType(char(1)) - 要麼IUD用於插入,更新和刪除分別。
  • InsertedXml(xml) - XML序列化行(SELECT * FROM INSERTED FOR XML AUTO
  • DeletedXml(xml) - XML序列化行(SELECT * FROM DELETED FOR XML AUTO

我打算查詢和這個數據解析爲一個用戶在應用程序中可讀的形式。我打算將此作爲一個使用SQLCLR編寫的數據庫觸發器來實現。我可以看到2種可能的方法:

  • 實現此完全作爲SqlTrigger方法:
  • 實現此作爲SqlProcedure方法服用參數:
    • SCHEMANAME
    • TABLENAME
    • insertedXml
    • deletedXml

我會很感激任何建設性的批評和建議。我的限制是我必須使用觸發器在數據庫級別實施審計,並且我希望它儘可能可維護(可讀取:可移動和可替換)。理想情況下,我不想擁有數百個完全相同的觸發器,以防我需要修改它們。

回答

1

我一直在使用這個腳本的變化,以創建審計現在從我的一些項目的觸發一段時間很大的成績:

http://www.simple-talk.com/sql/database-administration/pop-rivetts-sql-server-faq-no.5-pop-on-the-audit-trail/

+1

將「@ sql」移到while循環的外面,並將其替換爲插入和刪除的變量,然後在while循環之後僅使用插入和刪除變量(例如上面的模式)來僅取出一次'@ sql'。對不起,但我沒有時間超過這個小提示...祝你好運。 – ShaneBlake

+0

謝謝,我會盡力的。 –

2

有在SQLCLR一個嚴重的限制,觸發將阻止您在SQLCLR中實現您的審計觸發器:您無法找到在SQLCLR觸發器內更改了哪個父對象。即如果您有一個註冊到多個表的單個SQLCLR觸發器例程,則無法找到哪個表被更新/插入/刪除。乍一看,@@ procID可能看起來有用,但是當從SQLCLR觸發器中調用時,無論哪個表受到影響,@@ procid都會返回相同的值。我搜索了互聯網並進行了很多實驗,但我還沒有找到解決方案。我發現更多的人有同樣的問題。某些消息可追溯至2006年。

我在Microsoft Connect上創建了與Microsoft有關的功能請求。請登錄並按下UP箭頭以實現它,以便您實際上可以使用SQLCLR觸發器來實現您的目的:https://connect.microsoft.com/SQLServer/feedback/details/768358/a-sqlclr-trigger-should-be-given-the-parent-object-in-the-sqltriggercontext