CREATE DOMAIN nome [ AS ] tipo_de_dado [ DEFAULT expressão ] [ restrição [ ... ] ] onde restrição é: [ CONSTRAINT nome_da_restrição ] { NOT NULL | NULL | CHECK (expressão) }
O comando CREATE DOMAIN cria um domínio. O domínio é, essencialmente, um tipo de dado com restrições opcionais (restrições no conjunto de valores permitidos). O usuário que cria o domínio se torna o seu dono. [1] [2] [3]
Se for fornecido o nome do esquema (por exemplo, CREATE DOMAIN meu_esquema.meu_dominio ...), então o domínio será criado no esquema especificado, senão será criado no esquema corrente. O nome do domínio deve ser único entre os tipos e domínios existentes no esquema do domínio.
Domínios são úteis para reunir restrições comuns em campos em um único local para manutenção. Por exemplo, várias tabelas podem conter colunas de endereço de correio eletrônico, todas requerendo a mesma restrição de verificação (CHECK). Em vez de definir as restrições em cada tabela individualmente, pode ser definido um domínio.
O nome (opcionalmente qualificado pelo esquema) do domínio a ser criado.
O tipo de dado subjacente do domínio, podendo incluir especificadores de matrizes (arrays).
A cláusula DEFAULT especifica o valor padrão para as colunas com o tipo de dado do domínio. O valor é qualquer expressão sem variável (variable-free) (mas não são permitidas subconsultas). O tipo de dado da expressão padrão deve corresponder ao tipo de dado do domínio. Se não for especificado um valor padrão, então o valor nulo será o valor padrão.
A expressão padrão é utilizada em toda operação de inserção que não especifica valor para a coluna. Se for definido um valor padrão para uma determinada coluna, este valor padrão prevalecerá sobre o valor padrão associado ao domínio. Por sua vez, o valor padrão para o domínio prevalece sobre o valor padrão associado ao tipo de dado subjacente.
Um nome opcional para a restrição. Quando não é especificado, o sistema gera um nome.
Não são permitidos valores nulos neste domínio.
São permitidos valores nulos neste domínio. Este é o padrão.
Esta cláusula tem somente a finalidade de manter a compatibilidade com os bancos de dados SQL fora do padrão. Desaconselha-se a utilização desta cláusula nos novos aplicativos.
A cláusula CHECK especifica as restrições de integridade, ou testes, que os valores do domínio devem satisfazer. Cada restrição deve ser uma expressão que produz um resultado booleano. Deve ser utilizada a palavra chave VALUE para fazer referência ao valor sendo testado.
Atualmente as expressões CHECK não podem conter subconsultas, nem fazer referências a variáveis diferentes de VALUE.
Este exemplo cria o tipo de dado us_postal_code (código postal americano), e usa este tipo na definição da tabela. É utilizada uma expressão regular para verificar se o valor se parece com um código postal americano válido.
CREATE DOMAIN us_postal_code AS TEXT CHECK( VALUE ~ '^\\d{5}$' OR VALUE ~ '^\\d{5}-\\d{4}$' ); CREATE TABLE us_snail_addy ( address_id SERIAL PRIMARY KEY, street1 TEXT NOT NULL, street2 TEXT, street3 TEXT, city TEXT NOT NULL, postal us_postal_code NOT NULL );
Este exemplo cria o domínio dom_cep (código de endereçamento postal brasileiro), e usa este domínio na definição de uma função e de uma tabela. Abaixo estão mostrados os comandos para criar o domínio, a função que utiliza o domínio no parâmetro, e a tabela que utiliza o domínio na coluna. [4]
CREATE DOMAIN dom_cep AS text CONSTRAINT chk_cep CHECK (VALUE ~ '^\\d{8}$'); CREATE FUNCTION formata_cep(cep dom_cep) RETURNS TEXT AS $$ BEGIN RETURN substr(cep,1,5) || '-' || substr(cep,6,3); END; $$ LANGUAGE plpgsql; CREATE TABLE tbl_cep (cep dom_cep);
Foram feitos três testes para a função: No primeiro teste a cadeia de caracteres é convertida explicitamente para o domínio dom_cep; No segundo teste a cadeia de caracteres é passada diretamente sem nenhuma conversão explícita, mas atende a restrição de verificação do domínio; No terceiro teste a cadeia de caracteres é passada diretamente sem nenhuma conversão explícita, e não atende a restrição de verificação do domínio (não possui 8 dígitos, apenas 7).
=> SELECT formata_cep(CAST('20031050' AS dom_cep)); formata_cep ------------- 20031-050 (1 linha) => SELECT formata_cep('20031050'); formata_cep ------------- 20031-050 (1 linha) => SELECT formata_cep('2003105'); ERRO: valor para domínio dom_cep viola restrição de verificação "chk_cep"
Como pode ser visto pelos resultados, no primeiro teste o domínio foi aceito corretamente, no segundo teste foi feita a conversão implícita e o valor foi aceito, e no terceiro teste a conversão implícita não foi bem-sucedida porque a cadeia de caracteres viola a restrição de verificação chk_cep.
Também foram feitos três testes de inserção na tabela, com resultados semelhantes aos obtidos na utilização da função:
=> INSERT INTO tbl_cep VALUES (CAST('20031050' AS dom_cep)); INSERT 0 1 => INSERT INTO tbl_cep VALUES ('20031050'); INSERT 0 1 => INSERT INTO tbl_cep VALUES ('2003105'); ERRO: valor para domínio dom_cep viola restrição de verificação "chk_cep"
[1] |
4.6.3.1 — Domínios — Um domínio é um objeto nomeado definido pelo usuário, que pode ser especificado como uma alternativa ao tipo de dado em certos locais onde o tipo de dado pode ser especificado. O domínio consiste do tipo de dado, possivelmente a opção default, e zero ou mais restrições (domínio). 4.6.3.2 — Restrições de domínio — A restrição de domínio se aplica a todas as colunas baseadas neste domínio, operando como uma restrição de tabela para cada coluna deste tipo. As restrições de domínio se aplicam apenas às colunas baseadas no domínio associado. A restrição de domínio é aplicada a todo valor resultante de uma operação de conversão (cast) para o domínio. 4.6.5 — Tipos distintos — O tipo distinto é um tipo de dado definido pelo usuário que é baseado em algum tipo pré-definido. Os valores do tipo distinto são representados pelos valores do tipo no qual se baseia. Um argumento de um tipo distinto somente pode ser passado para um parâmetro do mesmo tipo distinto. Isto permite um controle preciso sobre quais rotinas podem ser chamadas com argumentos deste tipo de dado. (ISO-ANSI Working Draft) Framework (SQL/Framework), August 2003, ISO/IEC JTC 1/SC 32, 25-jul-2003, ISO/IEC 9075-1:2003 (E) (N. do T.) |
[2] |
4.12 — Domínios — O domínio é um conjunto de valores permitidos. O domínio é definido no esquema e é identificado pelo <nome do domínio>. A finalidade do domínio é restringir o conjunto de valores válidos que podem ser armazenados na coluna da tabela base por várias operações. A definição do domínio especifica o tipo de dado. Também pode especificar a <restrição de domínio> que restringe ainda mais os valores válidos do domínio, e a <cláusula padrão> que especifica o valor a ser utilizado na ausência de um valor especificado explicitamente ou do valor padrão da coluna. O domínio é descrito pelo descritor de domínio. O descritor de domínio inclui: O nome do domínio; O descritor de tipo de dado do tipo de dado do domínio; O valor da <opção padrão>, se houver alguma, do domínio; Os descritores de restrição do domínio das restrições do domínio, se houver algum, do domínio. (ISO-ANSI Working Draft) Foundation (SQL/Foundation), August 2003, ISO/IEC JTC 1/SC 32, 25-jul-2003, ISO/IEC 9075-2:2003 (E) (N. do T.) |
[3] |
SQL Server — O domínio é o conjunto de todos os valores permitidos para a coluna. O domínio inclui não somente o conceito de impor o tipo de dado, mas também os valores permitidos na coluna. Por exemplo, o domínio da coluna cor da tabela Produto inclui o tipo de dado nvarchar e o tamanho limite de 15 caracteres. O domínio também poderia especificar as cadeias de caracteres permitidas na coluna, como Vermelho, Azul, Verde, Amarelo, Marrom, Preto, Branco, Ciano, Cinza e Prata. SQL Server 2005 Books Online — Data Integrity Basics (N. do T.) |
[4] |
Exemplo escrito pelo tradutor, não fazendo parte do manual original. |