加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

行使剧本确保Oracle中的数据完备性

发布时间:2021-01-27 22:41:26 所属栏目:站长百科 来源:网络整理
导读:行使触发器或脚原来维护Oracle不是为了逼迫实验的数据完备性是欠好的做法,照旧这个符号我是以糟糕的方法建模我的数据? 从对上一篇文章(Implementing User Defined Fields)的回覆中,我抉摘要继承行使Class和Concrete担任举办计划.我但愿全部SAMPLE都有一个基

行使触发器或脚原来维护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.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读