【问题标题】:validation of constraints in oracle在 oracle 中验证约束
【发布时间】:2018-02-13 22:54:12
【问题描述】:

我是 oracle 新手,我想知道我们如何在 ETL 测试过程中验证 oracle 表中的约束。 (这两个表可以是 T1 和 T2)。请让我知道一个示例查询。

谢谢,桑托什

【问题讨论】:

  • 我将验证约束以尝试加载违反约束的记录的方式
  • 如果您想查看约束是否有效,事后执行选择 WHERE 并将检查约束逻辑添加到谓词 - 如果您得到任何结果,您需要清理您的创建/启用约束之前的数据

标签: oracle validation testing constraints etl


【解决方案1】:

这是您拥有的选项的示例

SQL> create table t1 as select distinct owner from dba_objects;

Table created.

SQL> alter table t1 add primary key ( owner );

Table altered.

SQL> create table t2 as select * from dba_objects;

Table created.

SQL>
SQL> update t2 set owner = 'BAD_DATA' where rownum <= 10;

10 rows updated.

SQL> commit;

Commit complete.

所以我们想在 T1 和 T2 之间链接 OWNER,而 T2 有一些坏数据。添加约束会报错

SQL>
SQL> alter table t2 add constraint fk foreign key ( owner ) references t1 ( owner );
alter table t2 add constraint fk foreign key ( owner ) references t1 ( owner )
                              *
ERROR at line 1:
ORA-02298: cannot validate (MCDONAC.FK) - parent keys not found

所以我要做的第一件事就是在 NOVALIDATE 模式下启用它,这意味着不会有更多坏数据进入

SQL>
SQL>
SQL>
SQL> alter table t2 add constraint fk foreign key ( owner ) references t1 ( owner ) enable novalidate;

Table altered.

现在,一旦您完成了该操作,您就可以尝试验证约束。 (显然我们知道这会失败,但在一般情况下,您会启用 novalidate,然后尝试启用 validate。这意味着您的系统锁定更少)

SQL>
SQL> alter table t2 modify constraint fk enable validate;
alter table t2 modify constraint fk enable validate
                                 *
ERROR at line 1:
ORA-02298: cannot validate (MCDONAC.FK) - parent keys not found

如果我们想查看实际的坏数据,那么我们可以在 $ORACLE_HOME/rdbms/admin 中使用预交付的脚本创建一个名为 EXCEPTIONS 的表。

SQL> @?/rdbms/admin/utlexcpt.sql

Table created.

现在我们可以扩展 validate 命令来捕获行。我们仍然得到错误

SQL>
SQL> alter table t2 modify constraint fk enable validate exceptions into exceptions;
alter table t2 modify constraint fk enable validate exceptions into exceptions
                                 *
ERROR at line 1:
ORA-02298: cannot validate (MCDONAC.FK) - parent keys not found

但是现在坏行已经被捕获到一个表中

SQL>
SQL> select * from exceptions;

ROW_ID             OWNER                TABLE_NAME CONSTRAINT
------------------ -------------------- ---------- --------------------
AAAySAAAHAAABhjAAA MCDONAC              T2         FK
AAAySAAAHAAABhjAAB MCDONAC              T2         FK
AAAySAAAHAAABhjAAC MCDONAC              T2         FK
AAAySAAAHAAABhjAAD MCDONAC              T2         FK
AAAySAAAHAAABhjAAE MCDONAC              T2         FK
AAAySAAAHAAABhjAAF MCDONAC              T2         FK
AAAySAAAHAAABhjAAG MCDONAC              T2         FK
AAAySAAAHAAABhjAAH MCDONAC              T2         FK
AAAySAAAHAAABhjAAI MCDONAC              T2         FK
AAAySAAAHAAABhjAAJ MCDONAC              T2         FK

10 rows selected.

如果您想运行一个简单的查询来检查哪些行是错误的,那么您想要获取未设法连接的行的外部连接也可以解决问题。

SQL>
SQL> select t2.owner, t2.rowid
  2  from t1,
  3       t2
  4  where t2.owner = t1.owner(+)
  5  and t1.owner is null;

OWNER                ROWID
-------------------- ------------------
BAD_DATA             AAAySAAAHAAABhjAAA
BAD_DATA             AAAySAAAHAAABhjAAB
BAD_DATA             AAAySAAAHAAABhjAAC
BAD_DATA             AAAySAAAHAAABhjAAD
BAD_DATA             AAAySAAAHAAABhjAAE
BAD_DATA             AAAySAAAHAAABhjAAF
BAD_DATA             AAAySAAAHAAABhjAAG
BAD_DATA             AAAySAAAHAAABhjAAH
BAD_DATA             AAAySAAAHAAABhjAAI
BAD_DATA             AAAySAAAHAAABhjAAJ

10 rows selected.

SQL>
SQL>
SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2015-02-03
    相关资源
    最近更新 更多