【问题标题】:ORA-01031: insufficient privileges when bulk loading data from one schema to another via SQL*LoaderORA-01031: 通过 SQL*Loader 将数据从一个模式批量加载到另一个模式时权限不足
【发布时间】:2014-02-03 14:59:42
【问题描述】:

我正在尝试通过 SQL 加载器将数据插入到另一个模式的表中。这是控制文件:

LOAD DATA
 INFILE *
 INTO TABLE globalref01.dw_stg_holiday_extract
 FIELDS TERMINATED BY "|"
 TRAILING NULLCOLS
 (  ric_trd_exch,
    cntry_cde,
    holiday_date "TO_DATE (:holiday_date, 'YYYYMMDD')",
    holiday_desc,
    trd,
    stl
 )

请注意,我正在插入表 SCHEMA.TABLE_NAME。由于我将从架构depotapp01 进行sqlldr'ing,因此我将在globalref01 上运行以下命令:

GRANT INSERT ON dw_stg_holiday_extract TO depotapp01;

检查它是否有效:

SELECT * FROM user_tab_privs_recd WHERE table_name = 'DW_STG_HOLIDAY_EXTRACT' AND owner = 'GLOBALREF01';

这确认我有来自depotapp01 的 INSERT privs:

GLOBALREF01 DW_STG_HOLIDAY_EXTRACT  GLOBALREF01 INSERT  NO  NO

现在,当我尝试执行 sqlldr 命令时,我得到 ORA-01031:权限不足:

SQL*Loader: Release 10.2.0.4.0 - Production on Mon Feb 3 09:41:43 2014

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

Control File:   /db/platform/eq/sparc_SunOS_5.6/depot/2.0/DWRef/cfg/uat/2.1/base_config/holiday_calendar.ctl
Data File:      /export/data/depotdw/DWRef/data/oats/holiday_calendar.dat
  Bad File:     /export/data/depotdw/DWRef/data/oats/holiday_calendar.err
  Discard File: /export/data/depotdw/DWRef/data/oats/holiday_calendar.dsc
 (Allow all discards)

Number to load: ALL
Number to skip: 0
Errors allowed: 200000
Bind array:     64 rows, maximum of 1000000 bytes
Continuation:    none specified
Path used:      Conventional

Table GLOBALREF01.DW_STG_HOLIDAY_EXTRACT, loaded from every logical record.
Insert option in effect for this table: INSERT
TRAILING NULLCOLS option in effect

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
RIC_TRD_EXCH                        FIRST     *   |       CHARACTER
CNTRY_CDE                            NEXT     *   |       CHARACTER
HOLIDAY_DATE                         NEXT     *   |       CHARACTER
    SQL string for column : "TO_DATE (:holiday_date, 'YYYYMMDD')"
HOLIDAY_DESC                         NEXT     *   |       CHARACTER
TRD                                  NEXT     *   |       CHARACTER
STL                                  NEXT     *   |       CHARACTER

SQL*Loader-929: Error parsing insert statement for table GLOBALREF01.DW_STG_HOLIDAY_EXTRACT.
ORA-01031: insufficient privileges

所以我的问题是,既然我知道我有 INSERT 权限,我还需要授予哪些其他权限才能使其正常工作?

【问题讨论】:

  • 您是否测试过使用完全相同的凭据和连接字符串登录到 SQL*Plus,并发出单个插入语句?
  • 是的,大卫。解决方案是,您需要 SELECT privs 才能通过 SQL*Loader 执行 INSERT。有关详细信息,请参阅下面文森特的回答。

标签: sql oracle sql-loader


【解决方案1】:

我认为在大多数情况下您还需要SELECT 权限,因为 SQL*Loader 在插入之前会执行检查。

特别是default loading option is INSERT:

插入

这是 SQL*Loader 的默认方法。 它要求表 加载前为空。 SQL*Loader 终止并出现错误,如果 表包含行。

为了检查表是否为空,SQL*Loader 使用的帐户需要SELECT 权限。如果加载为APPEND,则可能不需要它。相反,如果您使用REPLACETRUNCATE 选项,则需要额外的权限。

【讨论】:

  • 这太棒了,文森特。在我将数据加载到我正在从中执行 sqlldr 的架构中授予对表的 SELECT 之后,SQL*Loader 能够很好地加载数据。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 2014-10-24
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多