2009-08-10 7 views
34

私は現在開発DBを調べて、古いテストプロシージャ/テーブルの一部をクリーンアップしようとしています。どのユーザーがSQL Server 2005データベース内のオブジェクトを作成したのかを判断することは可能ですか?もしそうなら、どうやってその情報を見つけることができますか?SQL Serverでどのユーザーが作成したオブジェクトを確認する

編集:問題のオブジェクトが既に存在することを明確にしたかっただけです。監査とトリガーを設定すると、おそらく私はあまりうまくいかないでしょう。私は、システムテーブル/ビューを使って情報にアクセスする方法をほとんど探していたと思います。

答えて

28

答えは「いいえ、おそらくできません」です。

誰かが特定のオブジェクトを作成したと言うかもしれないものがありますが、背後には多くの「ifs」があります。

sys.objects(したがってsys.tables、sys.procedures、sys.viewsなど)には、principal = idという列があります。この値は、データベースユーザーのリストに関連する外部キーで、SQL(インスタンス)ログインのリストと結合することができます。 (この情報はすべて、さらにシステムビューで見ることができます)。

しかし、

ここでの設定を素早く確認し、BOLの概要を確認すると、「スキーマ所有者と異なる」場合にのみ、この値が設定される(つまり、nullでない)ことを示します。私たちの開発システムでは、dbo + 2つの他のスキーマがありますが、すべてがNULLになります。おそらく誰もがこれらのデータベース内でdbo権限を持っているからです。

これはNT認証を使用しています。 SQL認証はおそらく同じように機能します。また、誰もがを持っていて、に一意のログインを使用しているのですか、それとも共有されていますか?従業員の離職率があり、ドメイン(またはSQL)ログインが落ち込んだ場合、データがそこに存在しないか、不完全である可能性があります。

このデータは(select * from sys.objects)見ることができますが、principal_idがnullの場合はおそらく不運です。

+0

良い答えは、すべてのベースをカバーしています... – gbn

+0

これは、私が答えがどうなるかと思っていたものです。助けてくれてありがとう。 – bcasp

1

小さな具体的な仕組みが必要な場合は、DLL Triggersの情報を検索できます。

11

あなたはこの

select 
    so.name, su.name, so.crdate 
from 
    sysobjects so 
join 
    sysusers su on so.uid = su.uid 
order by 
    so.crdate 
+0

しかしso.uidは本当に非インポートdbsのSchemaIdです:http://msdn.microsoft.com/en-us/library/ms177596.aspx – crokusek

0

を試みることができるのログインユーザーごとに独自のSQL Serverを持っている場合は、このクエリを試してみました:

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, 
last_user_update,* 
FROM sys.dm_db_index_usage_stats 
WHERE database_id = DB_ID('<db name>') 
AND OBJECT_ID=OBJECT_ID('<table name>') 
30

オブジェクトが最近作成した場合、あなたはスキーマ変更を確認することができます既定のトレースによって記録されたデータベース内でコミットされたすべてのDDLステートメント実行の履歴を提供するSQL Server Management Studio内の履歴レポート:

enter image description here

次に、オブジェクトのcreate文を検索できます。表示されるすべての情報の中に、DDLステートメントを実行したユーザーのログイン名があります。

関連する問題