5

特定のデータベースの DBO がいつ、誰によって変更されたかを表示するクエリを実行したいと考えています。どうすればいいですか?

4

3 に答える 3

0

私はstackexchangeでこの情報を見つけました...そして試してみましたが、うまくいきました。唯一の問題は、DBO を最後に変更したユーザーのみが表示され、それ以前の変更は表示されなかったことです。私のアプリケーションが機能していなかったので、前回 DBO を変更したのは私でした。その前に誰が DBO を変更したかを知る必要があります。誰かが私がそれを行う方法を知っていますか? DBO が変更された最後の数回と、誰によって変更されましたか? これは、最後に誰が変更したかを知らせるコードです。

これはデフォルトのトレースにあります。sp_changedbowner を使用するか、適切な最新の構文を使用するかに関係なく、後者として表示されます。

alter authorization on database::[foo] to [bar] 次の方法で情報を取得できます。

DECLARE @path NVARCHAR(260);

SELECT 
   @path = REVERSE(SUBSTRING(REVERSE([path]), 
   CHARINDEX('\', REVERSE([path])), 260)) + N'log.trc'
FROM    sys.traces
WHERE   is_default = 1;

SELECT * -- whittle down to the meaningful trace columns
FROM sys.fn_trace_gettable(@path, DEFAULT)
WHERE EventClass = 152
ORDER BY StartTime DESC;

さて、イベントはずっと前に発生した可能性があるため、必ずしもトレースに残っているとは限りません.

于 2012-09-19T18:49:28.920 に答える
0

その情報は、デフォルトのトレースから取得できます。

トレースのサンプル クエリを含む記事を次に示します: デフォルト トレース

SSMS の最新の変更を確認することもできます。right-clicking on the database -> Reports -> Schema Changes History -> Schema Changes History.

TSQL経由で使用できます:

SELECT StartTime
       ,LoginName
       ,f.*
FROM   sys.traces t
       CROSS APPLY fn_trace_gettable(REVERSE(SUBSTRING(REVERSE(t.path),
                                                       CHARINDEX('\', REVERSE(t.path)), 
                                                       260)
                                             ) + N'log.trc', DEFAULT) f
WHERE  t.is_default = 1
       AND ObjectName = 'FOO'
       AND EventClass IN (46, /*Object:Created*/
                          47, /*Object:Dropped*/
                          164 /*Object:Altered*/ )
于 2018-07-31T23:28:16.073 に答える
0

デフォルトのトレースファイルについて詳しく説明するコメントを参照して...

クエリをsys.traces実行すると、SQL インスタンスで現在実行されている各トレースのレコードが返されます。機能が有効になっている場合、これらのレコードの 1 つはデフォルトのトレース ファイルを参照する必要があります。デフォルトのトレース ファイルのファイル形式はlog_000.trc. 番号は通し番号です。このファイルはデフォルトで、SQL ERRORLOG ファイルが保存されている LOG ディレクトリに保存され、変更することはできません。

そのディレクトリに移動すると、デフォルト トレース用の複数のトレース ファイルが見つかる可能性があります。デフォルトのトレースでは、ファイルが 20MB に達すると新しいファイルが作成されると思います。デフォルトのトレースは多くの情報をキャプチャしないため、通常、多数のファイルは作成されません。監視する必要があることは指摘しておきますが、長時間放置されているシステムでは、これらの小さなファイルが山積みになり、ストレージがいっぱいになる可能性があります。

現在のトレース ファイルには、探しているイベントが含まれていないようです。これは、そのファイルの前にあったことを示しています。したがって sys.fn_trace_gettable()、各ファイルに対して個別にクエリを実行する 2 つのオプションがあります。または、古いファイルを取得して、クライアント コンピューターまたは本番サーバー以外の何かにコピーし、話している数に応じて、プロファイラーでそれぞれを開きます。問題のイベントが原因でアプリケーションが壊れた場合は、明らかにその時間を参照して、集中する必要があるファイルを見つけることができます。

于 2012-09-19T21:14:36.537 に答える