# 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
```