Triggers e mais... Instituto Militar de Engenharia IME 1o. Semestre/2005 Triggers Propósito mais amplo que restrições Restrições onde se explicita o evento Regras event-condition-action (ECA) Eventos: insert, update e delete Ações podem ocorrer antes, depois ou ao invés do evento Evento não é suficiente para a Ação: A condição, se definida, deve ser respeitada Referência aos valores antigos e novos Para resgate de valores antigos Ou para verificação dos valores novos 1
Triggers CREATE TRIGGER irredutibilidade Evento AFTER UPDATE OF salario ON Empregado REFERENCING OLD AS tuplaantes, NEW AS tupladepois Condição WHEN (tuplaantes.salario > tupladepois.salario) UPDATE Empregado Ação SET salario = tuplaantes.salario WHERE matricula = tuplaantes.matricula FOR EACH ROW Triggers CREATE TRIGGER irredutibilidade AFTER UPDATE OF salario ON Empregado REFERENCING OLD AS tuplaantes, NEW AS tupladepois WHEN (tuplaantes.salario > tupladepois.salario) UPDATE Empregado SET salario = tuplaantes.salario WHERE matricula = tuplaantes.matricula FOR EACH ROW... UPDATE [OF atributo] - a clausula OF é opcional Um trigger pode disparar várias ações OLD AS/NEW AS são desabilitadas para INSERÇÃO/REMOÇÃO, respectivam. FOR EACH ROW define um trigger-de-tupla, e força o trigger a acontecer para cada tupla afetada pelo evento Se omitido, o trigger é chamado trigger-de comando, e acontece uma única vez o comando que disparou o trigger 2
Triggers Regra: a média salarial não pode ser < 20000. Insert, updates ou deletes podem violar esta regra CREATE TRIGGER mantendomediasalarial INSTEAD OF UPDATE OF salario ON Empregado REFERENCING OLD_TABLE AS tabantes, NEW_TABLE AS tabdepois WHEN (20000 >= (SELECT AVG(salario) FROM ( (Empregado EXCEPT tabantes) UNION tabdepois)) DELETE FROM Empregado WHERE matricula IN (SELECT matricula FROM tabantes); INSERT INTO Empregado (SELECT * FROM tabdepois); Triggers no PostgreSQL CREATE FUNCTION emp_stamp() RETURNS trigger AS ' BEGIN -- Check that empname and salary are given IF NEW.empname IS NULL THEN RAISE EXCEPTION ''empname cannot be null''; END IF; IF NEW.salary IS NULL THEN RAISE EXCEPTION ''% cannot have null salary'', NEW.empname; END IF; -- Who works for us when she must pay for it? IF NEW.salary < 0 THEN RAISE EXCEPTION ''% cannot have a negative salary'', NEW.empname; END IF; -- Remember who changed the payroll when NEW.last_date := ''now''; NEW.last_user := current_user; RETURN NEW; END; ' LANGUAGE plpgsql; CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp FOR EACH ROW EXECUTE 2005.1PROCEDURE emp_stamp(); MCRC - IME/RJ 3
Triggers no Oracle 10g CREATE OR REPLACE TRIGGER VERIFICA_SESSAO AFTER INSERT OR UPDATE OF qtd_publico_sessao ON SESSOES FOR EACH ROW BEGIN IF (:new.qtd_publico_sessao < 0) THEN RAISE_APPLICATION_ERROR(-20000, 'Quantidade de público registrado é inválido'); END IF; END; CREATE OR REPLACE TRIGGER ATUALIZA_ATUACAO BEFORE DELETE ON FILMES REFERENCING OLD AS OLDROW FOR EACH ROW BEGIN DELETE FROM ATUACAO WHERE COD_FILME = :OLDROW.COD_FILME; END 2005.1 ; MCRC - IME/RJ Linguagens Necessidade de desenvolvimento aplicações de BD PORTÁVEIS Surgiram opções de programação com SQL SQL embutida ODBC PLSQL 4
SQL Embutida Embute comandos SQL em linguagens hospedeiras: Cobol, Fortran, C, Pascal, etc. Pré-compilador Substituindo por chamadas a rotinas de acesso ao SGBD escritas na linguagem hospedeira. Fornecedores de SGBD Pré-compilador e Bib sql para cada ling hospedeira Bib. SQL BD Linguagem hospedeira +SQL embutido Pré-compilador ling. Hosp + chamadas a funções Compilador Ling.Hosp. Programa SGBD SQL Embutida Uso de cursores para percorrer o resultado O comando SQL só é executado qdo o primeiro open é dado Para manipular os dados de cada tupla resultante usa-se as variáveis mat e nom que no comando SQL aparecem precedidas de : EXEC SQL BEGIN DECLARE SECTION char mat[10], nom[50]; END EXEC END DECLARE SECTION EXEC SQL Declare c cursor for Select matricula, nome From empregado Where salario > 1000 END EXEC... EXEC SQL Open c END EXEC... EXEC SQL Fetch c into :mat, :nom END EXEC 5
SQL Dinâmico Comandos SQL não são conhecidos no momento da compilação Ex.: Interfaces de consulta livre Monta-se uma string com o comando SQL, transforma-se em um comando executável e executa-se EXEC SQL PREPARE v FROM stringvar EXEC SQL EXECUTE v Em menos passos EXEC SQL EXECUTE IMMEDIATE stringvar ODBC Open Database Connectivity API Maioria dos SGBDs oferecem drivers ODBC Camada a mais ODBC Ingres Driver SGBD Postgres Aplicação Protocolo Proprietário API ODBC ODBC Oracle Driver SGBD Oracle BD1 BD2 6
ODBC exemplo file driv='driver={microsoft Access Driver (*.mdb)};... conn = odbc.driverconnect(driv) c = conn.cursor() c.execute ("select * from empregado where nome = 'fred'") #get column names cols= [ i[0] for i in c.description ] print '\n\ncols=',cols rows = c.fetchall() print '\n\n' cnt = 0 for r in rows: cnt += 1 print cnt,' ',r if cnt > 10: break PL SQL Cada SGBD tem a sua Processamentos feitos pelo SGBD manipulação de grandes massas de dados Reuso de funções e procedimentos create procedure calculagrat(cpf in varchar2, grat out real, sorf in out varchar2) as begin declare nasc, contrato date; sal int; cursor c is select dtcontrato, dtnasc, salario from empregado where numcpf = cpf; begin open c; fetch c into contrato, nasc, sal; if meucursor%found then null else sorf = F end if; close cursor... /* calcula vendas do cpf... */ end; end; 7
SGBD via Web CGI Common Gateway Interface podem ser implementados em uma variedade de linguagens: C, C++, PERL, system shell scripts Podem usar Embedded SQL, ODBC, ou outros ESQL para HTML Alguns SGBD s oferecem CGI s genericos que tratam ESQL em HTML Problemas quanto a segurança SGBD via Web D HTTP CLIENT H A B C API CGI F E SGBD G HTTP SERVER 8
SGBD via Web Servidores Web passam a servir aplicações PHP, ASP, JSP, Java servlets, etc... Utilizam APIs para acesso aos SGBDs <html> <?php $db_name = teste ; $db_user = yoko ; $db_pwd = secret ; $connect = odbc_pconnect($dbname,...) $sql = select * from empregado ; echo $sql; $result = odbc_exec($connect.$sql); odbc_result_all($result);?> </html> Exercício Através de buscas na Web selecionar um exemplo de aplicação web que envolva acesso ao postgresql. 9