8 Stimmen

Wie kann man einen SQL Server DDL-Trigger für "SELECT"-Anweisungen erstellen?

Ich habe mit einigen sensiblen Buchhaltungstabentabellen zu tun und würde gerne alle SELECT Anweisung, die auf der Tabelle oder den mit ihr verbundenen Ansichten ausgeführt wird.

Ich habe nichts gefunden DDL-Ereignisse auf BOL (Books Online), die irgendetwas mit SELECT Anweisung. Und DML-Trigger sind für INSERT , UPDATE y DELETE nur.

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

10voto

Remus Rusanu Punkte 280155

Ja, das ist möglich, indem man eine Ereignis-Benachrichtigung über die AUDIT_DATABASE_OBJECT_ACCESS_EVENT Veranstaltung. Die Kosten für so etwas wären allerdings überwältigend.

Es ist viel besser, die Prüfungsinfrastruktur oder die Verwendung eines benutzerdefinierten Zugriffs-Wrappers, wie von gbn empfohlen.

9voto

gbn Punkte 407102

Sie haben 3 Möglichkeiten:

  • Zugriff über gespeicherte Prozeduren erlauben, wenn Sie protokollieren wollen (und Tabellenrechte entfernen)
  • die Tabelle hinter einer Ansicht zu verstecken, wenn Sie den "direkten" Zugriff einschränken und beibehalten wollen
  • eine permanente Verfolgung durchführen

Ich würde mich für die Optionen 1 oder 2 entscheiden, da sie Teil Ihrer Bewerbung und in sich abgeschlossen sind.

Allerdings scheint es etwas spät zu sein, mit der Protokollierung zu beginnen: Der Zugang zum Tisch hätte von vornherein eingeschränkt werden müssen.

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

Beispiel ansehen:

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

2voto

    --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 etwas Code für Sie hinzugefügt. Der Code erstellt ein Server-Audit, ein Datenbank-Audit für ausgewählte Aktivitäten und schließlich wird sys.fn_get_audit_file verwendet, um die Informationen aus der Datei abzurufen. Das müssen Sie für jede Tabelle einzeln tun. Wenn Sie eine stärker automatisierte Abfrage wünschen, können Sie andere Tools wie Apex SQL Audit oder ein anderes Tool eines Drittanbieters Ihrer Wahl verwenden.

1voto

anishMarokey Punkte 11011

1voto

RBarryYoung Punkte 53364

SQL Server 2008-Überprüfung mai in der Lage sein, sie zu erfassen. Ansonsten ist Profiler/Tracing das Einzige in SQL Server, das dies leisten kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X