Regras de Integridade

Bárbara A. G. P. Yamada

Banco de Dados

Regras de Integridade
• Fornecem a garantia de que alterações realizadas por usuários autorizados não ocasionem a perda da consistência dos dados [Korth 99] • Protegem o BD de danos acidentais

Banco de Dados

Regras de Integridade
• Regras de Integridade para o Modelo E-R
– Declaração de chaves
• O conjunto de inserções e atualizações validas é restrito àquelas que não criem duas entidades com o mesmo valor de chave candidata.

– Relacionamentos
• O conjunto de relacionamentos válidos um para um ou um para muitos restringe o conjunto de relacionamentos válidos entre os diversos conjuntos de entidades.
Banco de Dados

Regras de Integridade
• Normalmente, as regras de integridade são limitadas às que podem ser verificadas com o mínimo tempo de processamento

Banco de Dados

Regras de Integridade
• Restrições de Domínio
– São as mais elementares formas de restrições de integridade – Facilmente verificadas pelo sistema sempre que um novo item de dados é incorporado ao BD – Diversos atributos podem possuir um mesmo domínio

Banco de Dados

Regras de Integridade
• Exemplo de Restrições de Domínio
–Cliente_nome e Empregado_nome → domínio: conj. de todos os nomes de pessoas –Saldo e Agencia_nome → domínios distintos –Cliente_nome e Agencia_nome:
→ domínio iguais no nível de implementação → domínios distintos no nível conceitual
Banco de Dados

Regras de Integridade
• Restrições de Domínio
– Permitem a verificação dos valores inseridos no BD – Testam as consultas de modo a garantir que as comparações realizadas tenham sentido

Banco de Dados

Regras de Integridade
• Restrições de Domínio
– Muitos sistemas permitem apenas um pequeno número de domínios de tipos – Os SBDOO, oferecem um conjunto rico de tipos de domínios que podem ser facilmente ampliados

Banco de Dados

Regras de Integridade
• Restrições de Domínio
– Exemplo 1:
create domain turno_trabalho numeric(5,2) constraint valor_teste_turno check(value >= 4,00)

– A cláusula check permite determinar um predicado que deva ser satisfeito por qualquer valor designado a uma variável cujo tipo seja o domínio – A cláusula constraint é opcional e é usada para dar nome à uma restrição – O nome é usado para indicar quais restrições foram violadas em determinada atualização
Banco de Dados

Regras de Integridade
• Restrições de Domínio
• Exemplo 2: cláusula check também pode ser usada para restringir os valores nulos em um domínio
create domain conta_numero char(10) constraint teste_nulo_conta_numero check (value not null)

• Exemplo 3: o domínio pode ser restrito a um conjunto de valores por meio do uso da cláusula in
create domain conta_tipo char(10) constraint teste_conta_tipo check (value in (“Corrente”, “Poupança”))
Banco de Dados

Regras de Integridade
• Integridade Referencial
• Fornece a garantia de que um valor de um atributo em uma relação também apareça em uma outra relação • Tupla pendente → é a tupla de uma relação que não pode ser combinada com uma tupla de uma outra relação • Tuplas pendentes podem ou não ser aceitáveis
Banco de Dados

Regras de Integridade
•Integridade Referencial - Exemplo 1 de Tupla Pendente
Agencia_nome CTA Monteiro Lobato Monteiro Lobato Centro Justiça Federal Centro CTA Caçapava Satélite Conta_numer o A-101 A-215 A-102 A-305 A-201 A-222 A-217 A-306 A-321 A relação conta Saldo 500 700 400 350 900 700 750 500 1000 Agencia_nome Caçapava Central Centro Cta Independência Justiça Federal Monte Castelo Monteiro Lobato Silva Barros Agencia_cidade Caçapava Guaratinguetá Mairiporã São José dos Campos Guaratinguetá São José dos Campos Taubaté Taubaté Guaratinguetá A relação agencia Fundos 16.000.000 8.300.000 15.000.000 24.000.000 47.000.000 52.000.000 4.000.000 9.000.000 68.000.000

• •

A relação conta faz referência a uma conta de uma agência inexistente A regras de integridade devem proibir tuplas pendentes deste tipo

Banco de Dados

