启用/禁用SYSTEM_VERSIONING的SQL权限问题及所需权限咨询
解决SQL Server系统版本控制表ALTER TABLE权限问题
明确结论:不需要授予服务器级权限,仅数据库级权限即可完成操作。出现该错误大概率是权限映射、对象引用逻辑问题,而非权限等级不足,以下是具体排查和解决步骤:
1. 确认用户的db_owner角色映射是否生效
执行语句检查用户是否已正确获得db_owner角色:
USE [目标数据库名]; SELECT dp.name AS 数据库用户, dr.name AS 数据库角色 FROM sys.database_principals dp JOIN sys.database_role_members drm ON dp.principal_id = drm.member_principal_id JOIN sys.database_principals dr ON drm.role_principal_id = dr.principal_id WHERE dp.name = '你的本地用户名';
如果结果中没有db_owner,说明角色授予未生效,重新执行授权:
USE [目标数据库名]; -- SQL Server 2012及以上版本推荐用法 ALTER ROLE db_owner ADD MEMBER [你的本地用户名];
2. 确保对象引用的正确性
- 执行
ALTER TABLE前必须切换到目标数据库,否则会在默认数据库中查找表,导致“找不到对象”错误:USE [目标数据库名]; ALTER TABLE [dbo].[ASYSTEMVERSIONEDTABLE] SET (SYSTEM_VERSIONING = OFF); GO - 验证表是否存在于指定数据库的
dbo架构下:
若无结果,说明表不存在或架构错误,需确认表的实际架构和名称。USE [目标数据库名]; SELECT * FROM sys.tables WHERE name = 'ASYSTEMVERSIONEDTABLE' AND schema_id = SCHEMA_ID('dbo');
3. 检查用户的默认数据库设置
如果用户登录后默认数据库不是目标库,执行语句时会在默认库中查找对象。可通过以下语句修改默认数据库:
ALTER LOGIN [你的本地用户名] WITH DEFAULT_DATABASE = [目标数据库名];
4. 确认历史表的权限(可选)
虽然db_owner角色包含所有对象的CONTROL权限,但如果历史表创建方式特殊,可手动验证权限:
USE [目标数据库名]; SELECT permission_name, state_desc FROM sys.database_permissions dp JOIN sys.database_principals dp2 ON dp.grantee_principal_id = dp2.principal_id WHERE dp2.name = '你的本地用户名' AND dp.major_id = OBJECT_ID('对应历史表名');
若权限缺失,手动授予CONTROL权限:
USE [目标数据库名]; GRANT CONTROL ON [dbo].[对应历史表名] TO [你的本地用户名];
内容的提问来源于stack exchange,提问作者Tauqir
相关产品推荐
相关产品推荐

