2009-10-04 10 views
8

Mi occupo di alcune tabelle contabili sensibili e vorrei verificare qualsiasi istruzione SELECT eseguita sulla tabella o qualsiasi vista associata ad esse.In ogni caso per creare un trigger DDL di SQL Server per le istruzioni "SELECT"?

Non ho trovato nessuno DDL Events su BOL (Libri in linea) che aveva qualcosa a che fare con la dichiarazione SELECT. E i trigger DML sono solo per INSERT, UPDATE e DELETE.

È possibile registrare chi accede alla tabella e alle visualizzazioni tramite la dichiarazione SELECT?

risposta

9

avete 3 opzioni:

  • permettere l'accesso tramite le stored procedure, se si desidera accedere (e rimuovere i diritti di tabella)
  • nascondere la tabella dietro una vista se si desidera limitare e tenere "diretta" accesso
  • esegue una traccia permanente

mi piacerebbe andare per le opzioni 1 o 2 perché fanno parte della vostra applicazione e autonomo.

Anche se sembra un po 'tardi per iniziare la registrazione: l'accesso alla tabella avrebbe dovuto essere limitato in anticipo.

Inoltre, qualsiasi soluzione non riesce se gli utenti finali non correggono direttamente (ad es. Tramite server Web o account di servizio). A meno che non si utilizza stored procedure per inviare il nome utente finale ...

Visualizza esempio:

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 Revisione può essere in grado di catturarlo. Oltre a questo, Profiler/Tracing è l'unica cosa in SQL Server in grado di farlo.

+0

Stavo anche esaminando il controllo di SQL Server 2008 ma sfortunatamente, mi sto occupando di SQL Server 2005 in questo momento. Mi chiedo se posso creare un collegamento al server di produzione (2005) da un server di sviluppo (2008) e quindi utilizzare il controllo. – Sung

+0

Inoltre, è solo Enterprise. – Oliver

10

Sì, è possibile con la creazione di un Event Notification sull'evento AUDIT_DATABASE_OBJECT_ACCESS_EVENT. Il costo di fare qualcosa di simile sarebbe comunque travolgente.

È molto meglio utilizzare lo audit infrastructure o utilizzare un wrapper di accesso personalizzato come consigliato da gbn.

+0

Non ho sentito parlare di Notifica evento e suona promettente finora. – Sung

+5

Devo ancora sottolineare che la generazione di un evento per ogni controllo dell'accesso agli oggetti nel database sarà estremamente pesante. –

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 

Ho appena aggiunto un codice per voi. Il codice crea un controllo del server, un controllo del database per attività selezionate e infine il file sys.fn_get_audit_file viene utilizzato per recuperare le informazioni dal file. Devi farlo individualmente per ogni tavolo. Se si desidera una query più automatica, è possibile utilizzare altri strumenti come Apex SQL Audit o altri strumenti di terze parti di propria preferenza.

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

Questo non è un trigger. –