2009-10-04 17 views
8

私はいくつかの重要な会計テーブルを扱っており、テーブル上で実行されたすべてのSELECTステートメントまたはそれらに関連付けられたビューを監査したいと思います。"SELECT"文のSQL Server DDLトリガを作成するには?

SELECTと何か関係があったBOL(本オンライン)にはDDL Eventsが見つかりませんでした。 DMLトリガーはINSERT,UPDATEおよびDELETEのみです。

SELECTステートメントでテーブルとビューにアクセスするユーザーをログに記録することはできますか?

答えて

9

あなたは3つのオプションがあります:あなたは制限し、「直接」保持したい場合は

  • あなたはログイン(およびテーブルの権限を削除)したい場合は、ストアドプロシージャを介したアクセスを許可
  • は、ビューの後ろにテーブルを隠しますアクセス
  • は、彼らが含まれているアプリケーションと自己の一部であるので、私はオプション1または2のために行くだろうと永久トレース

を実行します。

これは少し遅れてロギングを開始しますが、テーブルへのアクセスが制限されていたはずです。

また、エンドユーザーが直接修正できない場合(Webサーバーやサービスアカウントなど)には、すべてのソリューションが失敗します。あなたは...、エンドユーザ名に

表示例を送信するために保存されprocsのを使用しない限り:

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の監査それをキャプチャすることができるかもしれません。それ以外に、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

私はイベント通知を聞いたことがなく、これまでのところ有望だと思われます。 – 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

これはトリガではありません。 –

関連する問題