2009-10-04 3 views
8

일부 민감한 회계 테이블을 다루고 있으며 테이블이나 관련 뷰에 대해 실행 된 모든 SELECT 문을 감사하고 싶습니다."SELECT"문에 대한 SQL Server DDL 트리거를 만들 수 있습니까?

나는 SELECT 진술과 관련이있는 BOL (온라인 설명서)에 DDL Events을 찾지 못했습니다. DML 트리거는 INSERT, UPDATEDELETE에만 해당됩니다.

SELECT 성명을 통해 누가 테이블과 뷰에 액세스하는지 기록 할 수 있습니까?

답변

9

당신은 3 가지 옵션이 있습니다 :

  • 수 있도록 당신이 제한하고 "직접"유지하려는 경우
  • 은보기 뒤에 테이블을 숨길 로그 (테이블 권한을 제거)하려는 경우 저장 프로 시저를 통해 액세스 액세스
  • 실행 그들이 당신의 응용 프로그램과 자기의 일부가 포함되어 있기 때문에 옵션 1 또는 2 가고 싶어 영구 추적

.

로깅을 시작하는 데 다소 시간이 걸리지 만 테이블에 대한 액세스는 전면 제한되어야합니다.

또한 최종 사용자가 직접 수정하지 않으면 (예 : 웹 서버 또는 서비스 계정을 통해) 모든 솔루션이 실패합니다. 당신이 ... 최종 사용자 이름

예를 들어보기를 보내 저장 발동을 사용하지 않으면 :

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 서버 2008 감사 를 캡처 할 수 있습니다. 그 외에도 Profiler/Tracing은 SQL Server에서 유일하게 수행 할 수 있습니다.

+0

나는 또한 SQL Server 2008 감사를 조사하고 있었지만 불행히도 현재 SQL Server 2005를 다루고 있습니다. 내가 dev에 서버 (2008)에서 프로덕션 서버 (2005)에 대한 링크를 만들고 감사를 사용할 수 있는지 궁금해. – Sung

+0

또한 기업 전용입니다. – Oliver

10

네,이 AUDIT_DATABASE_OBJECT_ACCESS_EVENT 이벤트 상에 Event Notification를 작성이 가능합니다. 이런 일을하는 비용은 압도적입니다.

audit infrastructure을 사용하거나 gbn 권장 사항처럼 사용자 정의 액세스 랩퍼를 사용하는 것이 훨씬 좋습니다.

+0

나는 Event Notification에 대해 들어 본 적이 없으며 지금까지는 유망한 것으로 들린다. – Sung

+5

데이터베이스에서 각 개체 액세스 검사에 대한 이벤트를 생성하는 것은 매우 무거울 것이라고 다시 강조해야합니다. –

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

이것은 트리거가 아닙니다. –

관련 문제