web-dev-qa-db-ja.com

ユーザーのスキーマでの権限

デフォルトのデータベースを作成し、このデータベース内にいくつかのスキーマを作成しました。スキーマごとにユーザーを作成しました。スキーマ内の各ユーザーのみに完全な権限を与えたいのですが、どうすればよいですか?

2
Douglas

ドキュメントから( GRANT Schema Permissions ):

GRANT SELECT, DELETE -- , etc.
   ON SCHEMA::schema_name
   TO user_name;

特定の権限については、データベースレベルとスキーマレベルの両方で付与する必要があります。たとえば、ユーザーにCREATE TABLEデータベースレベルでの権限。ただし、これにより、任意のスキーマでテーブルを作成できるようになるだけではありません。ここにあなたが取り組むことができる例があります:

-- create a server-level SQL auth login
CREATE LOGIN DouglasExample WITH PASSWORD = 'x',
  CHECK_POLICY = OFF;

-- create an empty database and add a schema
CREATE DATABASE Douglas;
GO
USE Douglas;
GO
CREATE SCHEMA foo;
GO

-- create a user linked to the login
CREATE USER DouglasExample FROM LOGIN DouglasExample;
GO

-- grant the user the ability to create tables
GRANT CREATE TABLE TO DouglasExample;
GO

-- grant them explicit permissions on the schema only
GRANT SELECT, INSERT, DELETE, ALTER, EXECUTE, CONTROL
  ON SCHEMA::foo TO DouglasExample;
GO

-- now try to create tables in foo and in dbo
EXECUTE AS USER = N'DouglasExample';
GO
CREATE TABLE foo.what(id INT); -- succeeds
GO
CREATE TABLE dbo.who(id INT); -- fails, not in schema foo
-- CREATE TABLE who(id INT); would also fail with same error
-- unless DouglasExample had foo as their default_schema
GO
REVERT;
GO

Dboでの試行は次のエラーで失敗します:

メッセージ2760、レベル16、状態1
指定されたスキーマ名「dbo」が存在しないか、それを使用する権限がありません。

-- clean up:
USE master;
GO
DROP DATABASE Douglas;
GO
DROP LOGIN DouglasExample;

補足として、 すべてのオブジェクトを作成/参照するときは常にスキーマ名を明示的に示すことがいかに重要であるかを確認してください

2
Aaron Bertrand