Sql-Server

無法將成員資格授予公共角色

  • January 7, 2022

我正在嘗試使用來自 prod 的快照刷新我的開發數據庫。我已將生產數據庫從 prod 伺服器恢復到我的開發伺服器,名為 development。我正在嘗試向網站使用的使用者登錄授予對開發數據庫的訪問權限。但是當我嘗試執行時ALTER ROLE [public] ADD MEMBER [mywebuser],我得到了錯誤

Msg 15081, Level 16, State 1, Line 16
Membership of the public role cannot be changed.

回想起來,我相信當我CREATE USER [mywebuser] FOR LOGIN [mywebuser]在那個數據庫上執行時,我認為它說它已經存在了。所以我只是繼續授予訪問權限。prod 伺服器上有一個使用者和登錄名相同。有沒有可能被名字弄糊塗了?如果是這樣,我該如何檢查它?

我的開發伺服器正在 Windows Server 2019 Datacenter 10.0 (X64) 上執行 Microsoft SQL Server 2019 (RTM-GDR) (KB4583458) - 15.0.2080.9 (X64) Developer Edition

我的 Prod 伺服器在 Windows Server 2019 Datacenter 10.0 (X64) 上執行 Microsoft SQL Server Web(64 位)15.0.2080.9

我能夠通過首先從數據庫中刪除使用者然後重新創建它來使其工作。就我而言,此登錄名已在其他數據庫中使用,因此我無法刪除登錄名。並且刪除使用者並沒有立即起作用,因為它還擁有一些架構。

首先,我必須找到它擁有的架構:

use [development]
go
--- See which schemas the user owns:
SELECT 
 S.*,
 [SchemaOwnwer]=dp.name,
 dp.type_desc
FROM SYS.schemas S
INNER JOIN SYS.database_principals dp ON S.principal_id = dp.principal_id

它表明使用者擁有 2 個模式,所以接下來我將它們重新分配給 dbo:

-- change them so that dbo owns them:
alter authorization on schema::HangFire to dbo;
go
alter authorization on schema::db_owner to dbo;
go

我還必須從幾個角色中刪除使用者:

exec sp_droprolemember 'db_owner', 'mywebuser';
go
exec sp_droprolemember 'db_datareader', 'mywebuser';
go
exec sp_droprolemember 'db_datawriter', 'mywebuser';
go

最後,我可以刪除使用者

drop user [mywebuser]

現在,最後,我可以使用適當的設置將其添加回來:

create user [mywebuser] for login [mywebuser];
go

exec sp_addrolemember 'db_owner', [mywebuser];
go
exec sp_addrolemember 'db_datareader', [mywebuser];
go
exec sp_addrolemember 'db_datawriter', [mywebuser];
go

ALTER USER [mywebuser] WITH DEFAULT_SCHEMA=[dbo];
go
ALTER ROLE [db_owner] ADD MEMBER [mywebuser];
go

grant connect to [mywebuser];
go

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