Você está na página 1de 37

Restries de Integridade

Vania Bogorny

Restries de Integridade

Objetivo primordial de um SGBD


garantir a integridade de dados
Para garantir a integridade de um banco de dados
SGBDs oferecem o mecanismo de restries de
integridade
Uma restrio de integridade uma regra de
consistncia de dados que garantida pelo prprio
SGBD
Precisa ser testada quando um registro
includo, alterado ou excludo do BD

Restries de Integridade (RI)

RI garantem que mudanas feitas no


banco de dados por usurios autorizados
no resultem na perda da consistncia
dos dados

Restries de Integridade Bsicas


Restrio de vazio
Restries de domnio
Restries de chave primria
Integridade referencial

Check constraints
Gatilhos
Asseres

Garantidas pelo
SGBD
O programador
No se preocupa
Com estas restries

Restries de Integridade Semntica

H muitas restries de integridade que no se


encaixam nas categorias bsicas

Essas restries so chamadas de restries


semnticas (ou regras de negcio)

Exemplos de restries semnticas:


Um

empregado do departamento Financeiro no


pode ter a categoria funcional Engenheiro.
Um empregado no pode ter um salrio maior que
seu superior imediato.

Tambm chamadas de regras de negcio

Restries de Vazio

Restries de Valor Vazio

O cliente 548 no tem


nome
Esta tupla se refere a um
cliente annimo, o que
no tem muito sentido no
BD
Este pode ser um caso
em que se deseja proibir
valores vazios,
restringindo o domnio do
atributo nome para not
null

Matricula Nome endereco


548
549
...

Rua Carvalho 615


Pedro

Rua Pedro Chaves 22

Restries de Valor Vazio

Um valor de campo pode assumir o valor vazio


(null em ingls)
Colunas nas quais no so admitidos valores vazios
chamadas de colunas obrigatrias
Colunas nas quais podem aparecer valores vazios
chamadas de colunas opcionais

Abodagem relacional
todas colunas que compem a chave primria
devem ser obrigatrias
demais chaves podem conter colunas opcionais

Restries de Valor Vazio

Regra Nulo

Permite, ou no, que um atributo de uma tabela tenha valor


nulo (ausncia de valor)

Exemplo em SQL:

Create table funcionario


(matricula integer not null,
nome varchar(30) not null,
telefone varchar(20))

Insert into funcionario values(568, ,4833542519)

postgreSQL Erro: Null value in column nome violates


not-null constraint

Restries de Domnio

Restries de Domnio

Refere-se ao domnio de um atributo


Conjunto de valores que podem aparecer em
uma coluna (atributo)
Domnio de valores vlidos para um atributo

Restries de domnio so as mais


elementares

Facilmente verificadas pelo sistema

Restries de Domnio

Similar aos tipos de variveis em linguagens de


programao
Vrios atributos podem ter o mesmo domnio, mas tem
casos em que no faz sentido
Exemplo: o atributo idade numrico, precisa ser de
domnio inteiro, e no do tipo character, como o caso
do atributo nome
Create table funcionario
(matricula integer not null,
nome varchar(30) not null,
idade integer,
endereco varchar(35))

Restries de Domnio

O padro SQL suporta um conjunto restrito de tipos de domnio:


Cadeia com comprimento de caracteres fixo, com comprimento
especificado pelo usurio
Nmero de casas decimais
Inteiro (conjunto finito de nmeros inteiros)
Data
...
Create table funcionario
(matricula integer not null,
nome varchar(30) not null,
dataNascimento date,
endereco varchar(35))

Insert into funcionario values (5AB, Paulo, 20/15/1999, Av Ipiranga 1900)


Matricula Nome dataNascimento endereco
548

Maria

25/02/1973

Rua Carvalho 615

549

Pedro

14/06/1990

Rua Pedro Chaves 22

Restries de Chave

Restries de Chave - Primria

Regra chave primria


restringe

que cada linha de uma tabela deve


ser identificada por um valor nico

Pode ser simples ou composta

Chave simples
Create table medico
(codigoM integer not null,
nome varchar(30) not null,
endereco varchar(35),
PRIMARY KEY (matricula) )

chave composta
Create table consulta
(codigoMedico integer not null,
codigoPaciente integer not null,
data date not null,
PRIMARY KEY (codigoMedico,
codigoPaciente, data))

Restries de Chave Chave Candidata

Restries Unique garantem que os dados contidos em


uma coluna ou um grupo de colunas nico em relao
a todas as linhas da tabela

Sintaxe: quando escrita como uma restrio de coluna

CREATE TABLE produto (nroProduto integer UNIQUE,


nome varchar(30), preco real);

Sintaxe: quando escrita como uma restrio de tabela

CREATE TABLE produto (nroProduto integer,


nome varchar(30), preco real,
UNIQUE (product_no));

Restries de Integridade
Referencial

Restries de Integridade Referencial

Uma das restries mais importantes em BD


Definio: a garantia de que um valor que
aparece em uma relao R1, para um conjunto
de atributos, deve obrigatoriamente
corresponder a valores de um conjunto de
atributos em uma relao R2; OU
valores

