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

时间:2013-02-11 22:04:19

标签: sql-server sql-server-2008

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

我需要132个用户,所以我也在寻找重复的脚本。根据对该网站的研究,我看到了将所有者更改为dbo的脚本,但在这种情况下,模式存在。在我的情况下,它没有。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

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

    创建一个用户名的.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语句,以便您可以自行决定运行它们。