2009-10-04 21 views
8

Estoy tratando con algunas tablas de contabilidad sensibles y me gustaría auditar cualquier declaración SELECT ejecutada en la tabla o cualquier vista asociada a ellas.¿De todos modos para crear un disparador DDL de SQL Server para sentencias "SELECT"?

No encontré ningún DDL Events en BOL (Libros en línea) que tengan algo que ver con SELECT extracto. Y los activadores DML son solo para INSERT, UPDATE y DELETE.

¿Es posible registrar quién accede a la tabla y a las vistas a través de la declaración SELECT?

Respuesta

9

usted tiene 3 opciones:

  • permitir el acceso a través de procedimientos almacenados si desea registrar (y eliminar los derechos de mesa)
  • ocultar la mesa detrás de una vista si desea restringir y mantener "directa" acceso
  • ejecuta un seguimiento permanente

me gustaría ir a las opciones 1 ó 2, ya que son parte de su solicitud y auto contenida.

Aunque suena un poco tarde para iniciar el registro: el acceso a la tabla debería haberse restringido desde el principio.

Además, cualquier solución falla si los usuarios finales no corrigen directamente (por ejemplo, a través del servidor web o la cuenta de servicio). A menos que utilice procedimientos almacenados para enviar en nombre del usuario final ...

Ver ejemplo:

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 Auditoría puede ser capaz de capturarlo. Aparte de eso, Profiler/Tracing es lo único en SQL Server que puede hacerlo.

+0

También estaba investigando la auditoría de SQL Server 2008, pero desafortunadamente ahora estoy tratando con SQL Server 2005. Me pregunto si puedo crear un enlace al servidor de producción (2005) desde un servidor de desarrollo (2008) y luego usar la auditoría. – Sung

+0

Además, es solo Enterprise. – Oliver

10

Sí, es posible, mediante la creación de un Event Notification en el caso AUDIT_DATABASE_OBJECT_ACCESS_EVENT. Sin embargo, el costo de hacer algo como esto sería abrumador.

Es mucho mejor usar el audit infrastructure, o usar el envoltorio de acceso personalizado como recomienda gbn.

+0

No he oído hablar de Event Notification y parece prometedor hasta ahora. – Sung

+5

Debo recalcar nuevamente que generar un evento para cada control de acceso a objetos en la base de datos será extremadamente pesado. –

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 

Acabo de agregar un código para usted. El código crea una auditoría de servidor, una auditoría de base de datos para actividades seleccionadas y, finalmente, el archivo sys.fn_get_audit_file se usa para recuperar la información del archivo. Tienes que hacer eso individualmente para cada mesa. Si desea una consulta más automatizada, puede usar otras herramientas como Apex SQL Audit u otra herramienta de terceros de su preferencia.

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

Esto no es un disparador. –

Cuestiones relacionadas