在 dbo 模式上设置只读权限,但允许在另一个模式中创建实体?

J.D*_*.D. 0 schema sql-server permissions sql-server-2008-r2

是否可以在数据库中创建自定义架构,以便在该数据库中对 dbo 架构具有只读访问权限的用户可以设置为能够为自定义架构创建和修改实体?

Aar*_*and 8

您不应该在您必须拥有某些东西才能对其进行更改的意义上考虑权限。在模式中创建对象所需要的只是在数据库中创建对象的能力,以及对模式的授权(还有其他方法,但它们不太安全)。您还应该考虑通过角色将相同的权限应用于 n 个用户,而不是将这些权限单独应用于每个用户。

我相信这是一个工作示例,它演示了您想要做的所有事情所需的语法。

首先,从 Windows 创建登录,如果它们尚不存在:

USE [master];
GO
CREATE LOGIN [Domain\Username1] FROM WINDOWS;
CREATE LOGIN [Domain\Username2] FROM WINDOWS;
Run Code Online (Sandbox Code Playgroud)

将这些用户添加到数据库中(可能创建此数据库作为测试):

USE a_database;
GO
CREATE USER [Domain\Username1] FROM LOGIN [Domain\Username1];
CREATE USER [Domain\Username2] FROM LOGIN [Domain\Username2];
Run Code Online (Sandbox Code Playgroud)

为他们创建一个架构:

CREATE SCHEMA Pyramid;
Run Code Online (Sandbox Code Playgroud)

创建一个角色,这样您就不必为每个单独的用户维护这些权限,并将两个用户都添加到该角色:

CREATE ROLE PyramidRole;
GO
-- on modern versions:
ALTER ROLE PyramidRole ADD MEMBER [Domain\Username1];
ALTER ROLE PyramidRole ADD MEMBER [Domain\Username2];
-- on dinosaurs:
EXEC sys.sp_addrolemember @rolename = N'PyramidRole', @membername = N'[Domain\Username1]'; 
EXEC sys.sp_addrolemember @rolename = N'PyramidRole', @membername = N'[Domain\Username2]'; 
Run Code Online (Sandbox Code Playgroud)

设置角色的权限:

-- need specific create / alter permissions:
GRANT CREATE TABLE, CREATE VIEW, CREATE FUNCTION, CREATE PROCEDURE
  TO PyramidRole;

-- to be explicit, you want them to /read/ from dbo, so:
GRANT SELECT, VIEW DEFINITION ON SCHEMA::dbo TO PyramidRole;

-- finally, this will allow them to create/alter objects in their schema:
ALTER AUTHORIZATION ON SCHEMA::Pyramid TO PyramidRole;
-- you may need other permissions depending on what else you need them to do
Run Code Online (Sandbox Code Playgroud)

现在,试试看:

EXECUTE AS USER = N'[Domain\Username1]';
GO
CREATE TABLE dbo.what(id int);     -- Fails with Msg 2760
GO
CREATE TABLE Pyramid.what(id int); -- Succeeds
GO
REVERT;
Run Code Online (Sandbox Code Playgroud)

现在,当您添加更多用户并希望他们继承同一组权限时,您只需将它们添加到数据库中,然后使用ALTER ROLE ... ADD MEMBER ....

更多信息和更多语法示例: