SISTEMAS DE INFORMAÇÃO E BASES DE DADOS Restrições de Integridade Complexas António Manuel Silva Ferreira UNIVERSIDADE DE LISBOA FACULDADE DE CIÊNCIAS DEPARTAMENTO DE INFORMÁTICA asfe@di.fc.ul.pt
Sumário Definição de novos domínios e Upos Restrições de integridade com CHECKs complexos No âmbito de uma tabela Em asserções, independentemente das tabelas Restrições de integridade com triggers Evento, condição, e ação Bases de dados auvas Usos de triggers para além das restrições de integridade CHECKs vs. triggers 2
Restrições de Integridade Complexas Modelo relacional fornece restrições de integridade CURED Coluna, User- defined, Referencial, EnUdade (ou chave), e Domínio Ex. ID tem domínio INTEGER, com até 6 dígitos, e posiuvo Suporte para restrições complexas Domínio: definição de domínios para além dos fornecidos pelo SGBD Coluna: uso de SELECTs em CHECKs de tabelas User- defined: definição de asserções e triggers Asserções CHECKs independentes de tabelas Triggers Procedimentos invocados aquando de escritas em tabelas 3
Definição de Novos Domínios e Tipos Novos domínios podem ser definidos a parur de outros Ex. novo domínio com números inteiros entre 1 e 10 CREATE DOMAIN ratingval INTEGER DEFAULT 1 CHECK (VALUE >= 1 AND VALUE <= 10) Aplicação do novo domínio em coluna de tabela CREATE TABLE Sailors (..., rating ratingval,...) Se INSERT em Sailors omitir o valor de rating, este é preenchido com 1 Valores de rating podem ser comparados com os de colunas INTEGER Considerada uma limitação conceptual, pois domínios são diferentes Comando CREATE TYPE define um novo tipo de dados abstrato Necessita de métodos próprios para suportar comparações, adições, mesmo que baseado em domínios simples, como INTEGER 4
SELECTs em CHECKs de Tabelas 1 Definição de tabelas pode incluir cláusulas CHECK CREATE TABLE Sailors (sid INTEGER,..., CHECK (sid > 0)) Restrições mais complexas podem ter de consultar outras tabelas Ex. reservas de barcos, exceto para barcos com nome Interlake CREATE TABLE Reserves ( sid INTEGER, bid INTEGER, day DATE, PRIMARY KEY (sid, bid), FOREIGN KEY (sid) REFERENCES Sailors(sid), FOREIGN KEY (bid) REFERENCES Boats(bid), CONSTRAINT nointerlakereserves CHECK ('Interlake' <> (SELECT B.bname FROM Boats B WHERE (B.bid = Reserves.bid)))) Cada INSERT ou UPDATE em Sailors tem de sausfazer o CHECK 5
SELECTs em CHECKs de Tabelas 2 Outro exemplo de restrição complexa Número de marinheiros e de barcos não pode ultrapassar os 100 Ex. se já exisurem 50 barcos, só são permiudos 50 marinheiros CREATE TABLE Sailors ( sid INTEGER,... CONSTRAINT smallclub CHECK ( (SELECT COUNT(S.sid) FROM Sailors S) + (SELECT COUNT(B.bid) FROM Boats B) < 100)) Problemas Restrição aplica- se igualmente a Sailors e Boats Decisão de colocar restrição em Sailors é arbitrária Enquanto Sailors esuver vazia, condição não precisa de ser verificada Número de barcos pode crescer indefinidamente (e ficar superior a 100) 6
Asserções CHECKs que não estão associados a qualquer tabela Definidas ao mesmo nível das tabelas no esquema de dados Apropriadas para restrições que abrangem múliplas tabelas Exemplo para a restrição complexa da página anterior Número de marinheiros e barcos não pode ultrapassar os 100 CREATE ASSERTION smallclub CHECK ( (SELECT COUNT(S.sid) FROM Sailors S) + (SELECT COUNT(B.bid) FROM Boats B) < 100) Condição verificada para cada INSERT ou UPDATE em Sailors ou Boats Podem ser muito complexas Todas as tabelas do esquema podem fazer parte do CHECK Por razões de eficiência, maioria dos SGBDs não suporta asserções 7
Trigger Procedimento invocado aquando de escritas numa tabela Evento de escrita ativa condição que permite, ou não, execução de ação Evento: escrita na base de dados que faz auvar o trigger Tipos de escrita: qualquer combinação de INSERT, UPDATE, e DELETE Escritas podem ser numa tabela inteira ou em colunas específicas Opções de auvação do trigger Antes ou depois da escrita se concreuzar Uma só vez para um bloco inteiro de escritas ou para cada linha escrita Condição (opcional): verificada aquando da auvação do trigger Ação: código do procedimento executado se condição sausfeita Em Oracle, procedimento codificado na linguagem PL/SQL PL/SQL = Procedural Language/SQL, com forte integração com a SQL 8
Exemplo de Trigger CREATE TRIGGER verifica_aumento_vencimento BEFORE UPDATE OF vencimento ON empregado FOR EACH ROW WHEN (new.vencimento > old.vencimento) DECLARE vencimento_do_chefe NUMBER := NULL; BEGIN - - Supõe- se que só existe um chefe. SELECT vencimento INTO vencimento_do_chefe FROM empregado WHERE (categoria = chefe ); IF (:new.vencimento > vencimento_do_chefe) THEN RAISE_APPLICATION_ERROR(- 20001, Não pode ganhar mais que o chefe! ) END IF; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(- 20002, A empresa não tem chefe! ); WHEN OTHERS THEN RAISE; END; Evento que auva o trigger Condição após auvação (opcional) Ação do trigger (procedimento) Variável new guarda a linha que resultaria do UPDATE, e old refere a linha antes do UPDATE Exceções, se lançadas, cancelam o UPDATE 9
Bases de Dados AIvas e Usos de Triggers Base de dados auva Base de dados com triggers associados Triggers Upicamente definidos (ou autorizados) pelo DBA DBA = database administrator Razão: consequências do uso de triggers podem ser dixceis de entender Vários triggers podem ser auvados em simultâneo, por ordem arbitrária Ação de um trigger pode auvar outros triggers risco de recursividade! Usos {picos de triggers Restrições de integridade complexas Ex. com vários passos de pesquisa em tabelas Autorizações de acesso e auditoria de escritas em tabelas Ex. que uulizadores escreveram em certa tabela e a que horas Réplicas síncronas de tabelas 10
Trigger para Autorização Especial CREATE TRIGGER em_horário_trabalho BEFORE INSERT OR UPDATE OR DELETE ON empregado DECLARE data_atual DATE := SYSDATE; hora_atual NUMBER(2) := NULL; dia_semana CHAR(3) BEGIN := NULL; hora_atual := TO_CHAR(data_atual, HH24 ); dia_semana := TO_CHAR(data_atual, DY ); IF (hora_atual NOT BETWEEN 8 AND 24) THEN RAISE_APPLICATION_ERROR(- 20001, Fora de horas! ); ELSIF (dia_semana IN ( SAT, SUN )) THEN RAISE_APPLICATION_ERROR(- 20002, Fim de semana! ); END IF; EXCEPTION WHEN OTHERS THEN RAISE; END; Trigger impede tabela empregado de ser modificada fora do horário normal de trabalho Trigger pode lançar várias exceções que, não sendo tratadas, fazem com que SGBD cancele a operação de escrita sobre a tabela empregado 11
CHECKs vs. Triggers CHECKs DeclaraUvos e fáceis de entender (não requerem saber programar) Bom desempenho, pois SGBD é que decide como verificar condições Restrições de integridade verificadas em permanência Triggers Para quaisquer operações de escrita na base de dados Procedimentais, sendo necessário saber programar Desempenho depende da qualidade do programador Sempre que possível, devem ser usadas restrições de integridade declarauvas Restrições de integridade verificadas para escritas específicas em tabelas Necessário cuidado para cobrir todos os cenários possíveis de escrita de dados Maior gama de usos, para além das restrições de integridade Ex. autorizações de acesso, auditoria, replicação de dados, 12
Elementos de Estudo Raghu Ramakrishnan e Johannes Gerhke, Database Management Systems, McGraw- Hill, 3ª edição, 2003 Secções 5.7 a 5.9 Steven Feuerstein e Bill Pribyl, Oracle PL/SQL Programming, O Reilly, 6ª edição, 2014 Capítulo 19 13