Professional Documents
Culture Documents
Integridade
8.1 INTRODUO
O termo integridade se refere preciso ou correo de dados
no banco de dados. Como observamos no Captulo 3, um
determinado banco de dados pode estar sujeito a um nmero
muito grande de restries de integridade de complexidade (em
geral) arbitrria. Por exemplo, no caso de fornecedores e
peas, nmeros de fornecedores poderiam ter a forma Fnnnn
(onde nnnn quer dizer at quatro dgitos decimais) e ser
exclusivos; valores de status poderiam estar no intervalo de
1 a 100; fornecedores de Londres poderiam ter o status 20;
quantidades de remessas poderiam ser mltiplos de 50; peas
vermelhas poderiam estar armazenadas em Londres etc. Assim,
em geral, o SGBD precisa ser informado dessas restries e,
claro, precisa impor as restries de algum modo
(basicamente, rejeitando qualquer atualizao que possa
viol-las). Por exemplo (mais uma vez em Tutorial D):
CONSTRAINT FC3
ISEMPTY ( F WHERE STATUS < 1 OR STATUS > 100
(valores de status devem estar no intervalo de 1 a 100).
Observe o nome de restrio FC3 (restrio de fornecedores
trs); a restrio ser registrada no catlogo do sistema
sob esse nome e ele aparecer em qualquer mensagem de
diagnstico produzida pelo sistema em resposta a uma
tentativa de violar a restrio. A prpria restrio de
integridade especificada como uma expresso booleana que
no deve ter valor falso.
Nota: supomos a verso algbrica de Tutorial D como
definitiva; em conseqncia, a expresso booleana ser com
freqncia embora nem sempre da forma IS EMPTY (...),
significando que no existem dados no banco de dados que
violem a restrio (consulte o Captulo 6, Seo 6.9). Um
anlogo do clculo para o exemplo mostrado seria semelhante a
este:*
CONSTRAINT FC3
FORALL FX ( FX.STATUS 1 AND FX.STATUS 100
(onde, claro, FX uma varivel de intervalo que varia
sobre fornecedores).
A propsito, observamos que a expresso booleana em uma
restrio de clculo tem de ser uma FBF fechada (consulte o
Captulo 7, Seo 7.2) e com freqncia embora nem sempre
ela ter forma FORALL.x (...). Assim, note que o exemplo
especifica que todos os valores de status de fornecedores
devem estar no intervalo indicado. claro que, na prtica,
basta que o sistema verifique o fornecedor recm-inserido ou
atualizado, e no todos os fornecedores.
* Na prtica, muitas vezes parece mais fcil formular
restries (especialmente as complicadas) em termos de
clculo do que em termos de lgebra. Nosso foco sobre a
lgebra neste captulo feito por consistncia com nossas
discusses em outras partes do
livro, mas voc talvez prefira experimentar o exerccio de
converter alguns dos exemplos seguintes para a forma de
clculo. 219
(se existem peas, pelo menos uma delas deve ser vermelha).
A propsito, observe que esse exemplo difere de todos os
outros que vimos pois operaes DELETE tambm tm o potencial
de violar a restrio.
As restries de variveis de relaes so sempre verificadas
imediatamente (na verdade, como parte da execuo de qualquer
instruo que possa fazer com que elas sejam violadas).
Portanto, qualquer instruo que tente atribuir um valor a
uma dada varivel de relao que viole qualquer restrio
para essa varivel de relao efetivamente ser rejeitada.
8.5 RESTRIES DE BANCOS DE DADOS
Uma restrio de banco de dados uma restrio que relaciona
entre si duas ou mais variveis de relaes distintas. Aqui
esto alguns exemplos:
CONSTRAINT DBC1
ISEMPTY ( ( F JOIN FP )
WHERE STATUS < 20 AND QDE > QDE ( 500
(nenhum fornecedor com status menor que 20 pode fornecer
qualquer pea em uma quantidade maior que 500). Exerccio:
que operaes de atualizao o SGBD tem de monitorar para
impor a restrio
DBC1?
CONSTRAINT DBC2 FP { F# } F { F# } ;
(todo nmero de fornecedor na varivel de relao de remessa
tambm existe na varivel de relao de fornecedores;
lembre-se de que, no Captulo 6, usamos para indica
subconjunto de). Como o atributo F# na varivel de relao
F constitui uma chave candidata para fornecedores, essa
restrio basicamente a restrio referencial necessria de
remessas para fornecedores (isto , {F#} na varivel de
relao FP uma chave estrangeira para remessas que se
refere a fornecedores). Consulte a Seo 8.8 para ver uma
descrio adicional.
CONSTRAINT DBC3 FP { P# } P { P# } ;
(toda pea deve ter pelo menos uma remessa). Nota: claro
que tambm verdade que toda remessa deve ter exatamente uma
pea, em virtude do fato de que {P#} na varivel de relao P
uma chave candidata para peas e existe uma restrio
referencial de remessas para peas; no nos preocupamos em
mostrar aqui essa ltima restrio. De novo, consulte a Seo
8.8.
Esses dois ltimos exemplos servem para ilustrar o ponto de
que (em geral) a verificao de uma restrio de banco de
dados no pode ser feita de imediato, mas deve ser adiada at
o final da transao isto , at o instante de COMMIT
(consulte o Captulo 3 se precisar rever COMMIT). Vamos
supor, ao contrrio, que a verificao fosse imediata e que
no existisse nenhuma pea ou remessa no momento. Ento, a
insero de uma pea falhar porque ela viola a restrio
DBC3; da mesma forma, a insero de uma remessa falhar,
porque ela viola a restrio DBC2.*
Se uma restrio de banco de dados for violada no momento de
COMMIT, feito um ROLLBACK da transao.
8.6 A REGRA UREA
Nota: o material desta seo de importncia fundamental.
Porm, infelizmente, ele no tem aceitao muito ampla na
prtica, nem sequer bem compreendido, embora em princpio
seja bastante simples. Pedimos desculpas ao leitor.
*Na realidade, a referncia [3.3] prope uma forma mltipla
de atribuio que permitiria a insero de peas e remessas
em uma nica operao. Se tais atribuies fossem aceitas, as
restries de bancos de dados poderiam ser verificadas
imediatamente. 223
Procedimentos triggers
Como voc j deve ter percebido (e como de fato o comentrio
da subseo anterior a respeito de procedimentos definidos
pelo usurio deve ter sugerido), todo o conceito de aes
referenciais nos leva at alm das restries de integridade,
em direo aos procedimentos triggers. Um procedimento
trigger (normalmente chamado apenas trigger na literatura)
um procedimento invocado automaticamente na ocorrncia de
algum evento especificado ou de uma condio de trigger. A
condio de trigger em geral a execuo de alguma operao
de atualizao do banco de dados, mas poderia ser por exemplo
a ocorrncia de uma exceo especificada (em particular, a
violao de uma determinao restrio de integridade) ou a
passagem de um certo intervalo de tempo. As aes
referenciais CASCADE fornecem um exemplo simples de
procedimento trigger (especificado de forma declarativa, como
podemos observar!).
Em geral, procedimentos triggers se aplicam a uma variedade
muito mais ampla de problemas que apenas a questo da
integridade que o tpico deste captulo (uma boa lista
dessas aplicaes pode ser encontrada na referncia [8.1]).
Porm, eles representam sozinhos um assunto extenso, um
tpico que est alm do escopo deste captulo (consulte a
referncia [8.22] para ver uma discusso mais completa).
Gostaramos de dizer que, embora os procedimentos triggers
certamente sejam teis para muitos fins, eles normalmente no
so uma boa abordagem para o problema especfico de
integridade de bancos de dados, por razes bvias (abordagens
declarativas, se forem possveis, sempre sero preferveis).
Nota:
essas observaes no significam a sugesto de que as aes
referenciais so uma idia ruim. Embora seja verdade que as
aes referenciais provocam a chamada de certos
procedimentos, pelo menos elas so (como j observamos)
especificadas de forma declarativa.
8.9 RECURSOS DE SQL
O esquema de classificao de restries de integridade da
SQL muito diferente daqueles descritos nas Sees 8.1 a
8.5. Antes de tudo, ele classifica as restries em trs
amplas categorias, assim:
Restries de domnios
Restries de tabelas bsicas
Restries gerais (assertivas)
Entretanto, as restries de domnios no so iguais s
nossas restries de tipo, restries de tabelas bsicas
no so iguais s nossas restries de variveis de relaes,
e assertivas no so iguais s nossas restries de bancos
de dados. Na verdade:
A SQL no admite realmente restries de tipo de forma
alguma (porque, claro, ela na realidade no admite tipos de
forma alguma, exceto alguns tipos embutidos).
As restries de domnios de SQL so uma forma
generalizada indesejvel de nossas restries de atributos
(lembre-se de que os domnios no estilo de SQL no so na
realidade domnios de modo algum no sentido relaciona!).
As restries de tabelas bsicas e assertivas de SQL (que
so na verdade intercambiveis) dificilmente seriam
equivalentes ao conjunto de nossas restries de variveis de
relaes e de bancos de dados.
Observamos tambm que a SQL no fornece nenhum suporte para
restries de transio, nem admite no momento procedimentos
triggers, embora uma parte desse suporte esteja includa na
SQL3 (consulte o Apndice B).
Restries de domnios
Uma restrio de domnio no estilo de SQL uma restrio que
se aplica a cada coluna definida no domf234 nio em questo.
Aqui est um exemplo:
236
245
246
q. CONSTRAINT Q ISEMPTY (
F JOIN ( F WHERE CIDADE = Atenas ) ) WHERE
CIDADE Atenas AND CIDADE Londres AND CIDADE =Paris
AND ISEMPTY (
F JOIN ( F WHERE CIDADE Londres ) ) WHERE
CIDADE Londres AND CIDADE =Paris
Como um exerccio complementar, voc poderia tentar formular
as restries anteriores em um estilo de clculo no lugar do
estilo algbrico.
8.2 As duas primeiras so restries de tipo, claro. Das
outras, as restries C, D, R, F, G, J, K, M, P e Q so
restries de variveis de relaes; as restantes so
restries de bancos de dados.
8.3
a. Invocao do seletor CIDADE.
b. Invocao do seletor F#.
c. INSERT sobre P, UPDATE sobre PESO de pea.
d. INSERT sobre J, UPDATE sobre CIDADE de projeto.
e. INSERT sobre F, UPDATE sobre CIDADE de fornecedor.
f. INSERT ou DELETE sobre FPJ, UPDATE sobre QDE de remessa.
g. INSERT ou DELETE sobre F, UPDATE sobre STATUS de
fornecedor.
h. INSERT sobre J, DELETE sobre F, UPDATE sobre CIDADE de
fornecedor ou projeto.
i. INSERT sobre J, DELETE sobre FPJ, UPDATE sobre fornecedor
ou projeto.
j. INSERT ou DELETE sobre P, UPDATE sobre CIDADE de pea.
k. INSERT ou DELETE sobre F, UPDATE sobre STATUS de
fornecedor.
1. INSERT sobre F, DELETE sobre FPJ, UPDATE sobre CIDADE de
fornecedor ou sobre F# ou P# de remessa.
m. INSERT ou DELETE sobre P, UPDATE sobre PESO de pea.
n. INSERT ou DELETE sobre F ou FPJ, UPDATE sobre CIDADE de
fornecedor ou sobre F# ou P# de remessa.
o. INSERT ou DELETE sobre F ou FPJ, UPDATE sobre CIDADE de
fornecedor ou sobre F# ou P# ou QDE de remessa.
p. UPDATE sobre QDE de remessa.
q. UPDATE sobre CIDADE de fornecedor.
8.4 Um. As especificaes (5) e (3) devem ser vistas
melhor como restries de integridade. Como observamos na
referncia [3.31, uma conseqncia desejvel desse enfoque
que, se as variveis X eY so definidas como, digamos,
CHAR(5) e CHAR(3), respectivamente, ento as comparaes
entre X e Y so vlidas isto , elas no violam a exigncia
de que os comparandos devem ser do mesmo tipo.
8.5 Oferecemos a lista a seguir como um primeiro esboo do
conjunto de respostas (mas observe a nota ao final).
a. Qualquer restrio de A herda todas as chaves candidatas
de A.
b. Se a projeo incluir qualquer chave candidata K de A,
ento K ser uma chave candidata para a projeo. Do
contrrio, a nica chave candidata ser a combinao de todos
os atributos da projeo (em geral).
c. toda combinao K de uma chave candidata KA de A e uma
chave candidata KB de B uma chave candidata para o produto
A TIMES B.
d. A nica chave candidata para a unio A UNION B a
combinao de todos os atributos (em geral).
e. Fica como exerccio (a interseo no uma primitiva).
f. Toda chave candidata de A uma chave candidata para a
diferena A MINUS B.
247
ENOME
CARGO PRIMARY
CIDADE
KEY { CURSO#, OFER# }
KEY { CURSO# } REFERENCES CURSO ON DELETE CASCADE
ON UPDATE CASCADE ;
NOME,
CARGO
KEY { EMP# } ;
BASE RELATION
CURSO#,
OFER#,
EMP# }
OFER#, EMP# }
OFER# } REFERENCES OFERTA ON DELETE CASCADE
ON UPDATE CASCADE
EMP# } REFERENCES EMPREGADO ON DELETE CASCADE
ON UPDATE CASCADE ;
ON UPDATE CASCADE
REFERENCES EMPREGADO
ON DELETE CASCADE
ON UPDATE CASCADE ;
FOREIGN KEY {
EMP#
EMPREGADO
EMP#
252
253