de atributos que so chave estrangeira


em uma relao R1 possuem valores
correspondentes em chaves primrias da tabela
referenciada R2

Restries de Integridade Referencial

Exemplo

Cliente

CREATE TABLE cidade


(codigoCidade integer NOT NULL,
descricao varchar(40) NOT NULL,
estado char(2),
PRIMARY KEY (codigoCidade))

codigoClient
e

Nome

endereco

codigoCidade

548

Maria

Rua Carvalho 615

549

Pedro

Rua Pedro Chaves


22

Viola a restrio cidade 5 no existe


Cidade

CREATE TABLE cliente


(codigoCliente integer NOT NULL,
nome varchar(30) NOT NULL,
codCidade integer,
PRIMARY KEY (codigoCliente),
FOREIGN KEY (codCidade) REFERENCES Cidade

codigoCidad
e

Descricao

Estado

Florianpoli
s

SC

So Jos

SC

(codigoCidade))

A restrio garante que no ir existir CLIENTE que more numa cidade que no exista na tabela CIDADE

Restries de Integridade Referencial

A restrio de integridade testada quando:


Incluso:

se uma tupla t2 inserida em uma relao


r2, o sistema precisa assegurar que existe uma tupla
t1 em uma relao r1 tal que t1[r1]=t2[r2]

Ex: inclui novo cliente, testa se a cidade existe

Excluso:

removida

ON DELETE

Ex: Remove uma cidade referenciada por algum cliente

Alterao:

alterada

Uma chave primria referenciada

Uma chave primria referenciada

ON UPDATE

Ex: Altera a chave primaria da cidade referenciada em cliente

Restries de Integridade Referencial

AES:
NO

permite alterao ou excluso (NO ACTION ou


Restrict (default)):

no permite a excluso/alterao enquanto houver


dependncia;

SET

Ex: s permite excluir a cidade quando nenhum cliente


referenciar esta cidade

DEFAULT : se houver um valor default para a


coluna da chave estrangeira, ela recebe este valor
CASCADE : propaga a excluso/alterao;
SET NULL : atribui o valor nulo.

Restries de Integridade Referencial - INCLUSO

Incluso: ao inserir um novo cliente, preciso garantir que o


cdigo da cidade na tabela cliente EXISTA na tabela cidade
Para garantir isso cria-se a tabela de cliente com a chave
estrangeira codCidade

CREATE TABLE cliente


(codigoCliente integer NOT NULL,
nome varchar(30) NOT NULL,
codCidade integer,
PRIMARY KEY (codigoCliente),
FOREIGN KEY (codCidade) REFERENCES Cidade (codigoCidade))

Cliente

Cidade

codClient
e

Nome

endereco

codCidad
e

codCidad
e

Descricao

Estado

548

Maria

Rua Carvalho 615

SC

549

Pedro

Rua Pedro Chaves

Florianpoli
s

Restries de Integridade Referencial - EXCLUSO

Excluso: ao excluir uma cidade da tabela CIDADE, o SGBD precisa garantir que
no exista nenhum cliente na tabela CLIENTE referenciando esta cidade
vrias opes para garantir a integridade:
(opo 1) Setar para nulo o codigo da cidade na tabela CLIENTE

CREATE TABLE cliente


(codigoCliente integer NOT NULL, nome varchar(40) NOT NULL, codigoCidade integer,
PRIMARY KEY (codigoCliente),
FOREIGN KEY (codigoCidade) REFERENCES Cidade (codigoCidade) ON DELETE SET NULL))

(opo 2) assumir um valor default


CREATE TABLE cliente
(codigoCliente integer NOT NULL, nome varchar(40) NOT NULL, codigoCidade integer,
PRIMARY KEY (codigoCliente),
FOREIGN KEY (codigoCidade) REFERENCES Cidade (codigoCidade) ON DELETE SET DEFAULT))

Cliente

Cidade

codClient
e

Nome

endereco

codCidad
e

codCidad
e

Descricao

Estado

548

Maria

Rua Carvalho 615

NULL

SC

549

Pedro

Rua Pedro Chaves

Florianpoli
s

Restries de Integridade Referencial - EXCLUSO

(opo 3) NO permitir a excluso da cidade 1 porque tem clientes morando nesta


cidade. A cidade 3 pode ser excluda
CREATE TABLE cliente
(codCliente integer NOT NULL, nome varchar(40) NOT NULL,endereco varchar(40), codCidade
integer,
PRIMARY KEY (codCliente),
FOREIGN KEY (codCidade) REFERENCES Cidade (codCidade) ON DELETE RESTRICT))

Cliente

Cidade

codClient
e

Nome

endereco

codCidad
e

codCidad
e

Descricao

Estado

548

Maria

Rua Carvalho 615

SC

549

Pedro

Rua Pedro Chaves

Florianpoli
s

Restries de Integridade Referencial - EXCLUSO

(opo 4) remove as referencias (remove a cidade e todos os clientes da cidade)


