暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在具有双引用的视图DML中ORA-01031

ASKTOM 2019-01-07
415

问题描述

在我工作的客户中,有一个设计标准,即每个DB视图都应以所谓的 “评论” 块开始。这是为了确保注释存储在DB中的数据字典中。

创建或替换视图xxxx为
注释为 (从对偶中选择/* 实现 */ '')
/* 创建: xxxx
| | 更改日志: xxxx
*/
...

到目前为止,很好。
但是,遵循smart-DB范例,我们为在带有或不带有DML的Apex屏幕中使用的任何表访问创建一个视图 (可选地使用代替触发器)。
但是在这些视图上使用DML会引发ORA-01031-权限不足...这是造成的,因为视图引用了双重对象。为了澄清,请参阅我在LiveSQL上也提供的这个示例:

create table test_employees
( id number 
, name varchar2(255)
, hiredate date
);

create or replace view test_employees_vw as 
with comments as ( select /*+ materialize */ '' from dual with read only)
/* 创建: xxxx
| | 更改日志: xxxx
*/
select id
, name 
, hiredate
from test_employees
/
insert into test_employees_vw 
(id,name, hiredate)
values
(1, 'John', date '2017-12-01')
;

> ORA-01031: insufficient privileges 


请注意,我希望在这种情况下使用 “仅阅读” 子句会有所帮助,但没有成功 (可能这只是在使用数据库链接时有效)。

除了在注释块中使用dual之外,在SQL中重新生成应用程序上下文时,还有DUAL的用例。
当然,通过创建我们自己的 “dummy” (公共) 表,这是一种解决方法,但是,我认为这种对偶的特定约束有些出乎意料,并不方便。
还是我错过了什么?你有什么看法?


专家解答

问题是你只有双选择privs。您需要在其上授予其他DML才能使用此方法。

但是... 当然,您可以在选择后立即发表评论吗?

create table test_employees
( id number 
, name varchar2(255)
, hiredate date
);

create or replace view test_employees_vw as 
select 
/* Created   : xxxx
|| Changelog : xxxx
*/
id
, name 
, hiredate
from test_employees;

insert into test_employees_vw 
(id,name, hiredate)
values
(1, 'John', date '2017-12-01');

select * from test_employees_vw;

ID   NAME   HIREDATE               
   1 John   01-DEC-2017 00:00:00   

set long 10000
select text from user_views
where  view_name = 'TEST_EMPLOYEES_VW';

TEXT                                                                                           
select 
/* Created   : xxxx
|| Changelog : xxxx
*/
id
, name 
, hiredate
from test_employees 


我每次都会选择这个而不是 “虚拟双重” 方法。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论