Sql-Server

無法更改已還原數據庫上的數據庫角色

  • May 28, 2020

我的 SSMS 登錄(使用 AD 組)分配了除 sysadmin 之外的所有伺服器角色,因此我有很多訪問權限。

使用這個登錄,我已經從它的 .bak 文件中恢復了一個數據庫。但是,在備份此數據庫之前,我的登錄名沒有映射到使用者,所以當它恢復時,我沒有映射到任何使用者。但是,如果我進入數據庫屬性 > 文件,所有者就是我(儘管它是我的個人 Windows 帳戶,而不是我在 SQL 中使用的 AD 組登錄)。

我不確定這會如何影響事情,但這意味著我仍然可以讀取/寫入數據庫中的所有表,即使我的登錄名不是該數據庫中的使用者。因此,我想在此數據庫上為我的 AD 組登錄創建一個成功執行的使用者。但是當我嘗試將此新使用者分配給任何數據庫角色時,它說我沒有權限。

我錯過了哪些步驟?我需要哪些權限才能將數據庫角色分配給此還原數據庫上的新使用者?

為了解決這個問題,我允許我的使用者模擬 dbo 使用者,這樣我就可以更改固定的數據庫角色。

USE [database]
GO
GRANT IMPERSONATE ON User::dbo TO [Domain\Login];

USE [database]
GO
EXECUTE AS User = 'dbo'
GO
ALTER ROLE [db_owner] ADD MEMBER [Domain\Login]
GO

儘管您將登錄名視為數據庫的所有者,但由於您從select user_name()和獲得的輸出,我不認為該資訊是準確的select is_member('db_owner')。我認為 SQL Server 會誤導您。公共數據庫角色可以解釋讀取/寫入數據庫上每個表的權限。

關於無法向角色添加新成員:

由於您不是 的成員db_owner,因此您將無法在數據庫角色上添加使用者。醫生

要更改您需要的固定數據庫角色的成員資格:

  • db_owner 固定數據庫角色中的成員身份

所有權問題:

當您嘗試獲取數據庫的所有權(這是添加到 db_owner 角色的一種方式)時,您收到了錯誤

找不到校長'

$$ domain login $$’,因為它不存在或者你沒有權限。

因為作為除 之外的所有伺服器角色的成員sysadmin,正如您所描述的,不會授予您TAKE OWNERSHIPorIMPERSONATE權限,並且數據庫文件的 ALTER AUTHORIZATION 說需要這些權限:

執行 ALTER AUTHORIZATION 語句的人員的要求:

如果您不是sysadmin固定伺服器角色的成員,則您必須至少對數據庫具有 TAKE OWNERSHIP 權限,並且必須對新所有者登錄具有 IMPERSONATE 權限。

您可以從sys.fn_my_permissions中檢查您是否具有這些權限,並在連接到恢復的數據庫時執行以下查詢:

SELECT * FROM fn_my_permissions (NULL, 'DATABASE')
WHERE permission_name = 'TAKE OWNERSHIP';

SELECT * FROM fn_my_permissions (NULL, 'SERVER')
WHERE permission_name = 'IMPERSONATE ANY LOGIN';

如果沒有返回任何行,則意味著您將無法更改數據庫的所有者並更改您可能需要sysadmin執行ALTER AUTHORIZATION 或授予您足夠的權限來執行此操作。

授予所需的權限:

GRANT TAKE OWNERSHIP ON DATABASE::YourDatabase TO [YourDomain\YourGroupOrLogin];
GRANT IMPERSONATE ANY LOGIN TO [YourDomain\YourGroupOrLogin];

注意:將成為數據庫所有者的登錄名不能是該數據庫上的現有使用者,否則您將收到以下錯誤:

消息 15110,級別 16,狀態 1,第 1 行
建議的新數據庫所有者已經是數據庫中的使用者或別名。


進一步閱讀SQL Server 權限圖表包含作為固定角色(伺服器和數據庫級別)成員獲得的所有權限。

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