2009-10-04 5 views
8

Ich habe mit einigen sensiblen Accounting-Tabellen zu tun, und ich würde gerne eine SELECT Anweisung, die auf der Tabelle ausgeführt wird, oder alle damit verbundenen Ansichten überprüfen.Wie auch immer, um einen SQL Server DDL-Trigger für "SELECT" -Anweisungen zu erstellen?

Ich habe keine DDL Events auf BOL (Books Online) gefunden, die irgendetwas mit SELECT Aussage zu tun hatte. Und DML-Trigger sind nur für INSERT, UPDATE und DELETE.

Ist es möglich, zu protokollieren, wer auf Tabelle und Ansichten über SELECT Anweisung zugreift?

Antwort

9

Sie haben 3 Optionen:

  • erlauben über gespeicherte Prozeduren Zugriff, wenn Sie protokollieren möchten (und Tabelle Rechte entfernen)
  • den Tisch hinter einer Ansicht ausblenden, wenn Sie beschränken und halten „direkte“ wollen Zugang
  • Lauf eine dauerhafte Spur

ich für Optionen 1 oder 2 gehen würde, weil sie enthalten Teil Ihrer Anwendung und Selbst sind.

Das hört sich zwar ein wenig spät an, um mit der Protokollierung zu beginnen: Der Zugriff auf den Tisch sollte zuvor eingeschränkt worden sein.

Außerdem schlägt jede Lösung fehl, wenn Endbenutzer nicht direkt korrigieren (z. B. über Webserver oder Dienstkonto). Es sei denn, Sie gespeicherte Prozeduren verwenden, in dem Endbenutzernamen zu senden ...

Beispiel anzeigen:

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 Revision kann Lage sein, es zu erfassen. Ansonsten ist Profiler/Tracing die einzige Sache in SQL Server, die es tun kann.

+0

Ich war auch SQL Server 2008 Auditierung Blick in aber leider habe ich mit SQL Server 2005 jetzt zu tun habe. Ich frage mich, ob ich einen Link zu Produktionsserver (2005) von einem Dev-Server (2008) erstellen und dann Auditing verwenden kann. – Sung

+0

Darüber hinaus ist es nur Enterprise. – Oliver

10

Ja, es ist möglich, indem ein Event Notification auf der AUDIT_DATABASE_OBJECT_ACCESS_EVENT Veranstaltung. Die Kosten für so etwas wären überwältigend.

Es ist viel besser, die audit infrastructure zu verwenden oder benutzerdefinierten Zugriffs-Wrapper zu verwenden, wie von gbn empfohlen.

+0

Ich habe noch nichts von Event Notification gehört und es klingt bisher vielversprechend. – Sung

+5

Ich muss noch einmal betonen, dass das Erzeugen eines Ereignisses für jede Objektzugriffsprüfung in der Datenbank extrem schwer ist. –

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 

Ich habe gerade einen Code für Sie hinzugefügt. Der Code erstellt eine Serverüberwachung, eine Datenbankprüfung für ausgewählte Aktivitäten und schließlich wird die Datei sys.fn_get_audit_file zum Abrufen der Informationen aus der Datei verwendet. Sie müssen das für jeden Tisch individuell machen. Wenn Sie eine automatisierte Abfrage wünschen, können Sie andere Tools wie Apex SQL Audit oder ein anderes Tool Ihrer Wahl verwenden.

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

Dies ist kein Trigger. –

Verwandte Themen