允许用户在他自己的架构内做任何事情,但不能创建或删除架构本身

use*_*567 12 schema sql-server permissions

我在 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;
Run Code Online (Sandbox Code Playgroud)

通过上面定义的权限myuser可以创建/删除自己的模式,所以为了克服这个问题我尝试了 ALTER ANY SCHEMA 权限。但此权限也拒绝用户创建/删除表。

需要什么权限才能允许用户在他自己的架构中做任何事情,但不能创建或删除架构本身?

Roi*_*ish 10

无需授予CONTROL架构。
需要的权限DROP SCHEMA或者是CONTROL在模式或ALTER ANY SCHEMA在数据库级别,这就是为什么你的用户能够删除模式。删除这两个权限将阻止与角色关联的用户创建和删除架构(当然,除非他们具有更高级别的权限)。

CREATE ALTERDROP其他对象所需的权限是CREATE对象类型(表\过程\函数\视图)的ALTER权限与架构的权限相结合。
您的脚本中已经拥有这些权限,因此您所要做的就是删除该CONTROL权限。作为参考,这里是BOLDDL语句列表,您可以在其中找到所有对象类型所需的权限。

对于懒惰的人,这是删除不必要的权限后的代码:

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;
Run Code Online (Sandbox Code Playgroud)


小智 5

请注意,由于新架构具有“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.
Run Code Online (Sandbox Code Playgroud)

这是 SQL Server 引擎的正确操作;权限渗透到具有相同授权的其他模式中。要限制此类访问,这里有一个模式创建选项:

CREATE SCHEMA myschema AUTHORIZATION myrole;
Run Code Online (Sandbox Code Playgroud)