【发布时间】:2020-06-08 09:09:40
【问题描述】:
周末,我的开发服务器遇到了一个非常有趣的问题。我有一个脚本可以定期使多个数据库脱机,然后将它们重新联机。他们运行,并使所有指定的数据库脱机,但未能再次使它们联机,指定的错误消息是:
Msg 5011,Level 14,State 7,Line 4 用户没有权限 alter database 'XXX',数据库不存在,或者数据库是 不在允许访问检查的状态。消息 5069,级别 16,状态 1, 第 4 行 ALTER DATABASE 语句失败。
这对我来说似乎不对,因为我们是从具有以下属性集的用户帐户运行的:
我通过登录该服务器、以管理员身份运行 SSMS 并使用我的 Windows 凭据(也是管理员帐户)登录并在离线数据库上执行以下 SQL 进一步验证了这不是权限问题:
USE [master]
GO
ALTER DATABASE [XXX] SET ONLINE
GO
同样的结果...
我查看了 SQL 日志以获取有关特定错误的更多详细信息,但是没有与此问题相关的条目。我可以在此特定服务器上的每个数据库上重现此问题。我能够使数据库联机的唯一方法是分离并重新连接它们。
涉及此错误消息的大多数其他堆栈溢出票证都特定于一个数据库或特定用户帐户。我的问题涵盖了迄今为止我尝试过的所有数据库和所有管理员用户,我的问题也发生在以前在此服务器和帐户上运行良好的脚本上,显然在周末发生了一些变化,导致此查询现在失败。不知道有没有人遇到过这个问题?
更新 1
This post 谈到文件安全如何触发此错误消息,我授予对其中一个数据库的用户组的完全访问权限,然后重新运行在线命令,没有运气。我的 SQL Server 服务在属于“管理员”用户组的服务帐户下运行,并且对所有数据库文件具有完全访问权限。
更新 2
各种有趣的想法put forward here,also discussed here。关于如何使用 SQL 命令等多种修复组合修复损坏数据库的许多命令和想法,不幸的是,它们都不适用于我的情况,它们要么无法在脱机数据库上运行,要么在分离和重新附加后不报告任何错误.当然,总是有一些帖子只是坚持该解决方案是基于权限的并且运行:GRANT ALTER ON DATABASE 将解决所有问题。对于我的管理员用户帐户,它不应该有所作为,但这是一个有争议的问题,因为我什至无法在离线数据库上运行该命令...
【问题讨论】:
标签: sql sql-server permissions sql-server-2016 alter