Triggers
Triggers
Triggers
R2: CREATE TRIGGER TotalSal2 AFTER UPDATE OF Salario ON Empregado FOR EACH ROW WHEN (NEW.Ndep IS NOT NULL) UPDATE Departamento SET TotalSal=TotalSal+NEW.Salario-OLD.Salario WHERE Dnum=NEW.Ndep; R3: CREATE TRIGGER TotalSal3 AFTER UPDATE OF Ndep ON Empregado FOR EACH ROW BEGIN UPDATE Departamento SET TotalSal=TotalSal+NEW.Salario WHERE Dnum=NEW.Ndep; UPDATE Departamento SET TotalSal=TotalSal-OLD.Salario WHERE Dnum=OLD.Ndep; END;
42
43
Triggers (cont.)
especica que a regra vai ser disparada uma vez por cada linha (tuplo) afectada pelo evento-de-disparo.
CREATE TRIGGER nome_trigger (AFTER|BEFORE) trigger-eventos ON nome-tabela [FOR EACH ROW] [WHEN condic ao] trigger-acc ao; <-- PL/SQL trigger-evento = INSERT|DELETE|UPDATE [OF atributos]
40
um atributo derivado e manter o seu valor actualizado pode ser feito TotalSal e o do valor atrav es de um trigger. Os eventos que podem determinar uma alterac a desse atributo s ao: 1. Inserir (um ou mais) novos empregados
R1: CREATE TRIGGER TotalSal1 AFTER INSERT ON Empregado FOR EACH ROW WHEN (NEW.Ndep IS NOT NULL) UPDATE Departamento SET TotalSal=TotalSal+NEW.Salario WHERE Dnum=NEW.Ndep;
41
es Asserc o es gen Permitem vericar condic o ericas: qualquer express ao que pode aparecer a seguir a WHERE.
CREATE ASSERTION nome CHECK (condic ao) o a ` BDs que leve a condic o a tomar o valor FALSO ser o tem Qualquer alterac a a a rejeitada. A condic a (obviamente) de dar um valor booleano. Exemplos:
o total de todos os lmes de um dado est 1- A durac a udio n ao deve exceder 10000 minutos.
CREATE ASSERTION TotDurac ao CHECK (10000 >=ALL (SELECT SUM(Durac ao) FROM Filme GROUP BY Est udio);
2- O sal ario de um empregado n ao pode ser maior do que o sal ario do director do departamento onde o empregado trabalha.
CREATE ASSERTION TectoSalario CHECK (NOT EXISTS (SELECT * FROM Empregado E, Empregado S, Departamento D WHERE E.Salario>S.Salario AND E.Ndep=D.Dnum AND D.DirBI=S.EBI));
38
Baseiam-se em regras do tipo evento-condic a a o-acc o (ECA) es UPDATE, mas O evento que faz disparar o trigger. S ao normalmente operac o tamb em pode ser temporal. o deve ser executada. A condic a a o que determina se a acc A acc a o a tomar.
o pode ser executada antes, depois ou em vez do evento que a dispara. A acc a
Exemplo: Trigger para comparar o sal ario de um empregado com o do seu supervisor.
CREATE TRIGGER InformaSupervisor BEFORE INSERT OR UPDATE OF Salario, SuperBI ON Empregado FOR EACH ROW WHEN (NEW.Salario> (SELECT Salario FROM Empregado WHERE EBI=NEW.SuperBI)) Informa_Supervisor(New.SuperBI, New.EBI);
39
es (INSERT) e actualizac es (UPDATE) na tabela referenciante (que cont s ao proibidas inserc o o em a chave-externa) que violem a integridade referencial.
es (DELETE) e actualizac es (UPDATE) na tabela referenciada (externa) que violem as eliminac o o o indicada: a integridade referencial s ao tratadas de acordo com a acc a es a ` tabela referenciante. CASCADE propaga as eliminac o SET NULL coloca valores nulos nos atributos referenciantes. SET DEFAULT coloca valores nulos nos atributos referenciantes. es ou eliminac es. por omiss ao: pro be essas actualizac o o
Exemplo: CREATE TABLE Estudio( nome CHAR(30) PRIMARY KEY, morada VARCHAR(80), presidente CHAR(9) REFERENCES Presidente(PBI) ON DELETE SET NULL, ON UPDATE CASCADE);
36
es sobre atributos Restric o Os valores permitidos para os atributos podem ser restringidos
o envolve o atributo cujos valores se quer restringir, CHECK condic ao a condic a ` condic o de uma clausula WHERE. mas pode assemelhar-se a a
sexo CHAR(1) CHECK (sexo IN (F,M)) presidente CHAR(9) CHECK (presidente IN (SELECT PBI FROM Presidente))
es na chave Restric o o da CREATE TABLE garante-se que operac es ao denir-se uma chave na denic a o o ou actualizac o satisfazem os requisitos de unicidade da chave. de inserc a a
CREATE TABLE Filme( t tulo CHAR(30), ano CHAR(10), ... PRIMARY KEY (t tulo,ano));
pode-se proibir a exist encia de valores nulos para um dado atributo. Basta adicionar o do atributo na tabela. NOT NULL na denic a
CREATE TABLE Actor( nome CHAR(30) PRIMARY KEY, dNasc DATE NOT NULL, ... )
34
REFERENCES
tabela ( atributo )
Exemplo:
CREATE TABLE Participa( actor CHAR(30) REFERENCES Actor(nome), filme CHAR(50), ano CHAR(10), salario DECIMAL(9,2), FOREIGN KEY (filme,ano) REFERENCES Filme(t tulo,ano) );
35
Vis oes: exemplos Q32: Criar uma vis ao que contenha para cada departamento o nome, o n umero de empregados e o custo envolvido com sal arios nesse departamento.
CREATE VIEW DepStats (Dnome, Nemps, TotSalario) AS SELECT Dnome, COUNT(*), SUM(Salario) FROM Departamento, Empregado WHERE Dnum=Ndep <-- junc ao entre Departamento e Empregado GROUP BY Dnome;
o de tabelas diculta muito a Notar que o facto de uma vis ao incluir uma junc a o da vis o de actualizac o actualizac a ao pois seria d cil ver como fazer reectir a operac a a nas tabelas envolvidas.
32
s ao express oes ou comandos, escritos uma vez e guardados na BDs, que se espera sejam executados quando determinados eventos ocorrerem.
es associadas a relac es que s o SQL2 permite indicar restric o o ao testadas sempre oes nessas relac es: que h a modicac a o es na chave restric o es de integridade referencial restric o es de dom restric o nio es gen asserc o ericas
33
30
uma tabela virtual que pode n uma vis ao e ao existir sicamente em disco.
til para especicar uma tabela que agrupe informac o que precisamos de referu a o possa residir sicamente em enciar com frequ encia, pese embora a informac a outras tabelas.
uma vis ao est a sempre actualizada. Se modicarmos os tuplos nas tabelas de que es automaticamente (responsabilidade a vis ao depende, a vis ao v e essas alterac o do DBMS).
! " # $ & ' ( $ ) '
Para denir uma vis ao: Para remover uma vis ao:
c
0
1 2
3
31
normalmente usada para restringir ou eliminar grupos; equivale a ` clausula WHERE mas HAVING: e associado aoGROUP BY. Q29: Obter os n umeros das componentes de todas as componentes fornecidas por mais do que um fornecedor. SELECT Cnr FROM FC GROUP BY Cnr HAVING COUNT(*)>1
es de agregac o aos atributos da clausuNote-se que tamb em podemos associar func o a la HAVING.
29
es de agregac o Func o a Em muitos casos pretende-se que no resultado de uma quest ao aparec am contagens, m edias, valores m aximos ou m nimos de determinados atributos. es de agregac o aparecem normalmente na clausula SELECT e associadas a As func o a um atributo:
& 4 2 5 6 & 5 8 8 9 8 6 @ ! " # $ 7 7 7 7 %
Q24: Obter o n umero total de empregados do departamento 5. Q25: Obter o total de sal arios de todos empregados, o sal ario m aximo e m nimo, e a m edia dos sal arios. Q24: SELECT COUNT(*) FROM Empregado WHERE Ndep=5 Q25: SELECT SUM(Salario), MAX(Salario), MIN(Salario), AVG(Salario) FROM Empregado
26
27
o de atributos e tabelas de junc o Renomeac a a poss E vel renomear os atributos que aparecem no resultado da quest ao, fazer: SELECT atributo AS novo nome ... o: o SQL2 j o de tabelas seja feita de forma Tabelas de junc a a permite que a junc a explic ta. Exemplo, a quest ao Q23: Obter o nome e enderec o de todos os empregados que trabalham para o departamento Vendas.
SELECT Pnome, Unome, Enderec o FROM Empregado, Departamento WHERE Dnome=Vendas AND Dnum=Ndep; <-- junc ao implicita ou SELECT Pnome, Unome, Enderec o FROM (Empregado JOIN Departamento ON Ndep=Dnum) WHERE Dnome=Vendas; <-- junc ao explicita
es para a junc o: NATURAL JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN. Outras operac o a
25
22
Q19: Obter os nomes dos fornecedores que fornecem todas as componentes. ou obter os nomes dos fornecedores para os quais n ao existe uma componente que eles n ao fornec am. SELECT Fnome Res: F1 FROM F WHERE NOT EXISTS (SELECT * FROM C WHERE NOT EXISTS (SELECT * FROM FC WHERE Fnr=Fnum AND Cnr=Cnum));
23
s IN R verdadeiro sse s for igual a um dos valores de R. s NOT IN R verdadeiro sse s n ao for igual a qualquer valor de R. uma sub-consulta ou uma lista de a tomos. Re
Os operadores EXISTS, ALL e ANY podem ser negados colocando-se NOT antes. NOT EXISTS R verdadeiro sse R for vazio.
20
es (projecto,horas) que Q15: Obter o BI todos os empregados que trabalham nos mesmas combinac o 1234567. o empregado Joao Regras cujo EBI e SELECT EBI FROM TrabalhaEm WHERE (Pnum,Horas) IN (SELECT Pnum, Horas FROM TrabalhaEm WHERE EBI=1234567);
21
o do resultado Ordenac a
o ORDER BY: ordenac a Q11: Listar os nomes dos alunos inscritos em BD por ordem alfab etica.
SELECT nome FROM Alunos, Inscric oes WHERE codDisc=BD AND codigo=codAluno ORDER BY nome o e por defeito por ordem crescente. Podemos indicar exactamente o que se pretende: A ordenac a ORDER BY [ASC|DESC] atributo
18
Quest oes encadeadas necess o obtida Por vezes e ario comparar um atributo com os valores de uma relac a por uma quest ao encadeada.
A quest ao Q12: Listar o Director do Departamento Vendas pode ser formulada em SQL como: SELECT E.Pnome, E.Unome FROM Empregado AS E, Departamento AS D WHERE D.nome=Vendas AND E.EBI=D.dirEBI; ou SELECT nome FROM Empregado WHERE EBI = (SELECT DirEBI FROM Departamento WHERE nome=Vendas); um valor apenas. Note-se que o resultado da sub-consulta e
19
Q8: Obter os n umeros das componentes que ou pesam mais de 18 grs ou s ao fornecidas pelo fornecedor F2 (ou ambos).
(SELECT C.Cnum FROM C WHERE C.Peso > 18) UNION (SELECT FC.Cnum FROM FC WHERE FC.Fnum=F2)
16
SELECT Pnome, Unome, 1.1*Salario FROM Empregado AS E, Projecto AS P, TrabalhaEm AS T WHERE Pnum=5 AND P.Pnum=T.Pnum AND E.EBI=T.EBI operador BETWEEN: Q10: Obter todos os empregados do departamento 7 cujo salario est a entre 100c e 150c.
SELECT * FROM Empregado WHERE Ndep=7 AND (Salario BETWEEN 100 AND 150)
17
UPDATE o. Permite modicar os valores dos atributos de um ou mais tuplos de uma relac a
UPDATE relac ao SET novas valores WHERE condic ao;
o de WHERE selecciona os tuplos a modicar. Em SET indicam-se os atribA condic a utos que ser ao modicados e os respectivos novos valores. os seus novos valores o s relac a ao removidos mas a tabela mantem-se, embora vazia. Exemplos:
M4: UPDATE Disciplinas SET nome=Redes e Sistemas Distribu dos WHERE nome IN (SELECT nome FROM Disciplinas WHERE nome LIKE Compl%Operacao AND anoLect > 96/97; M5: UPDATE Empregado SET salario= salario*1.05 WHERE Ndep= 5;
14
F Fnum F1 F2 F3 F4 F5
Cat 20 10 30 20 30
C Cnum C1 C2 C3 C4 C5 C6
Peso 12 17 17 14 12 19
15
,
E
,
C
) VALUES ( ,
G E D P I
, );
G F V W T
no atributo
, para
Q
quando n ao se indica os atributos da tabela, sup oe-se que s ao todos e pela ordem o. denida quando da sua criac a
necess se adicionarmos um tuplo com valores para apenas alguns dos atributos, e ario indicar quais, ou respeitar a ordem dos atributos na tabela. Os restantes cam com valores por defeito ou Null.
B B
poss e vel adicionar tuplos em que os valores s ao obtidos como resultado de uma quest ao: INSERT INTO R( , , ) SELECT , , FROM ...;
C E E E C C E E E C D F D F
12
o WHERE for omitida, todos os tuplos da relac o s Se a condic a a ao removidos mas a tabela mantem-se, embora vazia. Exemplos:
M2: DELETE FROM Inscric oes WHERE anoLect < 97/98; es; M3: DELETE FROM Inscric o
o a seguir ao WHERE pode ser uma quest a condic a ao complexa (veremos exemplos mais adiante).
B
o pode propagar-se a outras tabelas para preservar a integridade refer esta operac a encial.
13
10
o da BDs Comandos SQL para actualizac a Iremos ver formas mais complexas e potentes de interrogar uma BDs, mas primeiro vamos ver os comandos que permitem modicar o estado da BDs. S ao tr es:
11
Ambiguidades os nomes de atributos e Sin onimos es envolvidas na quest Se as relac o ao tiverem nomes de atributos em comum, pode o amb o e qualicar os atributos com o nome vericar-se uma situac a gua. A soluc a o a que pertencem. da relac a Q4: Obter os nomes dos alunos e das disciplinas a que est ao inscritos.
SELECT A.nome, D.nome <-- qualif. dos atributos FROM Alunos AS A, Disciplinas AS D, Inscric oes <-- sin onimos ou aliases WHERE A.codigo=codAlunos AND D.codigo=codDisc
ltimo nome, e o 1o e u ltimo do seu superQ5: Listar para cada empregado o 1o. e u visor imediato.
SELECT E.Pnome, E.Unome, S.Pnome, S.Unome FROM Empregado AS E, Empregado AS S WHERE E.superBI=S.EBI;
o de strings SELECT * e Comparac a O simbolo * pode substituir a lista de atributos a seleccionar, signicando que se o sem os mencionar explicitapretende seleccionar todos os atributos de uma relac a mente. da forma YYYY0307XXX, em Q6: Obter os dados dos alunos de CC. O c odigo de CC e o ano e XXX e o n que YYYY e umero de ordem.
SELECT * FROM Alunos WHERE c odigo LIKE ____0307%;
pode ser um qualquer caracter. % pode ser um n umero arbitr ario de caracteres.
Exemplos: Q1: Obter a lista das disciplinas do 3o Ano. SELECT nome FROM Disciplinas WHERE anoCurso=3; na Algebra Relacional:
g h
l m
Exemplos quest oes simples de SQL. Q2: Obter o nome de todos os alunos inscritos na disciplina de EDA bem 99/00.
SELECT nome FFROM Alunos, Inscric oes WHERE codDisc=EDA AND anoLect=99/00 AND codigo=codAluno; lgebra relacional: na a
Y ) # e f u q q q
o de selecc <--- condic a ao o de selecc <--- condic a ao <--- cond. de junc ao entre 2 relac oes
$ ' ! ' $
` a
b c
i a
s t
` a
i w
` a
es, pelo que todos os Omiss ao do WHERE signica que n ao impomos condic o o indicada em FROM s tuplos da relac a ao seleccionados. Q3: Seleccionar todos os c odigos e nomes de disciplinas.
SELECT codigo, nome FROM Disciplinas
7
es e vis Com CASCADE s ao tamb em removidas todas as restric o oes que referenciam a tabela. removida se n es sobre a Com RESTRICT, a tabela s oe ao existirem restric o tabela.
ALTER TABLE nome tabela COM atributo; modica uma o. DROP (cascade ou restrict), remove um atributo ou restric a
o. modica o atributo ou restric a Um exemplo: ALTER TABLE Inscric oes ADD exame INT;
o de novos dom SQL: Denic a nios Em SQL podemos indicar um tipo de dados default para os atributos, mas podemos o dos atributos. tamb em declarar um novo dom nio de dados e us a-lo na denic a
CREATE DOMAIN novo tipo AS tipo base;
Exemplo: CREATE DOMAIN CodTipo AS CHAR(7); o de tabelas podiam agora ser: Os comandos de criac a
CREATE TABLE Inscric oes ( codAluno CodTipo NOT NULL, codDisc CodTipo NOT NULL, anoLect CHAR(5), PRIMARY KEY (codAluno,codDisc), FOREIGN KEY (codAluno) REFERENCES Alunos(codigo), FOREIGN KEY (codDisc) REFERENCES Disciplinas(codigo) );
SQL: CREATE TABLE o, indicando-se o seu nome, atributos (nome e tipo de permite criar uma nova relac a es (chave e restric es de integridade). dados associados) e restric o o
CREATE TABLE nome_tabela ( atributo_1 tipoDados_1 [restric ao_atributo_1], atributo_N tipoDados_N [restric ao_atributo_N], [ restric ao_tabela_1 {, restric ao_tabela_i } ] ); ... ,
em que tipoDados_i: num erico: INT, SHORTINT, REAL, DOUBLE PRECISION, DECIMAL(n,d) (n digitos decimais com d digitos depois do ponto decimal). strings: CHAR(n) comprimento xo, VARCHAR(n) comprimento vari avel at e n caracteres, BIT(n) string de n bits, VARBIT(n) string at e n bits. Data: DATE YYYY-MM-DD (10 caracteres) Hora: TIME HH:MM:SS (8 caracteres)
2
NULL, NULL,
SQL Structured Query Language usada por todos os sistemas Linguagem para denir, questionar e actualizar a BD. E comerciais de BDs relacionais.
SQL = DDL (data denition lang.) + DML (data manipulation lang.), permite:
criar as tabelas