CREATE TABLE cliente
(codCliente integer NOT NULL, nome varchar(40) NOT NULL, endereco varchar (40),
codCidade integer,
PRIMARY KEY (codCliente),
FOREIGN KEY (codCidade) REFERENCES Cidade (codigoCidade) ON DELETE CASCADE))

ISTO NO permitido neste contexto: significa que AO REMOVER A CIDADE,


REMOVA TAMBEM O CLIENTE

Cliente

Cidade

codClient
e

Nome

endereco

codCidad
e

codCidad
e

Descricao

Estado

548

Maria

Rua Carvalho
615

Florianpoli
s

SC

Restries de Integridade Referencial - EXCLUSO

Excluso: on delete cascade til quando: ao eliminar uma nota fiscal os seus itens
sejam removidos.

CREATE TABLE ITENS_NOTA


(numero integer NOT NULL, codProduto integer NOT NULL, qtde float,
PRIMARY KEY (numero),
FOREIGN KEY (codProduto) REFERENCES Produto (codProduto) ON DELETE RESTRICT),

FOREIGN KEY (numero) REFERENCES NOTA (numero) ON DELETE CASCADE))

Nota

Produto

numero

codCliente

Data

001

20/02/200
6

002

20/05/200
8

Itens_nota1
003
20/04/200
Numero
codProduto 8qtde

codProduto

Nome

valor

548

Pao

3,00

001

548

549

Leite

2,00

001

549

Restries SEmnticas

Check constraints
CREATE TABLE products ( product_no integer, name text, price
integer CHECK (price > 2 );
Teste: insert into products values (1,teste,0)
CREATE TABLE products ( product_no integer, name text, price numeric CONSTRAINT
positive_price CHECK (price > 0) );

CREATE TABLE products ( product_no integer, name text, price


numeric CHECK (price > 2), discounted_price numeric CHECK
(discounted_price > 0), CHECK (price >
discounted_price) );
Teste1: insert into products values (1,teste,0,0)
Teste2: insert into products values (1,teste,100,200)
Teste2: insert into products values (1,teste,100,50)

Gatilhos

Gatilhos
Interessante quando a incluso, alterao
ou excluso de um atributo em alguma
tabela tiver algum efeito sobre um atributo
de outra tabela
Exemplo: quando o saldo da conta do
cliente for negativo, insira
automaticamente um registro na tabela
emprstimo e faa o valor do saldo na
conta receber o valor zero

Gatilhos
No so o modo recomendado para
implementar restries de integridade
RI so normalmente suportadas pelos
SGBD atuais
Gatilhos podem ser disparados ANTES ou
DEPOIS do evento (insert, delete, update)
especificado

Gatilhos (triggers)
Define trigger saldo-negativo
On update of deposito t
(if new t.saldo<0 then
insert into emprestimo values( t.nomeAgencia,
t.numeroConta, t.nomeCliente, -new t.saldo)
update deposito s
set s.saldo=0 where s.numeroConta=t.numeroConta))

Gatilhos (triggers) em PostgreSQL


CREATE TABLE emp (
empname text, salary integer,

last_date timestamp,

last_user text);

CREATE TRIGGER t_emp BEFORE INSERT OR UPDATE ON emp


FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
BEGIN
-- Check that empname and salary are given
IF NEW.empname IS NULL THEN
RAISE EXCEPTION 'empname cannot be null';
END IF;
IF NEW.salary IS NULL THEN
RAISE EXCEPTION '% cannot have null salary', NEW.empname;
END IF;
-- Who works for us when she must pay for it?
IF NEW.salary < 0 THEN
RAISE EXCEPTION '% cannot have a negative salary', NEW.empname;
END IF;
-- Remember who changed the payroll when
NEW.last_date := current_timestamp;
NEW.last_user := current_user;
RETURN NEW;
END;
$emp_stamp$ LANGUAGE plpgsql;

Asseres
Predicado que expressa uma condio
que deve ser sempre satisfeita no BD
Exemplo
Um aluno s pode se matricular se no
tiver dbitos pendentes na biblioteca
sintaxe

create assertion <nome_restrio> check predicado


drop assertion <nome_restrio>

Asseres

Como o SQL no suporta PARA TODO,


precisamos usar o NOT EXISTS
Qdo uma assero criada
O sistema verifica sua validade
Se as asseres so vlidas

Qualquer modificao posterior no banco ser


permitida somente quando a assero no for
violada
A Verificao de asseres pode gerar um
aumento significativo no tempo de
processamento

Asseres

Exemplo: o numero da conta do cliente precisa estar entre 10.000 e 99.999

create assertion restricaoConta check


(not exists (select * from conta
where numero < 10.000 OR numero > 99.999))

Exerccios

1) Identificar as restries de integridade no


sistema acadmico, definindo o esquema de
criao de cada tabela contendo as restries.
2) Identificar as restries de integridade do
sistema de biblioteca
3) Identificar as restries de integridade
referencial do sistema mdico, as tabelas sobre
as quais foram realizados os exerccios de SQL
4) Identificar as regras de negcio do sistema