SQL Server - 如何在架构不存在时从孤立用户中删除架构所有权



我遇到过这样一种情况,数据库从一个实例恢复到一个新实例,而没有转移master数据库。因此,所有安全信息都会丢失。奇怪的是,客户端仍然可以通过可信连接访问数据,但当尝试进行用户ID管理时,您不能删除帐户,因为它说它是架构的所有者。在用户数据库中,您可以获得几乎每个同名用户帐户的一长串模式。sys.schema的转储显示这些用户模式都不存在(很明显,它们本来会在原始实例的master数据库中,但不在新实例的master中)。既然架构不存在,你如何让userid否认一个不存在的实体,这样它就可以被删除?

我必须为132个用户这样做,所以我也在寻找一个重复的脚本。根据对这个网站的研究,我看到了将所有者更改为dbo的脚本,但在这种情况下,模式是存在的。在我的情况下,情况并非如此。非常感谢您的帮助。

可能发生以下两件事之一:

  1. 您可能正在其他数据库中检查sys.schemas。模式可能存在于目标数据库中,但如果从master中的sys.schemas中进行选择,则会得到不同的结果
  2. 架构不必与拥有它们的数据库用户具有相同的名称

为了清理这个问题,我将使用以下代码/方法:

创建一个包含用户名的.txt文件,每个用户都在不同的行上。

使用以下SQL代码:

use [copied_db];
CREATE TABLE #users
(uname varchar(100));
BULK INSERT #users FROM 'C:testusers.txt';
SELECT 'DROP SCHEMA ' + QUOTENAME(s.name,'[') + ';'
FROM #users u
    JOIN sys.database_principals dp ON (u.uname = dp.name)
    JOIN sys.schemas s ON (dp.principal_id = s.principal_id);
SELECT 'DROP USER ' + QUOTENAME(dp.name,'[') + ';'
FROM #users u
    JOIN sys.database_principals dp ON (u.uname = dp.name);

此代码将为您提供单个操作的drop语句,以便您可以自行运行它们。

最新更新