quarta-feira, janeiro 13, 2010

Implementando Constraints

Constraints são utilizadas como um meio de segurança prevenindo a entrada de dados fora de um limite estabelecido pelo DBA.
É possível criar um constraints com dois diferentes níveis:
Coluna: É aplicado somente na coluna e não pode referenciar outra coluna.
Tabela: Pode ser referenciado em qualquer coluna de uma tabela, mais não pode fazer referência a outras tabelas.

Criando um rule para validação de e-mail
create rule EmailValida
as
@value like '%@%.[a-z][a-z][a-z]' or @value like '%@%.[a-z][a-z].[a-z][a-z]';

Criando um tabela para realizar a aplicação da Rule

create table Teste(
nome varchar(30) not null,
email varchar(30) not null
)

Aplicando a rule a coluna email
EXEC sp_bindrule 'EmailValida','Teste.email'

Após aplicar a rule eu tento inserir um valor que não passa na validação da rule “s”.
insert Teste(nome,email) values ('maykon','s')
Gera o seguinte erro:

A column insert or update conflicts with a rule imposed by a previous CREATE RULE statement. The statement was terminated. The conflict occurred in database 'data', table 'dbo.Teste', column 'email'.

Este valor passa na validação

insert Teste(nome,email) values ('maykon','maykon@.com.br')
Adicionado default constraint na coluna cidade

create table Teste2(
nome varchar(30) not null,
email varchar(30) not null,
cidade varchar(60) not null default 'Cidade'
)


Unique Constraints
Com essa funcionalidade da para negar a inserção de valores duplicados em uma coluna.

create table Teste3(
nome varchar(30) not null unique nonclustered,
email varchar(30) not null,
cidade varchar(60) not null default 'Cidade'
)

Inserindo os dados

insert Teste3(nome,email,cidade) values ('maykon','maykon@sc.br',default)
Se eu tentar executar novamente a query vai gerar o seguinte erro.
Violation of UNIQUE KEY constraint 'UQ__Teste3__014935CB'. Cannot insert duplicate key in object 'dbo.Teste3'.

Criação de uma chave primária.
create table Teste4(
id int primary key,
nome varchar(30) not null
)

Nenhum comentário: