使用脚本确保Oracle中的数据完整性

使用脚本确保Oracle中的数据完整性,第1张

概述使用触发器或脚本来维护Oracle不是为了强制实施的数据完整性是不好的做法,还是这个标志我是以糟糕的方式建模我的数据? 从对上一篇文章(Implementing User Defined Fields)的回复中,我决定要继续使用Class和Concrete继承进行设计.我希望所有SAMPLE都有一个基类,然后是每个唯一属性集的具体表. 虽然我可以通过使SAMPLE.sample_id成为具有外键约 使用触发器或脚本来维护Oracle不是为了强制实施的数据完整性是不好的做法,还是这个标志我是以糟糕的方式建模我的数据?

从对上一篇文章(Implementing User Defined Fields)的回复中,我决定要继续使用Class和Concrete继承进行设计.我希望所有SAMPLE都有一个基类,然后是每个唯一属性集的具体表.

虽然我可以通过使SAMPLE.sample_ID成为具有外键约束的主键来强制执行每个具体表在SAMPLE中具有父条目.但是,我不知道如何强制SAMPLE条目只有一个子项,因为子条目可以在任意数量的表中.

我该如何强制执行此 *** 作?如果解决方案是INSERT,UPDATE和DELETE触发器,这被认为是不好的做法吗?

解决方法 我认为您可以通过使用物理化视图来解决这个问题,该视图是主表ID上的tableA,tableB和tableC组合.您必须创建物化视图日志,以使其成为快速可刷新的物化视图.并且您添加了一个检查约束,当每个主表ID在实例化视图中有多个行时,该约束会引发错误.

Rob van Wijk在这里解释了很多关于快速可刷新mv的问题. Rob van Wijk也经常出现在stackoverflow上.

在这里,您可以阅读物化视图中检查约束的使用:http://technology.amis.nl/blog/475/introducing-materialized-views-as-mechanism-for-business-rule-implementation-complex-declarative-constraints

使用快速可刷新的mv意味着在提交期间完成完整性检查,而不是在插入或更新数据期间.

我很累,我不能自己测试,我不能提供一个真实的例子.

edit1:这是一个例子:

当您使用检查约束和基于唯一函数的索引创建快速刷新mv时,它可以正常工作.

首先我们创建表:

sql> create table mastertable (ID number(10) not null primary key);sql> create table tablea(ID number(10) not null primary key,master_ID number(10) not null references mastertable (ID));sql> create table tableb(ID number(10) not null primary key,master_ID number(10) not null references mastertable (ID));sql> create table tablec(ID number(10) not null primary key,master_ID number(10) not null references mastertable (ID));

然后我们创建mv日志:

sql> create materialized vIEw log on tablea with rowID (master_ID)      including new values;sql> create materialized vIEw log on tableb with rowID (master_ID)      including new values;sql> create materialized vIEw log on tablec with rowID (master_ID)      including new values;

mv(真正需要umarker列!):

sql> create materialized vIEw table_abc     refresh fast with rowID on commit     as     select master_ID,count(*) master_count,'A' umarker     from   tablea     group by master_ID     union all     select master_ID,'B' umarker     from   tableb     group by master_ID     union all     select master_ID,'C' umarker     from   tablec     group by master_ID     /

现在我们为这个mv添加一个检查约束,以确保你不能在每个master_ID的同一个详细信息表中插入两次:

sql> alter table table_abc add check (master_count in (0,1) );

我们为此mv添加了一个基于函数的唯一索引,以确保您不能在具有相同master_ID的表a和表b中插入:

sql> create unique index table_abc_ufbi1 on table_abc     (case when master_count = 1 then master_ID else null end);

测试1(快乐路径):

sql>插入可修饰的值(1);

1 rij是aangemaakt.

sql>插入表格值(1,1);

1 rij是aangemaakt.

sql>承诺;

提交是voltooID.

测试2(表a中的一个插入和表b中的一个插入具有相同的master_ID)

sql>插入可修饰的值(2);

1 rij是aangemaakt.

sql>插入表格值(2,2);

1 rij是aangemaakt.

sql>插入tableb值(3,2);

1 rij是aangemaakt.

sql>承诺;
承诺
*
在regel 1中的FOUT:
.ORA-12008:Fout in pad voor vernIEuwen van snapshot.
ORA-00001:Schending van UNIQUE-beperking(TESTT.table_ABC_UFBI1).

测试3(在表中插入两次,使用相同的master_ID)

sql>插入可转换的值(3);

1 rij是aangemaakt.

sql>插入表格值(4,3);

1 rij是aangemaakt.

sql>插入表格值(5,3);

1 rij是aangemaakt.

sql>承诺;承诺*在regel 1中的FOUT:.ORA-12008:Fout in pad voor vernIEuwen van snapshot.ORA-02290:CHECK-beperking(TESTT.SYS_C0015406)是geschonden.

总结

以上是内存溢出为你收集整理的使用脚本确保Oracle中的数据完整性全部内容,希望文章能够帮你解决使用脚本确保Oracle中的数据完整性所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1164669.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存