Oracle 19c如何创建无ALTER TABLE权限的用户及权限异常排查
问题背景
需要在Oracle 19.14企业版中创建不具备现有表修改权限的数据库用户,但测试时发现即便仅给用户授予CREATE SESSION权限,用户仍然可以修改已有表,测试过程如下:
初始用户创建与权限验证
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.14.0.0.0 SQL> CREATE USER kirk IDENTIFIED BY hallo; User created. SQL> grant create session to kirk; Grant succeeded. SQL> conn kirk/hallo Connected. SQL> create table test (id int); create table test (id int) * ERROR at line 1: ORA-01031: insufficient privileges
上述结果符合预期,kirk用户无创建表权限。随后切换到sysdba身份在kirk所属Schema下创建测试表:
SQL> conn / as sysdba Connected. SQL> create table kirk.test (id int); Table created.
再次切换到kirk用户尝试修改该测试表:
SQL> conn kirk/hallo Connected. SQL> desc test Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER(38) SQL> alter table test add name char(50); Table altered. SQL> desc test Name Null? Type ----------------------------------------- -------- ---------------------------- ID NUMBER(38) NAME CHAR(50) SQL>
问题解答
为什么仅授予CREATE SESSION的kirk用户可以修改该表
Oracle中用户和Schema是一一对应的强绑定关系:每个用户对应一个同名Schema,Schema是该用户名下所有对象的集合,用户作为自身Schema的所有者,天然持有Schema下所有对象的全部操作权限(包括ALTER、DROP、增删改查等)。这个权限是Schema所有权自带的内置权限,不需要额外通过GRANT授予,也不受CREATE TABLE这类系统权限的影响。
用SYS创建的kirk.test表归属在kirk的Schema下,kirk作为Schema所有者自然有权修改该表。之前测试kirk无法创建表,只是因为CREATE TABLE系统权限控制的是「新建对象」的行为,不会剥夺用户对自身Schema下已有对象的所有权。
如何创建无法修改现有表的用户
- 常规场景下不要把需要保护的表建在普通用户的自有Schema中。单独创建专用的业务对象Schema(比如独立的数据所有者用户),所有业务表都存放在这个专用Schema下,再根据最小权限原则给普通用户授予必要权限(比如仅授予SELECT查询权限,不授予ALTER、UPDATE、DELETE、DROP等修改类权限)即可,普通用户自身Schema下不存放需要保护的业务表。
- 如果有特殊要求必须在普通用户Schema下存放表、同时禁止用户修改,可以通过SCHEMA级DDL触发器拦截ALTER、DROP等修改操作,或者启用Oracle Database Vault功能做细粒度权限控制,强制限制用户对自身Schema下对象的操作权限。
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

