クエリおよびその他のT-SQLのログ記録


14

SQL Server 2008 R2にSELECTステートメント(または、他のT-SQLについて)のデフォルトのロギングスキームがあるかどうかを知りたい

はいの場合、どこで見ることができますか?そうでない場合、どのように設定できますか?

回答:


18

既定では、SQL Serverアクティビティは期待どおりに記録されません。一部の書き込みアクティビティはトランザクションログに記録されますが、これはデータベースのセットアップ方法にも依存します。

サーバー上のSELECTアクティビティを追跡するための4つの主なオプションがあります。

  1. あなたは使用することができますSQL Serverプロファイラをサーバーに接続し、それが起こるように、特定の活動を監視します。

  2. サーバー側のトレースを作成して、サーバー上のトレースファイルにアクティビティを記録し、SQL Server Profilerで読み取るか、fn_trace_gettableを使用してさらに分析するためにテーブルにロードすることができます。

  3. サーバー側トレースよりも多くの機能を提供し、MicrosoftがSQL Server 2012以降のサーバー側トレースの代わりに推奨する拡張イベントを使用できます。

  4. C2監査モードを使用できます

あなたは、[ファイル]メニューを使用してスクリプトそれて、その後、(あなたがしたいことなど、特定のイベント、フィルターを、選択してください)あなたのトレースを設定し、サーバー側のトレースを作成するには、サーバー上でそれを実行するために、SQL Serverプロファイラを使用することができます説明したようにこちら


5

SELECTステートメントを追跡するためのいくつかのSQL Serverソリューションとテクニックがあります。

  1. 特別に開発されたストアドプロシージャと関数–注:この方法には、T-SQLプログラミングの高度な知識と、ストアドプロシージャと関数の追加メンテナンスが必要です(たとえば、データベーススキーマが変更された場合)。詳細については、次の記事をご覧ください:http : //alstechtips.blogspot.com/2011/02/auditing-select-statements-in-sql.html

  2. SQL Serverトレーステクノロジー-次の記事のステップバイステップの説明を読むことができます:http : //solutioncenter.apexsql.com/auditing-select-statements-on-sql-server/

  3. SQL Server監査機能の使用-(SQL Server 2008で導入された)監査機能は、サーバーイベントとデータベースイベントの両方を追跡でき、拡張イベントテクノロジを使用しています。ただし、データベースレベルの監査は、SQL Server DeveloperおよびEnterpriseエディションでのみサポートされています。

  4. ApexSQL AuditやIdera SQL Compliance Managerなどのサードパーティツールを使用する


3

デフォルトでは、SELECTステートメントはログに記録されません。SELECTステートメントを監査するための詳細については、こちらの回答を参照してください。

また、デフォルトではそれもT-SQLステートメントをログに記録しません、代わりにそれはサーバーメモリの変更などのイベントをログに記録し、監査ログインに失敗しました、監査Addloginイベントなど、あなたはより多くの情報を見つけることができ、ここからの抜粋情報へのT-SQLスクリプトと一緒にデフォルトのトレース。


3

クエリの実行者を気にしない限り、システムで実行されているクエリに関するメトリックを表示する方法がいくつかあります。これは、最後の再起動以降のデータに限定され、クエリを拡張する深さに応じて、プランキャッシュ(または他のメモリ)のプレッシャーによる可能性があります。

;WITH x AS
(
  SELECT 
    [text] = SUBSTRING(t.[text], 
      (s.statement_start_offset/2)+1, 
      COALESCE(NULLIF(s.statement_end_offset,-1),DATALENGTH(t.[text])*2)
       -(s.statement_start_offset/2)), 
    s.execution_count, s.last_execution_time,
    s.max_logical_reads, s.max_elapsed_time
  FROM sys.dm_exec_query_stats AS s
  CROSS APPLY sys.dm_exec_sql_text(s.sql_handle) AS t
)
SELECT * FROM x
WHERE LTRIM([text]) LIKE 'SELECT%';

パターンを拡張したい場合があります-たとえば、これはで始まる;WITH皮肉なクエリを無視し、SELECT INTO実際のテーブルを参照しない変数の割り当てをキャプチャします。

ただし、それよりも詳細な情報が必要な場合は、Nathanの回答が適切な出発点です(トレースを使用する場合を除き、プロファイラーは使用しないでください)。システムに対するすべてのクエリのログ記録が無料になるわけではないことを覚えておいてください。


上記の声明に同意します。データベース内のすべてのselect文を監視することに非常に慎重になります。
ゼーン

私はあなたの解決策を試しました-これはプロシージャ、関数、トリガーのみを提供し、アドホック実行されたSQLステートメントはどれも可能ですか?
マジャー

@Magierいいえ、sys.dm_exec_query_statsはクエリステートメント(アドホックまたはモジュールから)についてのみ報告する必要があります。
アーロンバートランド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.