Sistemas de Informação e Bases de Dados 2012/2013 Stored Procedures e Triggers Alberto Sardinha
Bibliografia MSDN http://msdn.microsoft.com 1
Funções e Procedimentos SQL suporta funções e procedimentos com ciclos, if-then-else, declaração de variáveis, atribuição de valores a variáveis, etc. 2
Stored Procedures Stored Procedure com um comando SQL create procedure getcustomers as select * from customer go Para chamar a função: exec getcustomers customer_name customer_street customer_city ---------------+-----------------+---------------- Adams Spring Pittsfield Brooks Senator Brooklyn......... (15 rows) 3
Stored Procedure com um parâmetro create procedure getcustomers @customer varchar(255) as select * from customer where customer_name = @customer go Para chamar a função: exec getcustomers @customer = Brooks ou exec getcustomers Brooks customer_name customer_street customer_city ---------------+-----------------+---------------- Brooks Senator Brooklyn (1 row) 4
Stored Procedure com vários parâmetros create procedure getaddress @street varchar(255), @city varchar(255) as select * from customer where customer_street = @street and customer_city = @city go Para chamar a função: exec getcustomers @street = Senator, @city = Brooklyn ou exec getcustomers Senator, Brooklyn customer_name customer_street customer_city ---------------+-----------------+---------------- Brooks Senator Brooklyn (1 row) 5
Elementos Procedimentais Básicos Blocos begin end podem conter múltiplos comandos SQL podem conter declarações de variáveis locais Declaração de variáveis declare <@variable> <type> [= <value>] o âmbito da variável local está restrito ao bloco onde foi declarada 6
Elementos Procedimentais Básicos create procedure getnumaccountsandloans @customer varchar(255) as begin declare @numaccounts int = 0, @numloans int = 0 select @numaccounts = COUNT(account_number) from depositor where customer_name = @customer select @numloans = COUNT(loan_number) from borrower where customer_name = @customer return @numaccounts + @numloans end go 7
Exemplo do banco branch account depositor loan borrower customer IST DEI Bases de Dados
Elementos Procedimentais Básicos Para chamar a função e ver o resultado: DECLARE @return_value int EXEC @return_value = getnumaccountsandloans 'Smith' SELECT 'Return Value' = @return_value GO Return Value --------------- 3 (1 row) 9
Elementos Procedimentais Básicos Condições if condition <statements1> else <statements2> Ciclos while condition <statements> 10
Elementos Procedimentais Básicos create procedure getnumaccountsandloans @customer varchar(255) as begin declare @numaccounts int = 0, @numloans int = 0 select @numaccounts = COUNT(account_number) from depositor where customer_name = @customer select @numloans = COUNT(loan_number) from borrower where customer_name = @customer if(@numaccounts + @numloans = 0) begin print Customer with no accounts return 0 end else return @numaccounts + @numloans end go 11
Triggers Um trigger é uma instrução executada em reação a uma modificação na BD Para especificar um trigger é necessário saber: as condições em que o trigger é disparado as ações a fazer quando o trigger é executado Triggers são um conceito antigo, mas só apareceu na norma SQL:1999 IST DEI Bases de Dados 12
Necessidade dos triggers Cenário: o cliente levanta um quantia superior ao saldo Em vez de resultar num saldo negativo, o banco: cria um empréstimo igual à quantia em falta dá ao empréstimo o mesmo número que a conta coloca o saldo da conta a zero Condição de disparo: um update que resulte em saldo negativo na conta IST DEI Bases de Dados 13
Exemplo Levantamento de 500 da conta A-102 account -100 IST DEI Bases de Dados 14
opções: instead of after (for) Exemplo Trigger create trigger overdraft_trigger on account after update as begin... end go opções: insert update delete nome do trigger tabela na BD que dispara o trigger 15
Exemplo Trigger create trigger overdraft_trigger on account after update as begin declaração de variáveis declare @account varchar(255), @branch varchar(255), @balance numeric(20,2) end go select @account = account_number, @branch = branch_name, @balance = balance from inserted tabela que contem os dados que foram atualizados 16
Exemplo Levantamento de 500 da conta A-102 loan borrower A- 102 Perryridge 100 depositor Hayes account A- 102 0 IST DEI Bases de 2012 Dados IST 17
create trigger overdraft_trigger on account after update as begin declare @account varchar(255), @branch varchar(255), @balance numeric(20,2) select @account = account_number, @branch = branch_name, @balance = balance from inserted if(@balance <0) begin insert into loan values(@account, @branch, -1*@balance) end end go atualização que resulta num saldo negativo 18
Exemplo Levantamento de 500 da conta A-102 loan borrower A- 102 Perryridge 100 depositor Hayes account A- 102 0 IST DEI Bases de 2012 Dados IST 19
create trigger overdraft_trigger on account after update as begin declare @account varchar(255), @branch varchar(255), @balance numeric(20,2) select @account = account_number, @branch = branch_name, @balance = balance from inserted if(@balance <0) begin insert into loan values(@account, @branch, -1*@balance) insert into borrower select customer_name, account_number from depositor as d where d.account_number = @account end end go 20
Exemplo Levantamento de 500 da conta A-102 loan borrower A- 102 Perryridge 100 depositor Hayes account A- 102 0 IST DEI Bases de 2012 Dados IST 21
create trigger overdraft_trigger on account after update as begin declare @account varchar(255), @branch varchar(255), @balance numeric(20,2) select @account = account_number, @branch = branch_name, @balance = balance from inserted if(@balance <0) begin insert into loan values(@account, @branch, -1*@balance) insert into borrower select customer_name, account_number from depositor as d where d.account_number = @account update account set balance = 0 where account_number = @account end end go 22
Testar Trigger trigger dispara somente com comando update tabela na BD que dispara o trigger update account set balance = balance 500 where account_number = 'A- 102' 23
Trigger que Cancela uma Ação create trigger cancel_overdraft on account after update as begin declare @balance numeric(20,2) select @balance = balance from inserted if(@balance <0) begin raiserror('a conta nao tem saldo suficiente',16,1) rollback end end go update account set balance = balance 500 where account_number = 'A-102'; 24
Trigger que Cancela uma Ação create trigger cancel_overdraft2 on account instead of update as begin declare @account varchar(255), @balance numeric(20,2) select @account = account_number, @balance = balance from inserted if(@balance <0) raiserror('a conta nao tem saldo suficiente',16,1) else update account set balance = @balance where account_number = @account end go update account set balance = balance 500 where account_number = 'A-102'; 25
Sumário Triggers e stored procedures em SQL Server 26