Restrições de
Integridade
Roteiro
•
Manutenção de RI através das transações
•
Declaração e Manutenção de RI em SQL-92
•
Restrições Declarativas em SQL-92
•
Manutenção de Rest. Referencial em SQL-92
•
Definindo Restrições Gerais com Assertivas
•
Banco de Dados Ativos
Motivação
•
Um Banco de Dados armazena informações
sobre uma parte do mundo real: o
mini-mundo.
•
Deve haver regras que determinam quando
uma dada informação pode ser armazenada,
de forma a manter o banco consistente
• Para isso, o SGBD deve:
– garantir que as informações armazenadas sejam
sempre exatas e consistentes
– oferecer mecanismos para garantir a
Restrições de Integridade
•
São as regras que governam o mini-mundo
•
Especificam os estados do BD que são
considerados consistentes.
– O Estado de um Banco de Dados é dito
Restrições de Integridade
•
São regras de consistência de dados,
garantidas pelo próprio SGBD.
•
Precisam ser testadas quando um registro
é incluído, alterado ou excluído do BD
•
Garantem
que mudanças feitas no banco
de dados por usuários autorizados não
Manutenção de RIs
•
Qualquer operação de atualização do BD
deve preservar as restrições de
integridade.
mapeia um estado consistente em um outro estado consistente
•
Quando uma atualização viola uma
restrição pode-se:
– Proibir a atualização (“Rolling Back”) – Disparar ações corretivas
Estad o Inicial
Estad o Final
Enfoques para manutenção de
RIs
•
Através dos programas de aplicação que
utilizam o BD (manutenção por
transações)
•
Através do SGBD
(database enforced constraints)– Enfoque Declarativo
Manutenção por transações
•
As restrições são checadas pelas
transações realizadas pelas aplicações que
acessam o BD.
•
Parte do código da transação deve checar
explicitamente se alguma RI será violada.
•
Em caso positivo, a transação deve ser
abortada ou tratada.
SGBD passivo
BD1 BD2
Manutenção por transações
•
Vantagens :
– Bem geral. Pode ser utilizado em qualquer BD – Permite checagem de forma eficiente.
•
Desvantagens :
– Não é flexível; é completamente aberto.
– Responsabilidade extra para o programador. – Mudanças nas restrições requerem
recodificação das transações.
– Falta de segurança.
Manutenção através do SGBD
•
Enfoque Declarativo
– RI é implementada como parte do comando de
definição de uma tabela
•
Enfoque Procedimental:
Restrições Implícitas X Explícitas
•
Restrições Implícitas (Declarativas) –
– São especificadas usando a LDD do modelo de dados.
•
Restrições Explicitas (Regras de Negocio)
– Não podem ser capturadas nos esquemas do
banco de dados, nem usando LDD.
– Exemplos:
• Um empregado do departamento “Financeiro” não
pode ter a ocupação “Recepcionista”.
• Um empregado não pode ter um salário maior que
Restrições Declarativas em
SQL-92
•
DE DOMÍNIO
•
NOT NULL
•
DEFAULT
•
CHECK
•
CHAVE PRIMÁRIA
•
UNIQUE
Restrições de domínio
•
Refere-se ao domínio de um atributo
– Especificam que o valor de cada atributo A de
uma relação deve ser um valor atômico do domínio dom(A)
•
Restrições de domínio são as mais
elementares
Restrições de domínio
• Similar aos tipos de variáveis em linguagens de
programação
• Vários atributos podem ter o mesmo domínio • Avaliar quando cada tipo deve ser utilizado • Exemplo:
– o atributo idade é numérico, deve ser de domínio
inteiro, e não do tipo character, como é o caso do atributo nome
Create table aluno
(matricula integer not null,
nome varchar(30) not null,
Restrições de domínio
• O padrão SQL-92 suporta um conjunto restrito de tipos de domínio:
– Cadeia com comprimento de caracteres fixo, com comprimento especificado pelo usuário
– Número de casas decimais
– Inteiro (conjunto finito de números inteiros)
– Data, etc
Create table aluno
(matricula integer not null,
nome varchar(30) not null,
dataNascimento date,
curso varchar(20))
Matricul
a Nome dataNascimento Curso
123 Ana Maia 20/05/1990 Matemática 234 Rafael Gomes 01/02/1992 Física
456 Carla Sousa 23/09/1990 Computação
Restrição de valor vazio
•
O valor especial null é utilizado para
representar valores não conhecidos ou
não aplicáveis a uma determinada tupla
– Restrição de valor vazio determina quando
esse valor pode ou não ser atribuído
•
Ex:
– O aluno 123 não tem nome, a tupla se refere a um aluno anônimo, o que não faz sentido no BD.
– Restringir o domínio do atributo nome para
not nullMatricula123 Nome Telefone(85) 32234545 MatemáticaCurso
234 Rafael Gomes (85) 34820908 Física
Restrição de valor vazio
•
Um valor de atributo pode assumir o valor
vazio
– Colunas obrigatórias
• Colunas nas quais não são admitidos valores vazios
– Colunas opcionais
• Colunas nas quais podem aparecer valores vazios
•
Abodagem relacional
– todas colunas que compõem a chave primária devem ser obrigatórias
– demais chaves podem conter colunas
Restrição de valor vazio
• Exemplo em SQL-92: – Create table aluno
(matricula integer not null,
nome varchar(30) not null,
telefone varchar(20) curso varchar(20))
• Inserções que violam a restrição NOT NULL
– Insert into aluno values(234, ´´,´32820009´,’física’)
– Insert into aluno values(null,’Rafael Gomes’,48-33542519
´,’matematica’)
• Inserções válidas
Restrições de chave
• Por definição todas as tuplas são distintas
• Um conjunto de atributos SK de um esquema de relação R tal que:
– para duas tuplas distintas quaisquer t1 e t2 de r(R) t1[SK] ≠ t2[SK] é uma super-chave de R
– Super-chave default: todos os atributos
• Uma chave de R é uma super-chave com a
propriedade adicional de que nenhum de seus
subconjuntos também seja uma super-chave de R
Restrições de Chave
•
Um esquema de relação pode ter mais de
uma chave , denominadas chaves
candidatas
•
Dentre as chaves candidatas de um
esquema de relação, uma delas é indicada
como
chave primária
e as demais
Restrição de Chave Primária
•
Cada relação deve possuir uma chave
primária
– Restrição para que cada tupla de uma relação
seja identificada por um valor único
•
Pode ser simples ou composta
Chave simples Chave composta
Create table aluno
(matricula integer not null,
nome varchar(30) not null,
endereco varchar(35),
PRIMARY KEY (matricula) )
Create table professor
(cpf integer not null,
regProfessor integer not null,
endereço varchar(35),
Restrições Chave Alternativa
• Restrições Unique garantem que os dados
contidos em uma coluna ou um grupo de colunas é único em relação a todas as linhas da tabela
– Sintaxe: quando escrita como uma restrição de
coluna
CREATE TABLE curso (codigoCurso integer UNIQUE, nome varchar(30));
– Sintaxe: quando escrita como uma restrição de
tabela
Restrição Referencial
•
Seja FK um conjunto de atributos de um
esquema de relação R
1definido sobre o
mesmo domínio dos atributos da chave
primária PK de outro esquema R
2.
•
Então, para qualquer tupla t
1de R
1:
– t1[FK] = t2[PK], onde t2 é uma tupla de R2
Restrição Referencial
•
A restrição de integridade referencial pode
ser expressa pela notação R
1[FK] R
2[PK],
– onde PK é a chave primária de R2 e FK é a chave estrangeira de R1
•
Exemplos:
– Aluno[curso] Curso[codCurso] – Professor[cpf] Ensina[prof]
Exemplo
Matricul
a Nome Curso
123 Ana Maia 100 234 Rafael Gomes 200 456 Carla Sousa 300 678 Solon Pinheiro 800
codCurso Nome
100 Matematica 200 Física
300 Computação
Viola a restrição referencial, pois curso 800 não existe
CREATE TABLE curso
(codCurso integer NOT NULL, nome varchar(40) NOT NULL,
PRIMARY KEY (codCurso))
CREATE TABLE aluno
(matricula integer NOT NULL, nome varchar(30) NOT NULL, curso integer,
PRIMARY KEY (matricula),
FOREIGN KEY (curso) REFERENCES curso (codCurso))
Curso
Manutenção de Restrições de
Integridade
•
O que fazer quando uma atualização viola
uma RI?
– Proibir a atualização (“Rolling Back”) – Disparar ações corretivas.
•
No caso das restrições declarativas, com
exceção da
Restrição Referencial
, se um
Manutenção de Restrições de
Integridade
• As operações de atualização devem preservar as Restrições de Integridade.
nome #CI #depto dnome #depto josé 623.090 D1 pessoal D1
a) insere <Pedro, 623.090 , D1> b) insere <Maria, 678.095 , D2> c) insere <Marta, NULL , D1>
d) Remover a tupla de depto t.q. #depto=‘D1’
e) Modifique o #depto da tupla de Empregado com #CI=623.090 para #D2
Manutenção da Restrição
Referencial
• Que operações de atualização podem violar essa RR?
– Aluno[curso] Curso[codCurso]
• O que fazer quando uma atualização viola essa RR?
– As ações corretivas possíveis dependem do tipo da
operação de atualização.
– A ação corretiva correta é depende da semântica do
relacionamento (é uma decisão de projeto). Matric
ula Nome Curso
codCur
so Nome
Curso
Ações Corretivas para manutenção
de RR
•
NO ACTION
(default):
– não permite a exclusão/alteração enquanto
houver dependência;
• Ex: só permite excluir o curso quando nenhum aluno referenciar este curso
•
SET DEFAULT
: se houver um valor
default para a coluna da chave
estrangeira, ela recebe este valor
Ações Corretivas para manutenção
de R
1[FK] R
2[PK]
•
Na remoção em R
2CASCADE
ON DELETE SET DEFAULT SET NULL
CREATE TABLE aluno
CONSTRAINT FK_curso_aluno FOREIGN KEY (curso)
Ações Corretivas para manutenção
de Aluno[curso] Curso[codCurso]
Matricul
a Nome Curso
123 Ana Maia 100 234 Rafael Gomes 200 456 Carla Sousa 300
Ações Corretivas para manutenção
de Aluno[curso] Curso[codCurso]
Matricul
a Nome Curso
123 Ana Maia NULL 234 Rafael Gomes 200 456 Carla Sousa 300
Ações Corretivas para manutenção
de R
1[FK] R
2[PK]
•
Na modificação em R
2CASCADE
ON UPDATE SET DEFAULT SET NULL
CREATE TABLE aluno
CONSTRAINT FK_curso_aluno FOREIGN KEY (curso)
Ações Corretivas para manutenção
de Aluno[curso] Curso[codCurso]
Matricul
a Nome Curso
123 Ana Maia 404 234 Rafael Gomes 200 456 Carla Sousa 300
Ações Corretivas para manutenção
de Aluno[curso] Curso[codCurso]
Matricul
a Nome Curso
123 Ana Maia NULL 234 Rafael Gomes 200 456 Carla Sousa 300
Exemplo de Código Gerado pelo
Workbench
-- --- Table `mydb`.`CURSO`
--
---CREATE TABLE IF NOT EXISTS `mydb`.`CURSO` ( `codCurso` INT NOT NULL ,
`nome` VARCHAR(45) NULL , PRIMARY KEY (`codCurso`) ) ENGINE = InnoDB;
-- --- Table `mydb`.`ALUNO`
--
---CREATE TABLE IF NOT EXISTS `mydb`.`ALUNO` ( `matricula` INT NOT NULL ,
`nome` VARCHAR(45) NULL , `curso` INT NULL ,
PRIMARY KEY (`matricula`) , INDEX `fk1` (`curso` ASC) , CONSTRAINT `fk1`
FOREIGN KEY (`curso` )
REFERENCES `mydb`.`CURSO` (`codCurso` ) ON DELETE RESTRICT
ON UPDATE RESTRICT)
ENGINE = InnoDB;
Rejeitar alteração
Exemplo de Código Gerado pelo
Workbench
-- --- Table `mydb`.`CURSO`
--
---CREATE TABLE IF NOT EXISTS `mydb`.`CURSO` ( `codCurso` INT NOT NULL ,
`nome` VARCHAR(45) NULL , PRIMARY KEY (`codCurso`) ) ENGINE = InnoDB;
-- --- Table `mydb`.`ALUNO`
--
---CREATE TABLE IF NOT EXISTS `mydb`.`ALUNO` ( `matricula` INT NOT NULL ,
`nome` VARCHAR(45) NULL , `curso` INT NULL ,
PRIMARY KEY (`matricula`) , INDEX `fk1` (`curso` ASC) ,
CONSTRAINT `fk1`
FOREIGN KEY (`curso` )
REFERENCES `mydb`.`CURSO` (`codCurso` ) ON DELETE CASCADE
ON UPDATE CASCADE) ENGINE = InnoDB;
Propagar alteração
Exemplo de Código Gerado pelo
Workbench
-- --- Table `mydb`.`CURSO`
--
---CREATE TABLE IF NOT EXISTS `mydb`.`CURSO` ( `codCurso` INT NOT NULL ,
`nome` VARCHAR(45) NULL , PRIMARY KEY (`codCurso`) ) ENGINE = InnoDB;
-- --- Table `mydb`.`ALUNO`
--
---CREATE TABLE IF NOT EXISTS `mydb`.`ALUNO` ( `matricula` INT NOT NULL ,
`nome` VARCHAR(45) NULL , `curso` INT NULL ,
PRIMARY KEY (`matricula`) , INDEX `fk1` (`curso` ASC) ,
CONSTRAINT `fk1`
FOREIGN KEY (`curso` )
REFERENCES `mydb`.`CURSO` (`codCurso` ) ON DELETE SET NULL
ON UPDATE SET NULL) ENGINE = InnoDB;
Exemplo de Código Gerado pelo
Workbench
-- --- Table `mydb`.`CURSO`
--
---CREATE TABLE IF NOT EXISTS `mydb`.`CURSO` ( `codCurso` INT NOT NULL ,
`nome` VARCHAR(45) NULL , PRIMARY KEY (`codCurso`) ) ENGINE = InnoDB;
-- --- Table `mydb`.`ALUNO`
--
---CREATE TABLE IF NOT EXISTS `mydb`.`ALUNO` ( `matricula` INT NOT NULL ,
`nome` VARCHAR(45) NULL , `curso` INT NULL ,
PRIMARY KEY (`matricula`) , INDEX `fk1` (`curso` ASC) , CONSTRAINT `fk1`
FOREIGN KEY (`curso` )
REFERENCES `mydb`.`CURSO` (`codCurso` ) ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Integridade Semântica
•
Regras de negócio da aplicação
•
Controle de valores válidos para os dados
– estados dos dados condizentes com os
requisitos da aplicação
– transições de estados corretas
•
Este tipo de restrição é definida
explicitamente
– O usuário deve incluir dentro de cada
transação de alteração o código
Restrições de Integridade Explícitas
• Uma única restrição de integridade pode ficar
espalhada dentro de diversas transações. Exemplo:
– Integridade referencial entre empregado e
departamento:
• Ao incluir um empregado, verificar se o departamento existe. • Ao excluir um departamento, verificar se o mesmo está vazio. • Ao alterar o departamento de um empregado, garantir que o
mesmo existe.
• Conseqüência:
– Quando restrições de integridade mudam, todos
Restrições de Integridade Explicitas
•
Tipos
– Cláusula CHECK
Cláusula
CHECK
•
Especificação declarativa de uma
expressão booleana que deve ser
verdadeira para todas linhas de uma
tabela (valores de uma coluna)
Exemplo
•
Ex.: O que a restrição a seguir representa?
•
Resposta:
– somente o Bar do João pode vender cervejas
por mais de R$2,00 CREATE TABLE Vendas ( bar CHAR(20);
cerveja CHAR(20); preço REAL;
Assertivas
•
Especificação declarativa de uma
expressão booleana que deve ser
verdadeira para toda a base de dados
(pode envolver várias tabelas)
• Implementação em SGBD é restrita (problema de
Exemplo
•
Exemplo:
– “ O Salario do empregado não pode ser maior
do que o do seu gerente.”
Create Assertion Restrição_de _salario Check ( not exists
(Select *
From EMP E, EMP M, DEPTO D
Where E.Salario > M.Salario AND
Banco de Dados Ativos
• Utilizam Regras E-C-A ( Evento, Condição e Ação ).
As Regras são da Forma :
– On<Evento>
– If <condição>
– Then <ação>
• Eventos -É uma expressão que especifica operação de
atualização que causa o disparo de uma regra .
• Condições -É uma consulta que contém um predicado
que deve ser testado para executar a ação corretiva.
• Ações -É uma seqüência de operações que deve ser
Banco de Dados Ativos
•
A maioria dos SGBDs de ponta do mercado
implementa regras E-C-A através dos
TRIGGERS.
•
Os Triggers podem ser usados para
manutenção de RI complexas.
•
SQL-2 não previu sua pradonização
CREATE TRIGGER < nome-trigger > ON <nome-tabela>
Triggers
•
Procedimento executado automaticamente
na atualização de uma tabela
•
Pode ser usado para:
– Atualizações em cascata
– Verificação de restrições de integridade que
Opções de Trigger
• Eventos possíveis incluem
– INSERT ON table – DELETE ON table
– UPDATE [OF column] ON table – INSTEAD OF
• Trigger pode ser ativado por
– FOR EACH ROW
• Ação é executada para cada linha modificada
– FOR EACH STATEMENT
• Ação é executada uma vez somente para todas linhas
modificadas pela operação
• Ação de modificação pode ser executada
Variáveis usadas em Trigger
•
OLD
– A linha modificada antes da ocorrência do evento.
•
NEW
– A linha modificada após da ocorrência do evento.
•
OLD_TABLE
– Uma tabela virtual que contém todas linhas
modificadas no estado de antes da ocorrência do evento
•
NEW_TABLE
– Uma tabela virtual que contém todas linhas
Trigger – detalhes de
implementação
•
Chamada recursiva
– Ação de um trigger pode disparar outro – Pode entrar em um laço infinito
•
Interação com o teste de RI pelo SGBD
– Quando testar se um trigger viola uma
restrição:
• Após a execução de um BEFORE trigger.
– O trigger pode consertar a violação
• Antes de um AFTER trigger
Trigger: exemplo
•
Como os Triggers diferem dos CHECKS e
Assertions??
CREATE TRIGGER Verifica_notas ON Notas FOR INSERT
AS
IF Nota < 5.0
Nome Curso Nota
Ana Maia 200 7.0
Ana Maia 200 4.0
Notas
INSERTED
Ana Maia 200 4.0
CREATE TRIGGER Verifica_notas ON Notas FOR INSERT
AS
IF Nota < 5.0
Manutenção de RI com Triggers
•
Passo 1:
– Determina as operações de atualização que
podem violar a restrição (operações relevantes)
•
Passo 2:
– Determina a ação corretiva para cada
operação relevante .
•
Passo 3:
– Cria um trigger (regra E_C_A) para cada uma
Manutenção de Restrição de
Integridade com TRIGGERS
•
Suponha os esquemas de relação:
– EMPRÉSTIMO(ISBN, #copia, #título,
data-dev)
– CÓPIA(ISBN, #copia, #título, emprestado?)
•
Suponha a RI:
– O valor do atributo emprestado? é “sim” se o livro está emprestado, caso contrario é “não”.
•
Que operações podem violar a restrição?
– Inserção em EMPRÉSTIMO
– Remoção em EMPRÉSTIMO
Trigger para Inserção em EMPRESTIMO
ISBN #copia #titulo #membr
o Data_dev
1 2 1001 1001 12/02/20
10
4 2 1004 1002 12/02/20
10 EMPRESTIMO
INSERTED
4 1 1004 1001 12/02/20
10
CREATE TRIGGER Inserção-em-empréstimo ON Empréstimo
FOR INSERT AS
UPDATE copia
SET emprestado?= ´sim´ FROM copia, inserted
WHERE copia.isbn= inserted.isbn
Trigger para Remoção em EMPRESTIMO
ISBN #copia #titulo #membr
o Data_dev
1 2 1001 1001 12/02/20
10
4 2 1004 1002 12/02/20
10 EMPRESTIMO
DELETED
4 1 1004 1001 12/02/20
10
CREATE TRIGGER Remoção-em-empréstimo ON Empréstimo
FOR INSERT AS
UPDATE copia
SET emprestado?= ´não´ FROM copia, deleted
WHERE copia.isbn= deleted.isbn
Stored Procedures
•
São comandos SQL precompilados e
armazenados no Servidor.
•
Podem acessar e modificar os dados.
•
São chamados pela aplicação
Uso de Stored Procedures na
Manutenção de RI
• Procedimento Armazenado é uma coleção de comandos
compilados que é armazena no banco de dados.
• O projetista de aplicação pode usar procedimentos
armazenados para fazer a manutenção de restrições de integridade.
– Exemplo: EMP(enum, depto, salario) e
DEPTO(dnum, gerente).
“o salário de um empregado deve ser menor do que o salário do seu gerente”
Procedimentos armazenados:
PA1: Inserção de um novo empregado
PA2: Modificar o salário de um empregado
PA3: Modificar o gerente de um departamento
Stored Procedures
•
Vantagens:
– Mecanismo de segurança (evita manipulação
inadequada dos dados)
– Aumenta performance e consistência para
tarefas repetitivas
– Aceitam parâmetros
– Mudanças das regras de negócio acarretam