# Atividade Banco de Dados ## Trigger Um Trigger é um procedimento armazenado no banco de dados que é chamado automaticamente sempre que ocorre um evento especial no banco. Ele é importante quando temos a necessidade de realizar uma determinada ação de acordo com algum evento que acontecer. Ou seja, a partir desse "gatilho", realiza alterações nas tabelas por meio de operações de inserção, exclusão e atualização de dados (insert, delete e update). A sua estrutura é essa abaixo: ``` CREATE TRIGGER [NOME DO TRIGGER] ON [NOME DA TABELA] [FOR/AFTER/INSTEAD OF] [INSERT/UPDATE/DELETE] AS ``` ### Exemplos #### Trigger For > FOR é o valor padrão do trigger e faz com o que o gatilho seja disparado junto da ação. ``` CREATE TRIGGER TGR_VENDAS_AD ON VENDAS FOR DELETE AS BEGIN DECLARE @VALOR DECIMAL(10,2), @DATA DATETIME SELECT @DATA = DATA, @VALOR = VALOR FROM DELETED UPDATE CAIXA SET SALDO_FINAL = SALDO_FINAL - @VALOR WHERE DATA = @DATA END GO ``` #### Trigger After > AFTER faz com que o disparo se dê somente após a ação que o gerou ser concluída ``` CREATE TRIGGER production.trg_product_audit ON production.products AFTER INSERT, DELETE AS BEGIN //comando aqui END GO ``` #### Trigger Instead Of > Serve para pular uma instrução INSERT, DELETE ou UPDATE de uma tabela e executar outras instruções definidas no trigger. A operação real de inserção, exclusão ou atualização não ocorre. ``` CREATE TRIGGER production.trg_vw_brands ON production.vw_brands INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON; INSERT INTO production.brand_approvals ( brand_name ) SELECT i.brand_name FROM inserted i WHERE i.brand_name NOT IN ( SELECT brand_name FROM production.brands ); END GO ``` ## Procedure É uma **conjunto de comandos** em SQL que **podem ser executados de uma só vez**, como em uma função. Ele **armazena tarefas repetitivas** e aceita parâmetros de entrada para que a tarefa seja efetuada de acordo com a necessidade individual. Sua importância se dá devido a capacidade de reduzir o tráfego na rede, melhorar a performance de um banco de dados, criar tarefas agendadas, diminuir riscos, criar rotinas de processsamento, e entre outros. Estrutura: ``` USE BancoDados GO CREATE PROCEDURE Busca --- Declarando o nome da procedure @CampoBusca VARCHAR (20) --- Declarando variável (note que utilizamos o @ antes do nome da variável) AS SELECT Codigo, Descrição --- Consulta FROM NomeTabela WHERE Descricao = @CampoBusca --- Utilizando variável como filtro para a consulta ``` ### Parâmetros de entrada Os parâmetros de entrada permitem que o comando passe um valor de dados para Stored Procedure ### Parâmetros de saída Os parâmetros de saída permitem que o Stored Procedure passe um valor de dados ou uma variável de cursor de volta para o comando. As funções definidas pelo usuário não podem especificar parâmetros de saída. ### Valores de retorno Toda Stored Procedure retorna um código de retorno de inteiro ao comando. Se o procedimento armazenado não definir um valor explicitamente para o código de retorno, este será 0. ### Exemplos #### Com parâmetro de entrada **Declarando o Procedure:** ``` CREATE PROCEDURE Pc_HumanResources_SELECT @DepartamentID smallint --Parametro de entrada AS SELECT * FROM HumanResources.Department WHERE DepartmentID = @DepartamentID GO ``` **Comando para executar o Procedure:** ``` EXECUTE Pc_HumanResources_SELECT 2 ``` #### Com parâmetro de saída **Declarando o Procedure:** ``` CREATE PROCEDURE Pc_HumanResources_MAXID @DepartamentID smallint OUTPUT --Parametro de saida AS SET @DepartamentID = (SELECT MAX(DepartmentID) FROM HumanResources.Department) GO ``` **Comando para executar o Procedure:** ``` DECLARE @MAX smallint EXECUTE Pc_HumanResources_MAXID @DepartmentID = @MAX OUTPUT PRINT @MAX ```