create or replace 创建视图后,视图上原来的对象权限丢失。
示例如下:
mltest 用户下创建测试表 test,并创建视图 test_v。
创建测试表 test。
obclient> CREATE TABLE test(id int,name1 varchar2(100),name2 varchar2(100),name3 varchar2(100),name4 varchar2(100));往测试表 test 内插入数据。
obclient> INSERT INTO test VALUES(1,'name1','name2','name3','name4');保存数据。
obclient> commit;查询测试表 test 的数据是否插入成功。
obclient> SELECT * FROM test;返回结果如下:
+------+-------+-------+-------+-------+ | ID | NAME1 | NAME2 | NAME3 | NAME4 | +------+-------+-------+-------+-------+ | 1 | name1 | name2 | name3 | name4 | +------+-------+-------+-------+-------+ 1 row in set (0.00 sec)创建视图 test_v。
obclient> create or replace view test_v as select id,name1 from test;查询视图 test_v 是否创建成功。
obclient> SELECT * FROM test_v;返回结果如下:
+------+-------+ | ID | NAME1 | +------+-------+ | 1 | name1 | +------+-------+ 1 row in set (0.00 sec)
sys 用户下给 mltest2 用户授予查询视图 mltest.test_v 的权限。
查询视图 TEST_V 授权情况。
obclient> SELECT * FROM dba_tab_privs WHERE table_name='TEST_V';授予 mltest2 用户查询视图 mltest.test_v 的权限。
obclient> grant select on mltest.test_v to mltest2;查询授权是否成功。
obclient> SELECT * FROM dba_tab_privs WHERE table_name='TEST_V';返回结果如下:
+---------+--------+------------+---------+-----------+-----------+-----------+ | GRANTEE | OWNER | TABLE_NAME | GRANTOR | PRIVILEGE | GRANTABLE | HIERARCHY | +---------+--------+------------+---------+-----------+-----------+-----------+ | MLTEST2 | MLTEST | TEST_V | MLTEST | SELECT | NO | NO | +---------+--------+------------+---------+-----------+-----------+-----------+ 1 row in set (0.00 sec)
mltest2 用户下查询 mltest.test_v。
obclient> SELECT * FROM mltest.test_v;返回结果如下:
+------+-------+ | ID | NAME1 | +------+-------+ | 1 | name1 | +------+-------+ 1 row in set (0.00 sec)mltest 用户下重新创建 test_v 视图。
obclient> create or replace view test_v as select id,name1 from test;登录 mltest2 用户,查看 mltest.test_v。
obclient> SELECT * FROM mltest.test_v;返回结果如下:
ORA-00942: table or view does not exist登录 sys 用户查看 mltest2 用户对视图 mltest.test_v 的对象权限。
obclient> SELECT * FROM dba_tab_privs WHERE table_name='TEST_V';返回结果如下:
Empty set (0.00 sec)
适用版本
OceanBase 数据库 V2.1.x、V2.2.x、V3.1.x、V3.2.x 版本。
问题原因
create or replace 的实现是 DROP 旧对象再 CREATE 新对象,新创建的对象没有维护对象权限,view、routine、sequence 等同时支持对象权限和 create or replace 语法的对象都有此类问题。
解决方式
重新授予对象权限。
升级 OceanBase 数据库至 V2.2.77 BP15、V3.2.3 BP6、V3.1.2 BP11、V3.2.4、V4.0.0 BP1 及以上版本。