Em 10 de setembro de 2010 14:51, Osvaldo Kussama
<osvaldo.kuss...@gmail.com> escreveu:
> Para mim deu certo:
>
> bdteste=# CREATE TEMP TABLE tst_cons(
> bdteste(# nome   text,
> bdteste(# CONSTRAINT funcionarios_nome_check CHECK (nome::text ~*
> '^[[:alpha:]á-ú][[:alpha:]á-ú ]*[[:alpha:]á-ú]$'::text));
> CREATE TABLE
> bdteste=# INSERT INTO tst_cons(nome) VALUES ('João');
> INSERT 0 1
> bdteste=# INSERT INTO tst_cons(nome) VALUES ('João ');
> ERROR:  new row for relation "tst_cons" violates check constraint
> "funcionarios_nome_check"
> bdteste=#
> bdteste=# INSERT INTO tst_cons(nome) VALUES (' João');
> ERROR:  new row for relation "tst_cons" violates check constraint
> "funcionarios_nome_check"
> bdteste=#
> bdteste=# INSERT INTO tst_cons(nome) VALUES ('João é nome válido');
> INSERT 0 1
> bdteste=# INSERT INTO tst_cons(nome) VALUES ('João 1º');
> ERROR:  new row for relation "tst_cons" violates check constraint
> "funcionarios_nome_check"
> bdteste=#
> bdteste=# SELECT * FROM tst_cons;
>        nome
> --------------------
>  João
>  João é nome válido
> (2 rows)
>


Complementando:
Creio que se você utilizar a expressão regular:
E'^[A-ZÀ-Ý][A-ZÀ-Ý ]*[A-ZÀ-Ý]$'
você irá considerar todos os caracteres normais e acentuados (maiúsculos).
Assim sua constraint ficaria:
CONSTRAINT funcionarios_nome_check CHECK (nome::text ~*
E'^[A-ZÀ-Ý][A-ZÀ-Ý ]*[A-ZÀ-Ý]$'::text));

Outra possibilidade é você testar apenas:
CONSTRAINT funcionarios_nome_check CHECK (nome::text ~* E'^[A-ZÀ-Ý ]+$'::text));
e utilizar, por ex em uma trigger, a função trim(both from nome) para
eliminar eventuais espaços no início ou fim do nome.

Osvaldo
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a