2016-05-30 1 views
-4

以下のステートメントに基づいていくつかの質問に答える必要があります。最初に、ユーザAは、関係Rの所有者であり、他のユーザーはR.次が実行されているの権限を保持していない:DはBに権限を付与するとどうなりますが、彼らはすでに存在します。質問があるSQL既存の権利をユーザーに付与する/取り消す

By A: GRANT INSERT ON R TO B WITH GRANT OPTION; 
By B: GRANT INSERT ON R TO C WITH GRANT OPTION; 
By C: GRANT INSERT ON R TO D WITH GRANT OPTION; 
By D: GRANT INSERT ON R TO B WITH GRANT OPTION; 
By B: REVOKE INSERT ON R FROM C CASCADE; 

?そして、最後の行が実行された後にユーザーが引き続き権限を持っているのは何ですか?

+0

最新の権限の変更が常に優先されます。つまり、あなたが最後にやったことは、現在実装/強制されていることです。したがって、 'D'がRにBを挿入すると、これが現在強制されているものです(' D'に許可がある場合)。 'revoke'コマンドが実行されると、すべての以前の' grant 'が削除され、 'C'はもはやこれらの権限を持ちません。ただし、上記の例では 'insert'パーミッションについてのみ話しています。 'Select'、' delete'、または 'update'パーミッションは、これらの変更によって影響されません。 – Ralph

+1

ところで、私はあなたの質問に投票しませんでした。同時に、私は過去に、SQLコミュニティ内の人々が自らの基準に些細でも珍しいような質問を下す傾向があることに気づいた。私は彼らがはるかに難しい/複雑な質問に慣れていると思っているし、 SQLの数年後にあなたはそれらを理解するかもしれません。しかし、私はSQLコミュニティ内の新規参入者を完全にサポートし、SQLの謎を理解してほしいという要望をサポートしています。だから私の側から*(+ 1)*して質問をやめてください。 – Ralph

+0

@Ralph私のdownvoteは研究の欠如のためです。質問は、OPと他の誰にも良いことであり、彼らはそれを解剖して理解していない細部を引き出すことはしませんでした(そのことについては、何かを理解する意志を示さず、彼らの特定の宿題に対する答え)。 –

答えて

1

ここには、自分で答えを決定するのに役立つスクリプトがあります。

-- setup 
CREATE USER A WITHOUT LOGIN; 
ALTER ROLE db_securityadmin ADD MEMBER A; 
CREATE USER B WITHOUT LOGIN; 
CREATE USER C WITHOUT LOGIN; 
CREATE USER D WITHOUT LOGIN; 

CREATE TABLE R (rid INT); 

EXECUTE AS USER = 'A'; 
GRANT INSERT ON R TO B WITH GRANT OPTION; 
REVERT; 
SELECT user_name(grantee_principal_id), 
    user_name(grantor_principal_id), 
    permission_name, state_desc 
FROM sys.database_permissions 
where major_id = object_id('dbo.R'); 

EXECUTE AS USER = 'B'; 
GRANT INSERT ON R TO C WITH GRANT OPTION; 
REVERT; 
SELECT user_name(grantee_principal_id), 
    user_name(grantor_principal_id), 
    permission_name, state_desc 
FROM sys.database_permissions 
where major_id = object_id('dbo.R'); 

EXECUTE AS USER = 'C'; 
GRANT INSERT ON R TO D WITH GRANT OPTION; 
REVERT; 
SELECT user_name(grantee_principal_id), 
    user_name(grantor_principal_id), 
    permission_name, state_desc 
FROM sys.database_permissions 
where major_id = object_id('dbo.R'); 

EXECUTE AS USER = 'D'; 
GRANT INSERT ON R TO B WITH GRANT OPTION; 
REVERT; 
SELECT user_name(grantee_principal_id), 
    user_name(grantor_principal_id), 
    permission_name, state_desc 
FROM sys.database_permissions 
where major_id = object_id('dbo.R'); 

EXECUTE AS USER = 'B'; 
REVOKE INSERT ON R FROM C CASCADE; 
REVERT; 
SELECT user_name(grantee_principal_id), 
    user_name(grantor_principal_id), 
    permission_name, state_desc 
FROM sys.database_permissions 
where major_id = object_id('dbo.R'); 

-- tear down 
DROP TABLE R; 
DROP USER D; 
DROP USER C; 
DROP USER B; 
DROP USER A; 

一度にすべてを実行しないでください - 各助成金を実行し、その後のようなR見にどのようなアクセス許可を調べます。プラスとして、あなたは自由に他のシナリオを探るためのツールを手に入れました!

関連する問題