2009-10-04 58 views

回答

9

你有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 
1

SQL Server 2008中審計可以能夠捕捉到它。除此之外,Profiler/Tracing是SQL Server中唯一可以實現的功能。

+0

我也一直在尋找到SQL Server 2008的審覈,但不幸的是,我現在處理的SQL Server 2005。我想知道是否可以從開發服務器(2008)創建生產服務器(2005)的鏈接,然後使用審計。 – Sung 2009-10-04 21:15:32

+0

此外,它只是企業。 – Oliver 2013-06-28 19:52:03

10

是的,有可能通過在AUDIT_DATABASE_OBJECT_ACCESS_EVENT事件創建Event Notification。儘管如此,做這樣的事情的代價是巨大的。

使用audit infrastructure或使用gbn建議的自定義訪問包裝要好得多。

+0

我還沒有聽說過事件通知,這聽起來很有希望。 – Sung 2009-10-04 21:19:52

+5

我必須再次強調,爲數據庫中的每個對象訪問檢查生成一個事件將是非常重量級的。 – 2009-10-04 23:32:12

2
--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或您偏好的其他第三方工具。

0
 
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 
+0

這不是一個觸發器。 – 2018-01-08 16:41:52