You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

godror连接Oracle时ACL识别程序名异常问题求助

Go项目使用godror连接Oracle时程序名匹配ACL的问题解答

问题1:为何Oracle识别的程序名是main@<hostname> (TNS V1-V3)?

  • main是Go程序默认编译输出文件名:若编译时未通过go build -o指定自定义名称,Go会生成名为main的二进制文件,Oracle客户端OCI层会读取该进程名作为程序名的基础部分。
  • @<hostname>是OCI默认标识:Oracle客户端会自动追加当前主机名,用于区分同一程序在不同主机上的运行实例,属于OCI内置行为。
  • (TNS V1-V3)是协议版本标记:由Oracle客户端库自动添加,用于标识会话使用的TNS协议版本,属于会话元数据,无法通过godror驱动层直接修改。

问题2:如何让Oracle ACL识别不带后缀的main作为程序名?

提供三种可行方案:

方案1:通过godror配置指定程序名

直接在连接配置中显式设置程序名,覆盖OCI默认值:

  • 使用DSN参数:在连接字符串中添加program参数,示例:
    dsn := "user/password@//db-host:1521/service_name?program=main"
    db, err := sql.Open("godror", dsn)
    
  • 使用Config结构体设置:通过godror.NewConfig配置程序名,示例代码:
    import (
      "database/sql"
      "github.com/godror/godror"
    )
    
    func main() {
      cfg := godror.NewConfig("username", "password", "//db-host:1521/service_name")
      cfg.ProgramName = "main" // 显式设置程序名
      connector, err := godror.NewConnector(cfg)
      if err != nil {
        panic(err)
      }
      db := sql.OpenDB(connector)
      defer db.Close()
      // 后续数据库操作
    }
    

设置完成后,Oracle会话的PROGRAM字段会变为main(不带主机名和协议后缀)。

方案2:调整Oracle ACL规则使用通配符

若无法修改程序配置,可通过ACL通配符匹配兼容默认程序名:

  • 匹配所有主机的main程序:
    BEGIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => 'target_db_host',
        ace => xs$ace_type(
          privilege_list => xs$name_list('connect'),
          principal_name => 'main@%',
          principal_type => xs_acl.ptype_db
        )
      );
    END;
    /
    
  • 匹配包含main前缀的程序名(忽略后缀):
    BEGIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => 'target_db_host',
        ace => xs$ace_type(
          privilege_list => xs$name_list('connect'),
          principal_name => 'main%',
          principal_type => xs_acl.ptype_db
        )
      );
    END;
    /
    

方案3:修改Go程序编译文件名

编译时指定自定义文件名,OCI会自动读取该名称作为程序名基础:

go build -o main ./main.go

配合方案1的显式设置,可确保程序名稳定为main。

验证设置生效

连接数据库后执行以下SQL,查看会话程序名确认设置结果:

SELECT PROGRAM FROM V$SESSION WHERE USERNAME = 'your_db_username';

内容的提问来源于stack exchange,提问作者Yasunori Kuji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:49:53