巧用 Ruby 配备 Oracle 数据库
在使用 Java 时,有两种针对 Oracle 的常见驱动程序:纯
Java (又叫做瘦)驱动程 序和原生 OCI 驱动程序。 在写作这篇文章的时候, 还没有和基于 JDBC 的 Java 瘦驱动程 序类似的纯 Ruby 驱动程序。 要连接到 Oracle,用户必须安装 Ruby/Oracle 调用接口 (OCI8) 库 — 一个基于 Ruby/DBI (数据库接口模块)的数据库驱动程序。RubyDBI 提供了一个与数据库无关的、 类似于 JDBC 或 ODBC 的接口,来实现 Ruby 和数据库之间的交互。Ruby OCI8 驱动程 序通过标准的 Oracle 客户端
软件连接到 Oracle 8 到 10 的所有版本。OCI8 是一个 Ruby 包装器,用本地 C 代码编写,实际的交互就由它来完成。 非 windows 开发人员可以通过输入 sudo gem install ruby-oci8 来进行安装。Windows 开发人员可以先从 rubyforge.org/projects/ruby-oci8 上下该载驱动程序的二进制版本, 然后手动安装: ruby ruby-oci8-0.1.16-mswin32.rb 可以通过下面的命令行 Ruby 程序查询一个包含
演示 (HR) 模式的数据库,简单检测 您所下载的 Ruby OCI8 驱动程序。替换下面命令中 Oracle 数据库的名称和口令:
set oracle_sid=xe ruby -r oci8 -e "OCI8.new('hr', 'password').exec('SELECT * FROM jobs ORDER BY 1') {|r| puts r.join}"
如果连接和
查询成功,输出应如下所示:
AC_ACCOUNT | Public Accountant | 4200 | 9000 AC_MGR | Accounting Manager | 8200 | 16000 AD_ASST | Administration Assistant | 3000 | 6000 AD_PRES | President | 20000 | 40000 AD_VP | Administration Vice President | 15000 | 30000 FI_ACCOUNT | Accountant | 4200 | 9000 FI_MGR | Finance Manager | 8200 | 16000 HR_REP | Human Resources Representative | 4000 | 9000 IT_PROG | Programmer | 4000 | 10000 MK_MAN | Marketing Manager | 9000 | 15000 MK_REP | Marketing Representative | 4000 | 9000
PR_REP | Public Relations Representative | 4500 | 10500 PU_CLERK | Purchasing Clerk | 2500 | 5500 PU_MAN | Purchasing Manager | 8000 | 15000 SA_MAN | Sales Manager | 10000 | 20000 SA_REP | Sales Representative | 6000 | 12000 SH_CLERK | Shipping Clerk | 2500 | 5500 ST_CLERK | Stock Clerk | 2000 | 5000 ST_MAN | Stock Manager | 5500 | 8500
Rails 配置 Rails 用于连接到数据库的参数存放在您的 Rails 应用程序目录中的 config/database.yml 中。下面的例子引用了主机 xe,它对应 tnsnames.ora 中的一项。使用 了三种模式,分别用不同的用户名指定。
development: adapter:oci host:xe username:development password:password test: adapter:oci hostxe username:test password:password production: adapter:oci host:xe username:production password:pass
word 也可以将 Oracle Easy Connect Naming 和 Ruby OCI8 驱动程序结合使用。用一个 Oracle Easy 连接字符串替换主机字段中的 SID,如下所示:
development: adapter:oci host://server:port/instance_name username:development password:password
身份验证
和
大多数的三层应用程序体系结构一样,Rails 假设使用一套证书(在 database.yml 中 指定)对 Oracle 进行身份验证。指定的证书必须有足够的权限来执行 Rails 应用程序的任 何操作。 如果出于安全的考虑,不想把证书以明文的形式包含在配置文件中,您可以利用 database.yml 允许通过 ERb 标记使用动态内容的特性。语法与使用 标记将参数值插入 Rails 视图模版的语法相同。 下面的例子从启动时设置的环境变量中获取用户名和口令:
production: adapter:oci host:xe username: password:
传递身份验证 (Pass-Through Authentication) 目前还没有一个从 Rails 应用
程序到 Oracle 的所谓的传递身份验证(一个终端用户使 用他或她的 Oracle 证书来验证身份。验证通过后,对该应用程序的使用则受 Oracle 定义 的访问权限和限制范围