0

我有一种情况,数据库从一个实例恢复到一个新实例,而没有带来主数据库。因此,所有安全信息都会丢失。奇怪的客户端仍然可以通过受信任的连接访问数据,但是在尝试进行用户 ID 管理时,您不能删除帐户,因为它说它是模式的所有者。在用户数据库中,您可以获得几乎每个同名用户帐户的一长串模式列表。sys.schema 的转储显示这些用户模式都不存在(显然它们本来应该在原始实例的主数据库中,但不在新的主数据库中)。由于架构不存在,您如何使用户 ID 不属于不存在的实体,以便反过来将其删除?

我必须为 132 个用户使用这个,所以我也在寻找一个重复的脚本。根据对该站点的研究,我看到了将所有者更改为 dbo 的脚本,但在这种情况下,架构存在。在我的情况下,它没有。任何帮助深表感谢。

4

1 回答 1

1

可能会发生以下两种情况之一:

  1. 您可能正在签sys.schemas入不同的数据库。模式可能存在于目标数据库中,但如果您从sys.schemasin 中选择master,您将得到不同的结果。
  2. 模式不必与拥有它们的数据库用户同名。

为了清理它,我将使用以下代码/方法:

创建一个包含用户名的 .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);

此代码将为您提供各个操作的删除语句,以便您可以自行决定运行它们。

于 2013-02-11T22:29:58.953 回答