sql loader而不使用数据库密码

时间:2018-06-21 10:26:37

标签: oracle sql-loader

我有一个CSV文件,需要将其上传到数据库表中。我已经为它编写了一个SQL加载程序,并且能够在表中上传csv,但是我面临的问题是我必须在加载程序脚本本身中对密码进行硬编码。 整个过程应该是自动化的,用户将文件上传到服务器上的特定文件夹。为此,我们将使用一个Shell脚本来获取文件。然后使用SQL加载程序将这些值上传到表中。

是否可以在不提供密码的情况下使用SQL加载程序?

2 个答案:

答案 0 :(得分:2)

示例1 Oracle Server 9.2.0.8 Linux,客户端Windows 9.2.0.1

您需要建立远程操作系统身份验证

在pfile或spfile REMOTE_OS_AUTHENT=TRUE中设置1个

2选中OS_AUTHENT_PREFIX

select name, value from v$parameter  where name='os_authent_prefix';
    NAME                         VALUE                                                                                                
------------------- ------------------------------------------------ 
os_authent_prefix              ops$ 

3创建用户

CREATE USER OPS$DEMINDV IDENTIFIED EXTERNALLY
DEFAULT TABLESPACE TABLESPACE_DEMINDV
TEMPORARY TABLESPACE TEMP
QUOTA UNLIMITED ON TABLESPACE_DEMINDV
PROFILE DEFAULT
ACCOUNT UNLOCK;

4检查oracle客户端sqlnet.ora $ORACLE_HOME\network\admin\sqlnet.ora

SQLNET.AUTHENTICATION_SERVICES= (NTS)

5测试连接

C:\Program Files\Far Manager>sqlplus /@test-ecdu

SQL*Plus: Release 9.2.0.1.0 - Production on Fri Jun 22 12:46:40 2018

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production

connected> show user
USER is "OPS$DEMINDV"
connected>

6运行sqlldr.exe并加载数据

C:\oracle\ora92\rdbms\demo>sqlldr.exe /@test-ecdu control=ulcase2.ctl

SQL*Loader: Release 9.2.0.1.0 - Production on Fri Jun 22 12:19:39 2018

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Commit point reached - logical record count 7

C:\oracle\ora92\rdbms\demo>

示例2 Oracle Server 9.2.0.8 Linux和本地用户Linux OS test

创建oracle用户

CREATE USER OPS$TEST IDENTIFIED EXTERNALLY
    DEFAULT TABLESPACE TABLESPACE_DEMINDV
    TEMPORARY TABLESPACE TEMP
    QUOTA UNLIMITED ON TABLESPACE_DEMINDV
    PROFILE DEFAULT
    ACCOUNT UNLOCK
/
GRANT "RESOURCE" TO OPS$TEST
/
ALTER USER OPS$TEST DEFAULT ROLE "RESOURCE"
/

测试连接

[test@test-ecdu bin]$ sqlplus /

SQL*Plus: Release 9.2.0.8.0 - Production on Fri Jun 22 13:10:55 2018

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production

SQL> show user
USER is "OPS$TEST"
SQL>

运行sqlldr并加载数据

[test@test-ecdu demo]$ sqlldr / control=ulcase2.ctl log=/home/test/ulcase2.log

SQL*Loader: Release 9.2.0.8.0 - Production on Fri Jun 22 13:20:21 2018

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Commit point reached - logical record count 7
[test@test-ecdu demo]$

答案 1 :(得分:1)

我可以想到两个选择。

首先,创建一个参数文件,其中包含所需的所有参数的值。例如(my_parfile.par):

userid=scott/tiger
control=my_loader.ctl
log=my_loader.log

您将以SQL * Loader身份运行

sqlldr parfile=my_parfile.par

很明显,它确实包含用户名/密码,但是您在命令行中看不到它。

或者,如果仅使用斜杠/作为USERID值,则默认为操作系统登录名。这可能是您要寻找的。就我个人而言,我从未使用过它,所以我无法提供示例并声称​​它将起作用,我只是不知道。 Google可能会这么做。