Regras de Integridade
•Integridade Referencial - Exemplo 2 de Tupla Pendente •Nem todos os tipos de tuplas pendentes são indesejáveis
Agencia_nome CTA Monteiro Lobato Monteiro Lobato Centro Justiça Federal Centro CTA Caçapava Conta_numer o A-101 A-215 A-102 A-305 A-201 A-222 A-217 A-306 Saldo 500 700 400 350 900 700 750 500 Agencia_nome Caçapava Central Centro Cta Independência Justiça Federal Monte Castelo Monteiro Lobato A relação conta Banco de Dados Silva Barros Satélite Agencia_cidade Caçapava Guaratinguetá Mairiporã São José dos Campos Guaratinguetá São José dos Campos Taubaté Taubaté Guaratinguetá São José dos Campos A relação agencia Fundos 16.000.000 8.300.000 15.000.000 24.000.000 47.000.000 52.000.000 4.000.000 9.000.000 68.000.000 33.000.000

Regras de Integridade
• Integridade Referencial - Tupla Pendente
– A diferença entre esses dois exemplos tem origem em dois fatos:
• O atributo agencia_nome do Esquema_conta é uma chave estrangeira (foreign key) cuja referência é a chave primária do Esquema_agencia
» Chave estrangeira: é um conjunto de atributos em um esquema de relação que constitui uma chave primária para outro esquema

• O atributo agencia_nome do Esquema_agencia não é uma chave estrangeira • Assim, a diferença entre esses dois exemplos é a existência de uma chave estrangeira Banco de Dados

Regras de Integridade
• Integridade Referencial no Modelo E-R
– Na redução de um Esquema E-R a tabelas, toda relação resultante de um conjunto de relacionamentos possui regras de integridade referencial – Entidades fracas também possuem integridade referencial
• Vimos que o esquema da relação para um conj. de entidades (CEs) fracas precisa incluir a chave primária do CEs do qual ele é dependente • Assim, o esquema da relação para cada CEs fracas inclui uma chave estrangeira que leva a uma regra de integridade referencial
Banco de Dados

Modificações no Banco de Dados
• As modificações (inserção, remoção e atualização) no BD podem causar violação das regras de integridade referencial

Banco de Dados

Regras de Integridade
• Integridade Referencial em SQL
– É possível definir chaves primárias e estrangeiras como parte do comando create table da SQL:
• A cláusula primary key do comando create table inclui a lista dos atributos que constituem a chave primária • A cláusula foreign key do comando create table inclui tanto a relação dos atributos que constituem a chave estrangeira quanto o nome da relação à qual a chave estrangeira faz referência

Banco de Dados

Regras de Integridade
•Integridade Referencial em SQL
•Exemplos de definição de dados em SQL:
create table cliente ( cliente_nome char(30) not null, cliente_rg char(12), cliente_rua char(30), create table agencia ( cliente_rua_numero smallint, agencia_nome char(20), primary key (cliente_nome)) agencia_cidade char(20), fundos integer, primary key (agencia_nome), check (fundos >= 0))

Banco de Dados

Regras de Integridade
•Integridade Referencial em SQL
•Exemplos de definição de dados em SQL (continuação):
create table conta ( conta_numero char(5) not null, agencia_nome char(20), saldo integer, primary key (conta_numero), foreign key (agencia_nome) references agencia on delete cascade on update cascade, check (saldo >= 0))

Banco de Dados

Regras de Integridade
•Integridade Referencial em SQL
•Exemplos de definição de dados em SQL (continuação):
create table depositante ( cliente_nome char(30) not null, conta_numero char(5) not null, primary key (cliente_nome, conta_numero), foreign key (cliente_nome) references cliente, foreign key (conta_numero) references conta)

Banco de Dados

Gatilhos (Triggers)
• É um comando que é executado pelo sistema automaticamente, em conseqüência de uma modificação no BD. • Duas exigências devem ser satisfeitas para a projeção de um mecanismo de gatilho:
1. Especificar as condições sob as quais o gatilho deve ser executado 2. Especificar as ações que serão tomadas quando um gatilho for disparado
Banco de Dados

Gatilhos (Triggers)
• São mecanismos úteis para avisos a usuários ou para executar automaticamente determinadas tarefas quando as condições para isso são criadas. • Exemplo:
– suponha que em vez de permitir saldos negativos em conta, o banco crie condições para que a conta corrente seja zerada e o saldo negativo seja transferido para uma conta empréstimo. – Essa conta empréstimo terá o mesmo número da conta corrente em questão.
Banco de Dados

Gatilhos (Triggers)
• Para esse exemplo, a condição para o disparo de um gatilho é uma atualização na relação conta que resulta em um valor negativo para saldo. • Suponha que João tenha feito um resgate em uma conta que gerou saldo negativo. • Suponha que t denote a tupla de conta com um valor negativo para saldo.
Banco de Dados

