用户rem_test创建表权限被拒,但EXECUTE AS LOGIN可执行,求排查原因
问题分析与解答
1. db_datareader和db_datawriter角色是否包含CREATE TABLE权限?
不包含。这两个角色仅针对数据操作授权:
- db_datareader:仅允许查询数据库内所有用户表的数据
- db_datawriter:仅允许对数据库内所有用户表执行增、删、改操作
两者都没有创建表的权限,用户能创建表必然是通过其他途径获得了权限(比如属于db_owner角色、被直接授予了CREATE TABLE权限,或者是数据库所有者)。
2. 为何执行GRANT CREATE TABLE TO rem_test;时出错?
报错信息明确说明无法给sa、dbo、实体所有者、系统内置主体或者自己授予权限。大概率是你执行这条GRANT命令时,当前登录的账号就是rem_test本身——SQL Server不允许用户给自己授予权限。另外如果rem_test已经是数据库所有者(dbo)或者通过其他角色拥有了CREATE TABLE权限,也会触发该报错。
3. 为何EXECUTE AS测试可行但用户自行操作失败?
核心原因是会话的数据库上下文不一致:
- 你执行测试时,先执行了
USE Test_DB;,切换到目标数据库后再模拟rem_test身份创建表,此时操作的是Test_DB;而用户实际登录后,默认数据库可能不是Test_DB(比如是master),直接执行CREATE TABLE会尝试在默认数据库创建,而该用户在默认数据库没有CREATE TABLE权限,因此报错。 - 另一种可能:用户登录后没有手动切换到Test_DB,直接执行CREATE TABLE命令,导致会话上下文仍在默认数据库,触发权限不足错误。
验证与解决方法
让用户登录后先执行以下命令确认当前数据库:
SELECT DB_NAME();
如果结果不是Test_DB,先执行USE Test_DB;再创建表,或者在CREATE TABLE时明确指定数据库:
CREATE TABLE Test_DB.dbo.dokument_custom_informationen (id integer not null, information varchar(max) null, value varchar(max) null);
内容的提问来源于stack exchange,提问作者Fuerro
相关产品推荐
相关产品推荐

