我正在處理一些敏感的會計表,我想審覈在表格上執行的任何SELECT
語句或與其關聯的任何視圖。無論如何爲「SELECT」語句創建SQL Server DDL觸發器?
我在BOL(聯機叢書)上找不到與SELECT
聲明有關的任何DDL Events。 而DML觸發器僅適用於INSERT
,UPDATE
和DELETE
。
是否可以通過SELECT
聲明記錄誰訪問表和視圖?
我正在處理一些敏感的會計表,我想審覈在表格上執行的任何SELECT
語句或與其關聯的任何視圖。無論如何爲「SELECT」語句創建SQL Server DDL觸發器?
我在BOL(聯機叢書)上找不到與SELECT
聲明有關的任何DDL Events。 而DML觸發器僅適用於INSERT
,UPDATE
和DELETE
。
是否可以通過SELECT
聲明記錄誰訪問表和視圖?
你有3種選擇:
我會去選擇1或2,因爲他們是你的應用程序和自我的一部分包含。
雖然這聽起來有點遲,開始記錄:訪問表應該被限制在前面。
此外,如果最終用戶不直接更正(例如通過Web服務器或服務帳戶),任何解決方案都會失敗。除非你使用存儲的特效中端用戶名發送...
查看示例:
CREATE VIEW dbo.MyTableMask
AS
SELECT *
FROM
MyTable
CROSS JOIN
(SELECT 1 FROM SecurityList WHERE name = SUSER_SNAME())
--WHERE could use NOT EXISTS too with table
GO
SQL Server 2008中審計可以能夠捕捉到它。除此之外,Profiler/Tracing是SQL Server中唯一可以實現的功能。
是的,有可能通過在AUDIT_DATABASE_OBJECT_ACCESS_EVENT事件創建Event Notification。儘管如此,做這樣的事情的代價是巨大的。
使用audit infrastructure或使用gbn建議的自定義訪問包裝要好得多。
我還沒有聽說過事件通知,這聽起來很有希望。 – Sung 2009-10-04 21:19:52
我必須再次強調,爲數據庫中的每個對象訪問檢查生成一個事件將是非常重量級的。 – 2009-10-04 23:32:12
--In the master database create a server audit
USE master
GO
CREATE SERVER AUDIT [Audit_Select_HumanResources_Employee]
TO FILE
( FILEPATH = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup'
,MAXSIZE = 0 MB
,MAX_ROLLOVER_FILES = 2147483647
,RESERVE_DISK_SPACE = OFF)
WITH
(QUEUE_DELAY = 1000, state= on)
ALTER SERVER AUDIT Audit_Select_HumanResources_Employee
WITH (STATE = ON) ;
GO
--In the database to monitor create a database audit
USE [AdventureWorks2012]
go
CREATE DATABASE AUDIT SPECIFICATION [Database-Audit]
FOR SERVER AUDIT [Audit_Select_HumanResources_Employee]
--In this example, we are monitoring the humanResources.employee
ADD (SELECT ON OBJECT::[HumanResources].[Employee] BY [dbo])
with (state=on)
--Now you can see the activity in the audit file created
SELECT * FROM sys.fn_get_audit_file ('c:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\Audit_Select_HumanResources_Employee.sqlaudit',default,default);
GO
我只是增加了一些代碼爲你。代碼創建服務器審計,選擇活動的數據庫審計,最後使用sys.fn_get_audit_file從文件中檢索信息。您必須爲每個表單獨執行此操作。如果您想要更自動化的查詢,則可以使用其他工具,如Apex SQL Audit或您偏好的其他第三方工具。
CREATE PROCEDURE sp_Product_Select @User_Name VarChar(128), @ID Int AS INSERT INTO My_Trace_Table (Table_Name, User_Name, Table_ID, Select_DateTime) VALUES ('Products', @User_Name, @ID, GetDate()) SELECT * FROM Products WHERE ID = @ID RETURN GO
這不是一個觸發器。 – 2018-01-08 16:41:52
我也一直在尋找到SQL Server 2008的審覈,但不幸的是,我現在處理的SQL Server 2005。我想知道是否可以從開發服務器(2008)創建生產服務器(2005)的鏈接,然後使用審計。 – Sung 2009-10-04 21:15:32
此外,它只是企業。 – Oliver 2013-06-28 19:52:03