【问题标题】:Can't create a view with a select with a case when clause无法使用带有 case when 子句的 select 创建视图
【发布时间】:2018-04-05 14:30:58
【问题描述】:

如果我执行select 部分,它可以工作并且我得到信息,但是如果我尝试查看此select 然后调用该视图,它会显示“ORA-00942:表或视图不存在 ”。如果没有有效的case when 子句,我还有其他观点。

    $oracletext10="create or replace view consulta1 
     as (SELECT ArticulosCanal99.CODIGO, 
                ArticulosCanal99.UBICACION, 
                SumaArticulosenPalets.CODIGO, 
                SumaArticulosenPalets.UBICACION,
                case ArticulosCanal99.codigo when 
                    SumaArticulosenPalets.codigo then 1 end as Expr1, 
                ArticulosCanal99.UNIS_PALET_COMPLETO AS Palet_Completo 
    FROM SumaArticulosenPalets 
    RIGHT JOIN ArticulosCanal99 
       ON SumaArticulosenPalets.CODIGO = ArticulosCanal99.CODIGO)";  

    $stid10 = oci_parse($db,$oracletext10);  
    oci_execute($stid10);  

【问题讨论】:

  • 为了能够创建视图,您需要对基础对象具有直接选择权限。只需发出选择部分,通过角色选择权限就足够了。
  • 底层对象实际上是我创建的视图,我可以对它们进行“选择”。
  • 请重新阅读,建议仍然有效。您需要对视图具有直接选择权限。

标签: php sql oracle


【解决方案1】:

详细说明@RobvanWijk 的评论:

这里引用Oracle 11.2 SQL reference's page on CREATE VIEW,“包含视图的架构的所有者必须具有从视图所基于的所有表或视图中选择、插入、更新或删除行所需的权限。必须直接授予所有者这些权限,而不是通过角色”。因此,您的用户已通过角色被授予对新视图的基表/视图的权限,因此可以成功执行 SELECT 语句。但是,当您从该 SQL 语句创建视图时,您的用户基于角色的权限是不够的:您需要执行以下 GRANT 语句才能创建视图:

GRANT SELECT ON SUMAARTICULOSENPALETS TO your-user-here;
GRANT SELECT ON ARTICULOSCANAL99 TO your-user-here;

将“your-user-here”替换为您正在使用的用户名。

祝你好运。

【讨论】:

    猜你喜欢
    • 2012-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多