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権限を試しました。ただし、この権限は、ユーザーによるテーブルの作成/削除も拒否します。
ユーザーが自分のスキーマ内で何かを実行できるが、スキーマ自体を作成または削除できないようにするには、どのような権限が必要ですか?
スキーマにCONTROL
を付与する必要はありません。DROP SCHEMA
に必要な権限は、スキーマのCONTROL
またはデータベースレベルのALTER ANY SCHEMA
のいずれかであり、これがユーザーがスキーマを削除できた理由です。これら2つの権限を削除すると、ロールに関連付けられたユーザーがスキーマを作成および削除できなくなります(もちろん、より高いレベルの権限を持っている場合を除く)。
CREATE
ALTER
および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;
新しいスキーマには「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;