Gatilhos (Triggers)
• As ações a tomar são as seguintes:
– Inserir uma nova tupla s na relação empréstimo com:
• s[agencia_nome]=t[agencia_nome] • s[emprestimo_numero]=t[conta_numero] • s[total]=t[saldo]

– Inserir uma nova tupla na relação devedor com:
• u[cliente_nome]=“João” • u[emprestimo_numero]=t[conta_numero]

– Tornar t[saldo]=0
Banco de Dados

Gatilhos (Triggers)
• O padrão SQL-92 não dispõe de gatilhos • Alguns sistemas possuem seus próprios recursos de gatilho padronizados • Exemplificaremos como um gatilho para saldo negativo poderia ser escrito na versão original de SQL

Banco de Dados

Gatilhos (Triggers)
define trigger saldo_negativo on update of conta T
(if new T.saldo < 0 then (insert into emprestimo values (T.agencia_nome, T.conta_numero, - new T.saldo) insert into devedor (select cliente_nome, conta_numero from depositante where T.conta_numero=depositante.conta_numero) update conta S set S.saldo=0 where S.conta_numero=T.conta_numero)) A palavra-chave new indica que o valor de T.saldo após a atualização deverá ser usado; se ele for omitido, o valor existente antes da atualização será, então usado
Banco de Dados

Gatilhos (Triggers)
• Não são o modo recomendado de implementar regras de integridade [2] • São de difícil entendimento e mais difíceis para o sistema otimizar [2] • Outras finalidades:
– Alertar o usuário se houver alguma exceção
• Ex: emitir um aviso se a quantidade de uma peça cair abaixo do nível de perigo

– Medição de desempenho
• Ex: temporização de eventos específicos de BD
Banco de Dados

Regras de Integridade Dependência Funcional
• É uma generalização da noção de chave [Korth 99] • É uma restrição ao conjunto de relações válidas • Nenhum par de tuplas em qualquer relação válida deve ter o mesmo valor para um conjunto de atributos chave • Generaliza a noção de superchave
– É um conjunto de um ou mais atributos, que permite identificar univocamente uma entidade em um conjunto de entidades

• Permite-nos expressar restrições que as superchaves não expressam
Banco de Dados

Regras de Integridade Dependência Funcional Exemplo
• Esquema_info_emprestimo = (agencia_nome, emprestimo_numero, cliente_nome, total) • Conjunto de dependências funcionais a garantir para esse esquema de relação:
– emprestimo_numero → total – emprestimo_numero → agencia_nome

• Não se quer garantir a dependência funcional:
– emprestimo_numero → cliente_nome , já que um empréstimo pode ser contraído por mais de um cliente
Banco de Dados

Regras de Integridade – Dependência Funcional
• Dependências Funcionais do Esquema-empréstimo
• emprestimo_numero → total • emprestimo_numero → agencia_nome
Agencia_nome Monteiro Lobato Justiça Federal Independência Monteiro Lobato Central Silva Barros Independência L-17 L-23 L-15 L-14 L-93 L-11 L-16

Emprestimo_numero

Total 1000 2000 1500 1500 500 900 1300

A relação emprestimo Banco de Dados

Regras de Integridade Dependência Funcional
• Dependências Funcionais do Esquema-agência
– agencia_nome → agencia_cidade – agencia_nome → fundos
Caçapava Central Centro Cta Independência Justiça Federal Monte Castelo Monteiro Lobato Silva Barros Banco de Dados Agencia_nome Agencia_cidade Caçapava Guaratinguetá Mairiporã São José dos Campos Guaratinguetá São José dos Campos Taubaté Taubaté Guaratinguetá A relação agencia Fundos 16.000.000 8.300.000 15.000.000 24.000.000 47.000.000 52.000.000 4.000.000 9.000.000 68.000.000

Regras de Integridade Dependência Funcional
• Identifique regras de integridade para o BD relacional abaixo:
empregado (empregado_nome, empregado_rua, empregado_cidade) trabalha (empregado_nome, companhia_nome, salario) companhia (companhia_nome, companhia_cidade) gerente (empregado_nome, gerente_nome)

• Quais são as dependências funcionais que precisam ser realizadas para o exemplo do Sistema Bancário?
Banco de Dados

Referência Bibliográfica
• [1] Silberschatz, A.; Korth, H. F. e

Sudarshan, S. Sistema de Banco de Dados. São Paulo: MAKRON Books, 1999. • [2] Date, C. J. Introdução a Sistemas de Banco de Dados. Rio de Janeiro: Elsevier, 2003 – 4ª reimpressão.

Banco de Dados