web-dev-qa-db-ja.com

ユーザーが自分のスキーマ内で何かを行うことを許可するが、スキーマ自体の作成または削除は許可しない

SQL Azureでスキーマを作成し、データベースロールに次の権限を付与しました。

CREATE ROLE myrole AUTHORIZATION dbo;
EXEC sp_addrolemember 'myrole', 'myuser';

CREATE SCHEMA myschema AUTHORIZATION dbo;

GRANT ALTER, CONTROL, DELETE, EXECUTE, INSERT, REFERENCES, SELECT, UPDATE, VIEW 
DEFINITION ON SCHEMA::myschema TO myrole;

GRANT CREATE TABLE, CREATE PROCEDURE, CREATE FUNCTION, CREATE VIEW TO myrole;

上記で定義された権限を通じてmyuserは自分のスキーマを作成/削除できるため、問題を克服するために、ALTER ANY SCHEMA権限を試しました。ただし、この権限は、ユーザーによるテーブルの作成/削除も拒否します。

ユーザーが自分のスキーマ内で何かを実行できるが、スキーマ自体を作成または削除できないようにするには、どのような権限が必要ですか?

12
user960567

スキーマにCONTROLを付与する必要はありません。
DROP SCHEMA に必要な権限は、スキーマのCONTROLまたはデータベースレベルのALTER ANY SCHEMAのいずれかであり、これがユーザーがスキーマを削除できた理由です。これら2つの権限を削除すると、ロールに関連付けられたユーザーがスキーマを作成および削除できなくなります(もちろん、より高いレベルの権限を持っている場合を除く)。

CREATEALTERおよびDROP他のオブジェクトに必要な権限は、スキーマのCREATE権限と組み合わせたオブジェクトタイプ(table\procedure\function\view)のALTER権限です。
スクリプトにはこれらの権限が既にあるため、CONTROL権限を削除するだけで済みます。参考までに、ここに [〜#〜] bol [〜#〜]DDLステートメントのリストを示します。すべてのオブジェクトタイプに必要な権限を見つけることができます。

怠惰な人のために、ここに不要な権限を削除した後のコードがあります:

CREATE ROLE myrole AUTHORIZATION dbo;
EXEC sp_addrolemember 'myrole', 'myuser';

CREATE SCHEMA myschema AUTHORIZATION dbo;

GRANT ALTER, DELETE, EXECUTE, INSERT, REFERENCES, SELECT,
          UPDATE, VIEW DEFINITION ON SCHEMA::myschema TO myrole;

GRANT CREATE TABLE, CREATE PROCEDURE, CREATE FUNCTION, CREATE VIEW TO myrole;
8
Roi Gavish

新しいスキーマには「dbo」の権限があるため、ユーザーはスキーマがdboによって所有されているすべてのデータベースオブジェクトに間接的にアクセスできることに注意してください。

例:

select * from dbo.test; --fails

create view myschema.test
as 
select * 
from dbo.test; --view is created

select * from myschema.test;  --contents of dbo.test now revealed.

これは、SQL Serverエンジンの正しい操作です。権限は、同じ認証で他のスキーマに浸透します。このようなアクセスを制限するために、スキーマ作成のオプションを次に示します。

CREATE SCHEMA myschema AUTHORIZATION myrole;
5
Jonathan Mears