oracle中约束的验证
validation of constraints in oracle
我是 oracle 的新手,我想知道我们如何在 ETL 测试过程中验证 oracle 表中的约束。 (这两个表可以是 T1 和 T2)。请让我知道一个示例查询。
谢谢,桑托什
这是您的选项示例
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.
所以我们想 link 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,然后尝试启用验证。这意味着您的系统锁定更少)
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 的 table
SQL> @?/rdbms/admin/utlexcpt.sql
Table created.
现在我们可以扩展验证命令来捕获行。我们仍然得到错误
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
但现在坏行已被捕获到 table
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>
我是 oracle 的新手,我想知道我们如何在 ETL 测试过程中验证 oracle 表中的约束。 (这两个表可以是 T1 和 T2)。请让我知道一个示例查询。
谢谢,桑托什
这是您的选项示例
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.
所以我们想 link 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,然后尝试启用验证。这意味着您的系统锁定更少)
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 的 tableSQL> @?/rdbms/admin/utlexcpt.sql
Table created.
现在我们可以扩展验证命令来捕获行。我们仍然得到错误
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
但现在坏行已被捕获到 table
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>