行使剧本确保Oracle中的数据完备性
行使触发器或脚原来维护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>理睬; 测试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. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |