2013-02-11 30 views
0

我有一种情况,数据库从一个实例恢复成新的数据库而没有引用master数据库。因此所有的安全信息都会丢失。奇怪的是,客户端仍然可以通过可信连接访问数据,但是当尝试进行用户管理时,您不能删除一个帐户,因为它说它是模式的所有者。在用户数据库中,您可以为几乎每个具有相同名称的用户帐户获取一长串模式。 sys.schema的转储表明这些用户模式都不存在(显然它们将在原始实例的主数据库中,但不是新的)。由于架构不存在,您如何使用户标识符不属于一个不存在的实体,以便它可以被删除?如何在架构不存在的情况下从孤立用户中删除架构所有权

我必须这样做的132用户,所以我正在寻找一个重复的脚本以及。根据对这个网站的研究,我看到脚本将所有者改为dbo,但在这种情况下,架构已经存在。在我的情况下,它不是。任何帮助深表感谢。

+0

在目标数据库中找到sys.sysusers中sys.schemas的错误引用。使用 user2062811 2013-02-11 23:22:46

回答

1

两种情况之一可能什么:

  1. 你可以在不同的数据库来检查sys.schemas。模式可能存在于目标数据库中,但如果您从master中的sys.schemas中进行选择,则会得到不同的结果。
  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); 

此代码将为您提供的个人行为下降的语句,所以你可以在你的自由裁量权运行它们。

+0

谢谢。问题出在目标数据库中,我发现它有两个查询。你的日常工作对清理垃圾很有帮助。识别查询是针对sys.sysusers和sys.syschemas将uid与principal_id绑定为模式的,您可以看到关系以及您必须更改的内容。 – user2062811 2013-02-11 23:30:08

+1

谢谢。如果这有帮助,请注册并接受。 :) – 2013-02-11 23:34:28

相关问题