我遇到的情况是,数据库从一个实例恢复到一个新实例而不会带来主数据库。因此,所有安全信息都会丢失。奇怪的是,客户端仍然可以通过可信连接访问数据,但在尝试进行用户ID管理时,您无法删除帐户,因为它说它是模式的所有者。在用户数据库中,您可以为几乎所有同名用户帐户获取一长串模式。 sys.schema的转储显示这些用户模式都不存在(显然它们将存在于原始实例的master数据库中,但不存在于新数据库中)。由于架构不存在,您如何使用户ID被拒绝一个不存在的实体,以便它可以被删除?
我需要132个用户,所以我也在寻找重复的脚本。根据对该网站的研究,我看到了将所有者更改为dbo的脚本,但在这种情况下,模式存在。在我的情况下,它没有。非常感谢任何帮助。
答案 0 :(得分:1)
可能会发生以下两件事之一:
sys.schemas
。模式可能存在于目标数据库中,但如果您从sys.schemas
中的master
进行选择,则会得到不同的结果。要清理它,我会使用以下代码/方法:
创建一个用户名的.txt文件,每个用户在不同的行上。
使用以下SQL代码:
use [copied_db];
CREATE TABLE #users
(uname varchar(100));
BULK INSERT #users FROM 'C:\test\users.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语句,以便您可以自行决定运行它们。