web-dev-qa-db-ja.com

特定のスキーマでユーザーのテーブル権限を作成する

データベースのschema1で、ユーザーAに作成、変更、および削除のアクセス許可を与えたいのですが。私はこの質問がすでに尋ねられていると思います、そして私が見つけたのはスキーマに変更を許可し、ユーザーAに作成テーブルを許可することです:GRANT ALTER, DELETE, EXECUTE, INSERT, SELECT, UPDATE ON SCHEMA::schema1 TO user A;

GRANT CREATE TABLE TO User A;

これが正しい場合、userAは他のスキーマにもテーブルを作成できますか?

4
joeprince

データベースのschema1で、ユーザーAに作成、変更、削除のアクセス許可を与えたい

これを行う安全な方法は、そのスキーマの所有者をAにすることです。

別のユーザーのスキーマを変更する権限をユーザーに付与すると、そのユーザーは、そのスキーマの所有者が所有する任意のテーブルの行をSELECT、INSERT、UPDATE、およびDELETEできるようになります。これは「所有権の連鎖」と呼ばれ、ビューまたはストアドプロシージャに対するアクセス許可を持つユーザーは、基になるテーブルに対するアクセス許可を付与される必要がないため、ビューとストアドプロシージャがセキュリティを制御するための本当に簡単な方法になります。ビュー/プロシージャの所有者はテーブルと同じです。

ただし、このシナリオでは、所有権チェーンを使用してセキュリティホールを簡単に作成できます。一般に、別の(特に特権を持つ)ユーザーが所有するオブジェクトをユーザーが作成できるようにしたくはありません。

たとえば、CREATE TABLE、ALTER、INSERTを付与するだけでセキュリティホールが発生します。

use master
--drop database security_test
go
create database security_test
go
use security_test 
go

create schema schema1 authorization dbo
go
create user A without login
go
grant create table to A
grant alter, insert on schema::schema1 to A
go
create table dbo.secret(id int, msg varchar(200))
insert into dbo.secret(id,msg) values (1, 'secret data')
go
execute as user='A'

create table schema1.foo(id int)

go
create trigger t on schema1.foo after insert
as
begin
  select * from dbo.secret 
end

go

insert into schema1.foo(id) values (1)


go

revert

出力

id          msg
----------- -----
1           secret data

はい、データベースレベルでテーブル作成権限を付与する必要があります。たとえば、ユーザーがテーブルを作成するために必要な権限を付与されているが、特定のスキーマでそれを行うために必要な権限を持っていない場合、ユーザーはここにタブレットを作成できません。

3
user103326

いいえ、彼が変更できるスキーマを指定せず、彼にGRANT CREATE TABLE TO User Aを追加しただけでは、どこにもテーブルを作成できません。

CREATE TABLE権限をアクティブにするには、変更できるスキーマを指定する必要があります。結局のところ、スキーマへのテーブルの追加/削除はスキーマの変更と見なされ、あらゆる種類のDDLを実行するたびに、SQLサーバーは本質的にスキーマの変更であるSch-Mロックを必要とします

1
S4V1N