4

継承している古いデータベースがあります。アクセス権はどこにも明確に定義されていないので、誰もがアクセスできるようにするための簡単な方法を探しています。データベースにメンバーシップロールに属していないユーザーがいるとします。ただし、特定のテーブルに対して特定のことを行うためのアクセス権が付与されています。たとえば、テーブルXでselectクエリを実行し、テーブルYで更新クエリを実行できます。各ユーザーのプロパティに移動することで、それらが何を持っているかを確認できます。ただし、これらすべてが定義されていて、簡単にクエリできるシステムテーブルがどこかにある必要があると思います。このクエリはどのようになりますか。

参考:SQLServer2005を使用しています

更新:サーバー上のすべてのデータベースに対してこれを行う方法もありますか?

4

2 に答える 2

5

セキュリティカタログビューを見てから、ユーザーの権利を一覧表示するためのクエリを提供するMrDennyの回答をここで確認してください。ここで再現します(好みに合わせて整理します)。

SELECT  [Schema]            =   sys.schemas.name 
,       [Object]            =   sys.objects.name 
,       username            =   sys.database_principals.name 
,       permissions_type    =   sys.database_permissions.type 
,       permission_name     =   sys.database_permissions.permission_name
,       permission_state    =   sys.database_permissions.state 
,       state_desc          =   sys.database_permissions.state_desc
,       permissionsql       =   state_desc + ' ' + permission_name 
                                 + ' on ['+ sys.schemas.name + '].[' + sys.objects.name 
                                 + '] to [' + sys.database_principals.name + ']' 
                                  COLLATE LATIN1_General_CI_AS 
FROM sys.database_permissions 
 INNER JOIN sys.objects ON sys.database_permissions.major_id =      sys.objects.object_id 
 INNER JOIN sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id 
 INNER JOIN sys.database_principals ON sys.database_permissions.grantee_principal_id =  sys.database_principals.principal_id 
ORDER BY 1, 2, 3, 5
于 2009-12-18T14:46:15.637 に答える
3

実際には少し注意が必要です。有効なアクセス許可は、内部データベースアクセス許可(上記のDennyのクエリがdozaによって示したようにクエリ可能)Windowsグループメンバーシップの組み合わせです。残念ながら、後でSQLの外部のADスキーマに格納されるため、実際にクエリを実行することはできません。

したがって、「テーブルXへのアクセスはdomain\someuserとdomain\somegroupに与えられ、domain \ someothergroupに拒否されます」を表示することが目標である場合は、dozaの投稿に示されているように、カタログメタデータを使用してクエリを実行できます。

ただし、目標が「ユーザーdomain \ someuserはテーブルXにアクセスできますか?」と答えることである場合。上記のクエリから答えを得ることができません。そうです、domain \ someuserにアクセスが許可されているというレコードが表示されているにもかかわらず、有効なアクセス権があるかどうかは答えられません。単一の拒否がすべての許可よりも優先されることを忘れないでください。domain\userがdomain\someothergroupグループのメンバーである場合、domain\someuserは事実上アクセスを拒否されます。

後の質問に答えるには、別のメカニズムを使用する必要があります。つまり、SQLレベルでユーザーになりすまして、HAS_PERM_BY_NAMEを介して権限を確認する必要があります。

EXECUTE AS USER = 'domain\someuser';
SELECT HAS_PERMS_BY_NAME('X','TABLE','SELECT');
REVERT;

最初の質問には、セキュリティカタログの表示権限を持っている人なら誰でも答えることができますが、後者の質問には、はるかに強力な権限である偽装権限が必要です。

于 2009-12-18T15:57:30.140 に答える