小编Mar*_*uts的帖子

如何在dbms_sql.open_cursor上解决ORA-29471?

我正在使用Oracle 11.2.0.1.0并尝试让dbms_sql包工作.但是,我一直收到ORA-29471错误,如下所示:

DECLARE
  c INTEGER;
BEGIN
  c := dbms_sql.open_cursor();
END;

ORA-29471: DBMS_SQL access denied
ORA-06512: at "SYS.DBMS_SQL", line 1017
ORA-06512: at line 4
Run Code Online (Sandbox Code Playgroud)

oracle 文档说下面这个:

绑定和执行时进行检查.可选地,可以对每个单独的DBMS_SQL子程序调用执行检查.检查是:

  • 调用子程序时current_user与调用最新解析时的相同.
  • 调用子程序时启用的角色必须是调用最新解析时已启用角色的超集.

与使用定义者权利子程序一致,角色不适用.如果检查失败,则引发ORA-29470错误.

据我所知,这两个条件都不适用于我的代码,因为代码不会跨越模式.

Oracle 支持(需要登录)网站建议我将security_level参数显式添加到dbms_sql.open_cursor中.添加任何值(0/1/2)都无法解决问题.

对我来说令人费解的是,我得到了错误dbms_sql.open_cursor,这是首次定义安全级别的地方.

支持网站还提出了一个涉及设置的解决方法:

alter system set "_dbms_sql_security_level" = 384 scope=spfile;
Run Code Online (Sandbox Code Playgroud)

我还没有尝试过.我更愿意将其视为最后的手段,因为它涉及禁用安全层,而且它是一个不受支持的oracle功能.生产使用的情况非常理想.此外,它根本没有真正解决问题,只是隐藏它.

我该如何解决这个错误?

oracle plsql dynamic-sql

9
推荐指数
1
解决办法
2万
查看次数

如何使用Phpunit代理原始方法并同时禁用构造函数?

使用Phpunit 4.5.2,我试图模拟以下类:

class Foo {
    public function bar() {}
}

class MyClass
{
    private $foo;

    public function __construct(Foo $foo) {
        $this->foo = $foo;
        //some other stuff that I want to suppress during the unit tests.
    }

    public function doSomething() {
        $this->foo->bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望实现以下目标:

  1. 让模拟调用原始方法.
  2. 避免使用构造函数(我使用反射设置foo属性).

这段代码:

$mock = $this->getMockBuilder('MyClass')
             ->disableOriginalConstructor()
             ->enableProxyingToOriginalMethods()
             ->getMock()
Run Code Online (Sandbox Code Playgroud)

将失败并显示以下错误消息:

传递给MyClass :: __ construct()的参数1必须是Foo的一个实例,没有给出

如果我删除了enableProxyingToOriginalMethods(),则创建的模拟没有错误,所以当我启用代理时,这启用了构造函数,尽管调用了disableOriginalConstructor().

如何在保持构造函数禁用的同时启用代理?

php phpunit

5
推荐指数
1
解决办法
1419
查看次数

标签 统计

dynamic-sql ×1

oracle ×1

php ×1

phpunit ×1

plsql ×1