8

我必须使用 DBD::Oracle 连接到具有 LOGON 触发器的 Oracle 数据库,该触发器在登录时验证我的 v$session.program。

我努力了:

use strict;
use warnings;

use DBI;

DBI->connect ('dbi:Oracle:host=<ip>;sid=<sid>', 'test', 'TEST', 
    { ora_module_name => 'My Program'}) || die DBI::errstr;

但这不起作用,因为 DBD::Oracle 直到连接后才设置 v$session.program。

但是,JDBC 确实支持在连接之前进行设置,方法是:

Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
props.put("v$session.program", "My Program");
Class driver = Class.forName(driverClass);

但我没有使用 Java。我正在使用 Perl。有什么建议么?!

[更新]

在进程上运行“strace”确定 DBD::Oracle 模块正在执行以下操作:

open("/proc/self/cmdline", O_RDONLY) = 4 读取(4, "perl\0test.pl\0", 255) = 13

所以是的,理论上我可以创建一个名为“我的程序”的脚本(或软链接)并将其用作命令行来运行我的文件。但这在“非常悲伤而且一点也不好”的等级上相当高。:(

4

1 回答 1

0

http://docs.oracle.com/cd/B19306_01/server.102/b14237/dynviews_2088.htm

PROGRAM     VARCHAR2(48)    Operating system program name

这意味着您应该以某种方式将二进制文件重命名为预期值。

这样做有一些提示: http ://www.perlmonks.org/?node_id=500714

perldoc perlvar:

   $0      Contains the name of the program being executed.

           On some (but not all) operating systems assigning to $0
           modifies the argument area that the "ps" program sees. On some
           platforms you may have to use special "ps" options or a
           different "ps" to see the changes. Modifying the $0 is more
           useful as a way of indicating the current program state than it
           is for hiding the program you're running.

...

于 2013-10-01T15:04:00.780 回答