执行系统数据库管理任务所需的最低权限是什么?
问题
在 BarTender 2019 及更高版本中,执行 BarTender 系统数据库管理任务所需的最低权限是什么?
解答
服务器角色:dbcreator 和 数据库角色:db_owner 是在管理控制台下对 BarTender 系统数据库执行所有管理任务所需的最低权限。
以下是管理控制台中各项任务对应的权限说明:
| 操作/过程 | 最低权限 |
| 查看数据库大小 | 数据库权限:查看数据库状态 |
| 备份数据库 |
数据库权限:备份数据库 备份文件保存的目录必须已存在, 并且 SQL Server 服务需要对该目录有读写权限。 |
| 还原数据库 |
服务器角色:dbcreator 数据库角色:db_owner |
| 立即执行维护 |
数据库权限:连接、删除、执行、插入、查询、更新, 备份数据库(如果勾选了“归档已删除记录”选项) |
| 立即清除所有记录 |
数据库权限:连接、删除、执行、插入、查询、更新,备份数据库(如果勾选了“归档已删除记录”选项) 数据库角色:db_ddladmin |
不过,即使拥有上述权限,目前已知在执行维护时,如果操作用户没有 sysadmin 角色,操作会失败。错误信息类似如下:
存储过程:sp_updatestats 执行失败;内部信息:用户没有执行此操作的权限。
已处理数据库 'SystemDB' 的 584 页,文件 'SystemDB' 在文件 1 上。
已处理数据库 'SystemDB' 的 1 页,文件 'SystemDB_log' 在文件 1 上。
BACKUP DATABASE 成功处理了 585 页,用时 0.091 秒(50.217 MB/秒)。
这是一个已知的 SQL Server 问题。在维护过程中使用的某个存储过程 'SpDeleteRecords',会调用 SQL Server 的内置过程 'sp_updatestats'。这样做是为了在删除记录后提升查询性能。
不幸的是,尽管微软文档说明数据库所有者(dbo)有权限执行该操作,但目前 SQL Server 存在一个 bug,导致执行失败。
解决方法是让客户通过 SQL Server Management Studio 修改 'SpDeleteRecords' 存储过程,具体操作如下:
在 SQL Server Management Studio 左侧窗格中,找到“YourDatabase\Programmability\Stored Procedures”,右键点击 dbo.SpDeleteRecords,选择“Script Stored Procedure as ALTER to > New Query Editor Window”,生成 ALTER 脚本。
在脚本的 ALTER 行后面添加 "with execute as 'dbo'",如下所示:
ALTER PROC [dbo].[SpDeleteRecords](@pastUtcTicks bigint, @categories nvarchar(1024)) with execute as 'dbo'
按 F5 或点击工具栏上的“! 执行”按钮运行该脚本。
这样会强制 'SpDeleteRecords' 以数据库所有者的身份运行。修改存储过程后,再次尝试执行维护(使用上表所述的最低权限),应该就可以正常运行了。
更多信息(仅供内部使用)
参见 DEVQ-4363 和 BUG-2270
此外,迟早会有用户质疑为什么需要授予某些服务器角色或数据库权限(如 db_owner),并认为这会带来安全风险。事实上,今天就有客户问了我这个问题,我的回答如下:
与其关注 SQL Server 用户拥有什么数据库角色,不如从以下角度考虑:
- BarTender 系统数据库所用 SQL Server 账户的密码是否复杂,从而更安全?
- 公司里哪些人知道/能访问这个密码。
如果你问 SQL Server 管理员,db_owner 数据库权限本身就是一个安全隐患,但我认为关键在于谁能访问这个 SQL Server 账户的密码,以及密码的复杂程度。