Sql-Server

在 dbo 架構上設置只讀權限,但允許在另一個架構中創建實體?

  • September 11, 2019

是否可以在數據庫中創建自定義模式,以便在該數據庫中對 dbo 模式具有隻讀訪問權限的使用者可以設置為能夠為自定義模式創建和修改實體?

您不應該考慮權限,因為您必須擁有某些東西才能對其進行更改。在模式中創建對象所需要的只是在數據庫中創建對象的能力,以及對模式的授權(還有其他方法,但它們不太安全)。您還應該考慮通過一個角色將相同的權限應用到 n 個使用者,而不是將這些權限單獨應用到每個使用者。

我相信,這是一個工作範例,它展示了您想做的所有事情所需的語法。

首先,從 Windows 創建登錄,如果它們尚不存在:

USE [master];
GO
CREATE LOGIN [Domain\Username1] FROM WINDOWS;
CREATE LOGIN [Domain\Username2] FROM WINDOWS;

將這些使用者添加到數據庫中(也許創建這個數據庫作為測試):

USE a_database;
GO
CREATE USER [Domain\Username1] FROM LOGIN [Domain\Username1];
CREATE USER [Domain\Username2] FROM LOGIN [Domain\Username2];

為他們創建一個模式:

CREATE SCHEMA Pyramid;

創建一個角色,這樣您就不必為每個單獨的使用者維護這些權限,並將兩個使用者都添加到該角色:

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]'; 

設置角色的權限:

-- 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

現在,試試看:

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;

現在,當您添加更多使用者並希望他們繼承同一組權限時,您只需將它們添加到數據庫中,然後使用ALTER ROLE ... ADD MEMBER ....

更多資訊和更多語法範例:

引用自:https://dba.stackexchange.com/questions/247474