Usando Expressão regular em Check Constraint, 10g e superior

A um tempo atras tive que criar algumas check’s para bloquear palavras de um campo, hoje no lugar das dezenas de checks constraints que criei troquei todas por uma unica. Vou dar um exemplo simples mostrando como funciona e a expressao regular ajudou nesta questão. Exemplo: Bloquear o campo titulo da tabela gn_globo para que não receba referencias exatas da concorrencia nesta. A primeira idéia foi utilizar a função instr e minha check:

ALTER TABLE gn_globo
ADD constraint glb_titulo_ban_sbt_ck CHECK
( instr(lower(titulo), 'sbt') = 0 );

ALTER TABLE gn_globo
ADD constraint glb_titulo_ban_record_ck CHECK
( instr(lower(titulo), 'record') = 0);

ALTER TABLE gn_globo
ADD constraint glb_titulo_ban_redetv_ck CHECK
( instr(lower(titulo), 'redetv') = 0 );

SQL>  INSERT INTO gn_globo VALUES (1,'TEste de Texto');

1 row created.

SQL>  INSERT INTO gn_globo VALUES (2,'Teste do Sbt reporter');
INSERT INTO gn_globo VALUES (2,'Teste do Sbt reporter')
*
ERROR at line 1:
ORA-02290: CHECK constraint (RAFA.GLB_TITULO_BAN_SBT_CK) violated

SQL>  INSERT INTO gn_globo VALUES (3,'Teste do reCord reporter');
INSERT INTO gn_globo VALUES (3,'Teste do reCord reporter')
*
ERROR at line 1:
ORA-02290: CHECK constraint (RAFA.GLB_TITULO_BAN_RECORD_CK) violated

SQL>  INSERT INTO gn_globo VALUES (4,'Teste do RedeTV reporter');
INSERT INTO gn_globo VALUES (4,'Teste do RedeTV reporter')
*
ERROR at line 1:
ORA-02290: CHECK constraint (RAFA.GLB_TITULO_BAN_REDETV_CK) violated

SQL>  INSERT INTO gn_globo VALUES (5,'Teste do gn_globo reporter');

1 row created.

Ahhhh legal, assim tenho também como controlar a cada check.
Mas acabei encontrando uma forma melhor para construi-las e com muito mais elegante:

 

ALTER TABLE gn_globo DROP constraint glb_titulo_ban_sbt_ck;
 ALTER TABLE gn_globo DROP constraint glb_titulo_ban_record_ck;
 ALTER TABLE gn_globo DROP constraint glb_titulo_ban_redetv_ck;
ALTER TABLE gn_globo
 ADD constraint glb_titulo_ban_ck CHECK
( NOT REGEXP_LIKE(titulo,'(sbt)|(record)|(redetv)' ,'i'));

 

Assim tenho as 3 regras anteriores em uma unica regra simples e prática, utilizando expressão regular. Ref. REGEXP_LIKE Oracle Database Implementation of Regular Expressions

%name Usando Expressão regular em Check Constraint, 10g e superior

Autor: Rafael Stoever

Bacharel em Sistema de Informação pela Uniasselvi, atualmente cursando Gerenciamento de Projetos em TI pela Pós Graduação Uniasselvi. Atuo como Analista de suporte a banco de dados – DBA pela Lumina Serviços em TI residente de Blumenau/ SC, OPN Certified Specialist, Certificado OCP 10g/11g/12c, OCE RAC10g e Linux 10g. Conhecimentos em Microsoft SqlSever, Mysql e programação web (php,asp).