我在几乎每个版本的 SQL Server 中都看到过这种情况,并且有关它的博客文章似乎将其视为偶尔发生的事情,但由于我似乎总是遇到这个问题,直到 SQL Server 2017,现在是时候找出我做错了什么。
设想:
- 具有 SQL Server(非 AD)用户的数据库
- 备份(即备份到文件),然后在不同的计算机或数据库服务器上恢复
该用户现在将出现在该数据库中,但不能使用,也不能添加到登录名(因为它会抱怨它已经存在):
- 删除该用户将引发:数据库主体在数据库中拥有一个模式,并且不能被删除。
然后:
有几种解决方案(这一, 或这个一)来修复这个问题,但我想从根本上解决这个问题:
- 我可以备份没有用户的数据库吗?
- 我可以恢复没有用户的数据库吗?
- 我可以备份/恢复数据库吗和它的用户(他们是 sql 用户,所以应该可导出)?
- 还有什么吗,例如,我可以以某种方式为疏远的用户创建登录信息吗,或者我还做错了什么?
我使用 SQL Server 管理控制台完成大部分操作,这可能并不明智,但我很高兴学到一种比那些应该为我们完成这些操作的工具更好的技术。
MS 文档是错误的
这应该是一件轻而易举的事,根据微软:
当在另一台计算机上还原数据库时,启动还原操作的 SQL Server 登录名或 Microsoft Windows 用户将自动成为新数据库的所有者。还原数据库后,系统管理员或新数据库所有者可以更改数据库所有权。
正如上述情景所描绘的,所有这一切从根本上来说似乎都不是事实。
免责声明:我进行了搜索,但如果这是重复的,我不会感到惊讶。
PS:基本上,令人沮丧的是,通常情况下,您只能在紧急情况下进行恢复。花费数小时“修复”不该损坏的东西非常烦人。并非不可能,也不是无法修复,只是很麻烦。
PPS:运行SELECT name FROM sys.schemas WHERE principal_id = USER_ID('TeamcityUsr')
上述示例返回空集。因此,被复制的用户确实被疏远了。