Prévia do material em texto
SQL - DML
1
SELECT
A estrutura básica de uma consulta em SQL consiste em três cláusulas:
SELECT, FROM e WHERE
2
SELECT
Corresponde à operação de PROJEÇÃO da álgebra relacional. Ela é
usada para listar os atributos desejados como resultado de uma
consulta
3
FROM
É uma lista de relações a serem varridas na execução da expressão
A princípio, para consultas, a utilização do SELECT e FROM são
obrigatórios em qualquer consulta
4
WHERE
Corresponde ao predicado de seleção da álgebra relacional. Consiste
em um predicado envolvendo atributos das relações que aparecem na
cláusula FROM.
As cláusulas ainda podem ser ainda ser compostas com outras
cláusulas utilizando operadores lógicos AND e OR
5
SELECT
Seleção de colunas específicas
Seleção de todas as colunas
6
SELECT
Eliminação de Duplicações
Utilização de pseudônimos (alias)
7
WHERE
Objetivo: filtrar um conjunto de linhas de uma tabela ou um conjunto
delas
Operadores:
=, <>, <, >, IS NULL, IN, BETWEEN, NOT, LIKE
8
Exemplo
9
1) Quais são os funcionários de Juiz de Fora?
2) Quais são os funcionários que possuem carteira de motorista?
3) Quais são os funcionários do sexo feminino?
4) Quais são os funcionários que o nome começa com a letra M?
5) Quais são os funcionários com idade superior a 40 anos?
Exemplo - Respostas
10
Exemplo
Conjunção e Disjunção de condições
1) Quais são os funcionários de Juiz de Fora que
são do sexo masculino?
2) Quais são os funcionários que tem carteira de
habilitação e são do sexo feminino?
3) Quais são os funcionários que recebem mais
que R$ 750,00 e possuem mais de 30 anos de
idade?
4) Quais são os funcionários do sexo masculino
OU funcionários que o nome começa com a letra
J?
11
Exemplo - Respostas
12
ORDER BY
Objetivo: ordenar o resultado de uma consulta
A ordenação é feita pelas colunas indicadas na cláusula
ASC Ordenação crescente
DESC Ordenação decrescente
13
Exemplo
14
1) Ordene os registros pelo nome
de maneira ascendente
2) Ordene os registros pelo código
3) Ordene os registros pela idade
de maneira decrescente
Exemplo - Respostas
15
JOIN
Objetivo: combinar linhas de tabelas diferentes, através de valores
comuns em colunas correspondentes (basicamente a ligação ocorre
através da chave estrangeira)
No JOIN as colunas e os dados de ambas as tabelas que estão
envolvidas são trazidas no resultado por isto ele é utilizado.
16
JOIN
Como você construiria consultas que
respondessem as perguntas abaixo:
1) Quais os nomes dos departamentos que possuem
empregados que ganham mais de R$ 1000,00?
2) Qual o nome do funcionário e o nome do
departamento que ele trabalha?
3) Qual o preço de cada produto que o cliente Luiz
Felipe comprou na nota fiscal número 000456?
4) Quais os nomes dos alunos que obtiveram nota
maior que 80 na disciplina DCC060?
17
JOIN
O que se percebe na verdade, é que as informações requeridas estão
em mais de uma tabela ao mesmo tempo, por isto a necessidade de
se fazer a junção de tabelas para retornar os dados necessários. O
JOIN mais comum é o INNER JOIN que simplesmente retorna todas as
linhas que contém o mesmo valor para o campo que faz a ligação
entre as duas tabelas.
18
INNER JOIN
Retorna todas as linhas da relação R1 e da relação R2 que possuem o
mesmo valor para o campo em que foi feito o JOIN
1) Quais os nomes dos departamentos que possuem empregados que
ganham mais que R$ 1000,00?
2) Qual o nome do funcionário e o nome do departamento que ele
trabalha?
19
Respostas (1)
20
Respostas (2)
21
LEFT JOIN
Primeiramente um INNER JOIN é realizado. Depois, para cada linha da
relação R1 que não satisfaz a condição do JOIN, é concatenada ainda
as colunas da relação R2 porém com valores nulos. Em outras
palavras, traz todos os registros de R1, os que satisfazem o JOIN e os
que não satisfazem.
22
LEFT JOIN
1) Retorne tantos os alunos que ingressaram no ano de 2005 que estão
matriculados na disciplina DCC060 quanto os que não estão.
2) Retorne tantos os empregados que estão alocados para o projeto
‘GED’ quanto os que não estão.
23
Respostas (1)
24
Respostas (2)
25
Esta consulta já não é tão trivial, pois exige além de um LEFT
JOIN um INNER JOIN e a informação que precisa retornar está
espalhada entre 3 tabelas diferentes
Respostas (2) - Continuação
26
RIGHT JOIN
Primeiramente um INNER JOIN é realizado. Depois, para cada linha da
relação R2 que não satisfaz a condição do JOIN, é concatenada ainda
as colunas da relação R1 porém com valores nulos. Em outras
palavras, traz todos os registros de R2, os que satisfazem o JOIN e os
que não satisfazem. É o caminho inverso do LEFT JOIN
27
RIGHT JOIN
1) Retorne todos os nomes dos produtos que foram e os que não foram
vendidos no dia 01/12/2006.
28
Respostas (1)
29
Respostas (1) - Continuação
30
Funções de Agregação
Objetivo: Calcular um determinado valor
sobre um conjunto de linhas, como por
exemplo, média, valor máximo, mínimo,
quantas linhas foram retornadas e etc.
Funções mais comuns:
COUNT
AVG
MAX
MIN
SUM
31
COUNT
Retorna a quantidade de linhas do grupo
COUNT(*) inclui todas as linhas (mesmo as repetidas caso haja)
COUNT(coluna) retorna o número de linhas com valores não nulos da
coluna especificada
COUNT(DISTINCT coluna) retorna o número de linhas com valores
distintos naquela coluna
32
COUNT
1) Quantos são os empregados que trabalham
no departamento financeiro?
2) Quantas notas fiscais foram geradas entre
01/11/2006 e 30/11/2006?
3) Quantos departamentos possui a empresa?
4) Quantos alunos estão matriculados na
disciplina DCC009 no período letivo 3-2006?
33
Respostas - COUNT
34
MAX
Retorna o valor máximo da coluna dentro do grupo
1) Qual o maior salário do departamento Recursos Humanos?
2) Qual o maior salário da empresa?
3) Qual a nota fiscal de maior valor que já foi lançada?
4) Qual foi a maior nota na disciplina DCC060 em toda a história?
35
MAX - Respostas
36
MIN
Retorna o valor mínimo da coluna dentro do grupo
Qual o menor salário do departamento Recursos Humanos?
Qual o menor salário da empresa?
Qual a nota fiscal de menor valor que já foi lançada?
Qual foi a menor nota na disciplina DCC060 em toda a história?
37
MIN - Respostas
38
SUM
Retorna o somatório da coluna dentro do grupo
1) Qual o valor da folha de pagamento do departamento Pessoal?
2) Qual o valor das notas fiscais que foi faturado no dia 01/12/2006?
39
SUM - Respostas
40
AVG
Retorna a média da coluna dentro do grupo
1) Qual a média de idade do departamento de Informática?
2) Qual foi o valor médio faturado no mês de novembro pela empresa?
41
AVG – Respostas
42
GROUP BY
Agrupar valores vindos de funções de agregação por alguma coluna
em especial. Por exemplo, quantos funcionários existem por
departamento. Qual a média de idade por departamento. Quanto foi
faturado por dia no mês de novembro. Questões como estas são
respondidas através das funções de agregação porém utilizando ainda
a cláusula GROUP BY
43
GROUP BY
Um detalhe que nunca deve ser esquecido, cada coluna que aparecer
na cláusula SELECT excetuando-se as funções de agregação devem
obrigatoriamente aparecer na cláusula GROUP BY
44
GROUP BY
1)Quantos funcionários existem em cada departamento da empresa?
2) Qual a média de idade dos funcionários por departamento da
empresa?
3) Qual foram os valores faturados em cada dia do mês em todo o ano
na empresa?
4) Qual foi a média das notas dos alunos em cada disciplina do
período letivo 3-2006?
45
GROUP BY - Respostas
46
HAVING
Restringir os valores vindos de funções de
agregação e cláusulas GROUP BY.
1) Quais são os departamentos que possuem
média salarial acima de R$ 2000,00?
2) Quais são as disciplinas onde a média de notas
dos alunos no período letivo 3-2006 foi acima de
60?
3) Quais foram os dias que o faturamento
ultrapassou o valor de R$ 1000,00 no mês de
julho?
47
HAVING – Respostas
48
Inserção, atualização e
exclusão em SQL.
•49
Inserção de Dados
Adicionando tupla/registro à tabela
INSERT INTO <tabela> (<lista
de atributos>) VALUES
(<valores>)
INSERT INTO Empregado(Cad,
Nome, Sexo, Salario, Num_Dep,
Cad_Supv) VALUES (015, ‘José
da Silva’, ‘M’, 1000, 1, 020)
•50
insert into empregado
values (‘Richard’, ‘K’, ‘Marini’, ‘4830672’, ’13-06-
1953’, ’98, Oak Forest, TX’, ’M’, 37000, ‘3468345’,
‘4’);
Insira uma tupla, de um novo empregado, para o
qual sabe-se apenas os atributos pnome, unome,
dno e ssn.
insert into empregado(pnome, unome, dno, ssn)
values (‘Richard’, ‘Marini’, 4, ‘4830672’);
•51
Crie uma tabela que contenha o total de
empregados e o total de salários e cada
departamento.
create table depts_info
(dept_nomevarchar(15),
no_de_emps integer,
total_sal integer);
insert into depts_info (dept_nome, no_de_emps,
total_sal)
select dnome, count (*), sum (salario)
from (departamento join empregado on dnumero =
dno)
group by dnome;
•52
Atualização de Dados
Atualizando tuplas/registros
UPDATE <nome tabela> SET <nome
atributo> = valor WHERE <condição>
UPDATE Empregado SET Salario =
1500 WHERE Cad = 015
•53
Exemplos de uso do comando update:
update projeto
set plocalização = ‘Bellaire’, dnum = 5
where pnumero = 10;
update empregado
set salario = salario * 1,1
where dno in (select dnumero
from departamento
where dnome = ‘Pesquisa’);
•54
Deletando Dados
Apagando tuplas/registros da tabela
DELETE FROM <tabela> WHERE
<condição>
DELETE FROM Empregado WHERE
Salario > 5000
•55
Exemplos de uso do comando delete:
delete from empregado
where unome = ‘Brown’;
delete from empregado
where ssn = ‘1234530’;
delete from empregado
where dno in (select dnumero
from departamento
where dnome = ‘Pesquisa’);
delete from empregado;
•56
SQL
•57
Índices
Índices é maneira muito comum de melhorar a
performance do banco de dados. Um índice permite ao
servidor de banco de dados encontrar e retornar linhas
específicas mais rapidamente do que sem índices. Mas
índices também podem sobrecarregar o sistema de
banco de dados, portanto deve ser usado com cuidado
•58
Índices
Índice primário
A chave especifica qual registro possui aquela chave e
aponta para este registro
Índice secundário
Índice cuja chave não pertence a chave primária
A entrada aponta para todos os registros que contém
aquele valor de chave X
•59
Índices
Sugestões
A coluna é frequentemente utilizada na
cláusula where
Para as FOREIGN KEYS, pois estão
geralmente envolvidas em JOINS
Para as PRIMARY KEYS e UNIQUE KEYS
normalmente o SGBD cria
automaticamente um índice
Observações
Não é permitida a alteração de índices
Normalmente, a decisão de utilizar um
índice ou não é do sistema, não do usuário
•60
Tipos de Índices
A grande maioria dos bancos oferecem pelo menos duas
implementações para os índices
B-Trees
Hashing
Onde as B-Trees são mais comumente utilizadas como
estruturas que armazenam os índices
•61
B-Tree
Definição
Árvore de busca de ordem N
A raiz possui no mínimo 2 filhos
Cada folha possui no mínimo (n-1)/2 valores de chave
Cada nó interior possui no mínimo n/2 filhos
Todos os ramos tem o mesmo comprimento
•62
B-Tree
•63
B-Tree
•64
B-Tree
Trabalha com consultas de igualdade
ou comparação em dados que podem
estar ordenados em qualquer ordem. O
otimizados de consultas da maioria dos
SGBDs usam o índice B-Tree nos
campos onde foram criados quando há
um destes operadores:
<
<=
=
>=
>
•65
B-Tree
Outras construções que são equivalentes aos operadores
lógicos como BETWEEN e IN também fazem uso de
índices B-Tree nas consultas realizadas. (Porém,
dependendo do SGBD, a comparação IS NULL não é
equivalente a = NULL portanto não utilizaria a estrutura
de índices B-Tree)
•66
B-Tree
Consultas que envolvem busca por padrões como o
operador LIKE quando o padrão é uma constante e é
buscado só como início da string (Ex: nome LIKE ‘Luiz%’)
também utiliza do índice para acelerar a consulta.
Porém qualquer coisa fora deste padrão não utiliza
índices. Ex:
nome LIKE ‘%a%’ OR nome LIKE ‘pe%’
•67
Índice Hashing
São usados pelo otimizador de
consultas somente em condições de
igualdade (operador =)
Não é muito utilizado pois a princípio
é mais lento que os indíces em B-Tree
e em alguns bancos de dados, após
alguma queda do servidor por
exemplo, eles precisam ser
reindexados
CREATE INDEX name ON table
USING hash (column); (PostgreSQL)
•68
Índice UNIQUE
Índices UNIQUE podem ser utilizados para forçar que
uma determinada coluna ou combinação de colunas
terão valores únicos assim como a constraint UNIQUE
•69
Índice UNIQUE
Quando um índice UNIQUE é criado,
múltiplas linhas que contenham
valores duplicados para a coluna(s) do
índice criado não são permitidas. A
maioria dos SGBDs como PostgreSQL
cria automaticamente índices para
chaves primárias e colunas UNIQUE
definidas através de constraint por isto
é importante definir esta situação por
constraint e não criação de índices
manualmente pois pode haver
duplicação de informação
•70
Comando INSERT
Adiciona novas linhas a tabela requerida
Se as colunas não forem especificadas, o comando
assume as colunas na ordem de criação das tabelas
devendo assim ser informados tantos valores quantas
forem as colunas da tabela
•71
Comando INSERT
Considere a tabela abaixo:
•72
Comando INSERT
O comando abaixo está correto?
•73
Comando INSERT
O comando abaixo está correto?
Temos dois problemas, pois estão faltando 2
campos nos VALUES já que não foram
especificados as colunas. O banco entende
que os dados seriam inseridos na ordem das
colunas que foram criadas
•74
Comando INSERT
O comando abaixo está correto?
•75
Comando INSERT
O comando abaixo está correto?
•76
Comando INSERT
Quando omitimos alguma coluna como
fizemos comando anterior omitindo a
coluna registro e habilitação o SGBD
tenta assumir para essas colunas o
valor DEFAULT caso ele tenha sido
definido OU tenta inserir NULL.
Porém, o NULL depende da
obrigatoriedade definida ao se criar a
tabela, pois se for obrigatória o valor
da coluna, o comando não será
executado com sucesso
•77
Comando INSERT
O comando abaixo está correto?
•78
Comando INSERT
Na maioria dos SGBDs comerciais é possível fazer
inserções utilizando como entrada retornos de uma
consulta que foi realizada. Alguns bancos aceitam que e
em único comando INSERT possam ser inseridos vários
dados de uma vez como o PostgreSQL porém isso
depende de implementação do SGBD
•79
ComandoINSERT
•80
Comando UPDATE
O objetivo é atualizar um registro ou um
conjunto de registros nas colunas
indicadas no comando que satisfazem as
condições estabelecidas na cláusula
WHERE recebendo os novos valores que
são passados ou até mesmo valores vindos
de outras tabelas. Somente as colunas
especificadas no comando são atualizadas
•81
Comando UPDATE
Table Qual tabela terão registros atualizados
Alias Apelido que pode ser utilizado para se
referenciar a tabela, porém qualquer campo abaixo vai
ser referenciado por alias.nome_campo
Column Qual coluna da tabela que terá os valores
alterados
•82
Comando UPDATE
Expression A expressão que será atribuída
a coluna. Pode ser uma constante, pode ser o
resultado de uma stored procedure desde que
ela retorne um resultado compatível com o
tipo de dados do campo, pode ser ainda o
valor vindo de outro campo de outra tabela e
até mesmo o valor do próprio campo sendo
usado com alguma operação como operações
aritméticas por exemplo
Fromlist Assim como nas consultas
(SELECTs), no comando UPDATE é possível
trazer dados de outras tabelas para um
possível join ou satisfazer alguma condição na
cláusula WHERE
•83
Comando UPDATE
Condition Uma expressão que retorna um valor
booleano. Somente os registros que atenderem a estas
condições são afetados pelo UPDATE
•84
Comando UPDATE
Pode-se ainda atualizar linhas a partir de outra tabela
•85
Comando UPDATE
Considere mais uma vez a estrutura
•86
Comando UPDATE
O que o comando abaixo realiza?
•87
Comando UPDATE
É preciso sempre verificar atento as condições na
cláusula WHERE pois qualquer erro pode representar
uma atualização numa quantidade de registros muito
grande ou até mesmo em toda a tabela causando um
problema de última hora para voltar com as
informações no seu estado anterior
•88
Comando UPDATE
•89
Comando DELETE
Comando para excluir as linhas de uma tabela que
satisfazem uma condição
É importante não confundir DELETE com DROP, o
comando DROP destrói toda a estrutura inclusive os
dados de uma tabela, enquanto o DELETE manipula
dados de uma tabela, porém a estrutura sempre é
mantida e nunca é afetada
•90
Comando DELETE
•91
Sintaxe:
Apaga um conjunto de linhas que
satisfazem a condição indicada:
Apaga todas as linhas da tabela Depto já
que nenhuma condição foi indicada:
92
Banco de Dados
SQL
TRIGGERS (Gatilhos)
93
TRIGGERS (GATILHOS)
Uma TRIGGER é um tipo especial de sp que é executado automaticamente
em conseqüência de uma modificação (INSERT, UPDATE, DELETE) na tabela na
qual a TRIGGER foi configurada.
Chama-se disparar a trigger a execução automática da mesma
Não podem ser executadas usando EXEC.
94
Uma TRIGGER é sempre associada a uma tabela, porém os comandos que
formam a TRIGGER podem acessar dados de outras tabelas.
Ex: dadas as tabelas
Nota_Fiscal(Num_nota, valor_total)
Produto(Cod_Prod, nome, preço, estoque)
Nota_Prod(Num_nota, Cod_Prod, quantidade)
Pode-se criar uma Trigger para a operação de INSERT na tabela Nota_Prod.
Sempre que for inserido um novo item de pedido na tabela Nota_Prod será
disparada um Trigger que atualiza o nível de estoque do produto que está
sendo vendido
95
Com o uso de TRIGGERs pode-se definir “Regras de Negócio” do BD
Representam regras do “mundo real”
Ex: Aprovar financiamento maiores que um determinado valor
Pode-se usar TRIGGERS para exclusão e atualização em cascata
Se o comando que está sendo executado violar a definição de uma
CONSTRAINT definida, a TRIGGER não irá disparar
96
NO SQLServer 2000/2005 existem alguns tipos de
TRIGGERS:
DELETE
UPDATE AFTER
INSERT
INSTEAD OF
AFTER: é disparada APÓS todos os comandos de uma
TRIGGER associada com um DELETE, UPDATE e INSERT
terem sidos executados
INSTEAD OF é disparada ANTES dos comandos serem
executados. Processa as constraints antes da execução
da trigger.
97
O SQLServer 2000/2005 permite especificar TRIGGERs em Views (INSTEAD
OF)
Nos comandos que definem a TRIGGER pode-se usar a maioria dos
comandos SQL, inclusive estruturas IF..ELSE e WHILE.
Não são permitidos os seguintes comandos: ALTER DATABASE, CREATE
DATABASE, DROP DATABASE, LOAD DATABASE, LOAD LOG, RESTORE
DATABASE, RESTORE LOG, RECONFIGURE
98
Os comandos que compõe a TRIGGER tem acesso a duas tabelas especiais:
DELETED TABLE
INSERTED TABLE
Essas tabelas existem apenas na memória do servidor, não sendo gravadas
em disco
Os registros dessas tabelas são acessíveis somente durante a execução da
TRIGGER
Para referenciar essas tabelas temporárias dentro da TRIGGER usa-se os
nomes
DELETED
INSERTED
99
A tabela DELETED armazena cópias de registros afetados por um comando
DELETE ou UPDATE
Armazena os registros antes da alteração
A tabela INSERTED armazena cópias dos registros afetados por um
comando INSERT ou UPDATE.
Os registros na tabela INSERTED são cópias dos novos registros da tabela da
tabela que disparou a TRIGGER
100
Sintaxe:
CREATE TRIGGER nome_da_trigger
ON nome_da_tabela ou nome_da_view
[WITH ENCRYPTION]
{FOR | AFTER| INSTEAD OF}
{[DELETE] [,] [INSERT] [,] [UPDATE]}
AS
comando 1
comando 2
.....
comando n
101
Exemplo: Criar uma TRIGGER que evite que sejam
inseridos novos clientes na tabela CLIENTE (banco de
dados LOCADORA) em que o compo UF seja igual a
‘AC’ ou ‘PA’. Essa TRIGGER será criada para a ação
INSERT.
CREATE TRIGGER TG_Permite_UF
ON Cliente
FOR INSERT
AS
IF EXISTS (SELECT *
FROM INSERTED
WHERE UF_CLI IN ('PA', 'AC'))
BEGIN
PRINT 'INSERÇÃO DE REGISTRO CANCELADA.'
PRINT 'ESTADO (UF) PROIBIDO!!'
ROLLBACK
END
ELSE
102
Crie uma TRIGGER calcule e insera a data de devolução prevista na
tabela EMP_DEV sempre que uma fita for emprestada
CREATE TRIGGER tg_CALCULA_DATA_DEV_PREV
ON EMP_DEV
FOR INSERT
AS
IF EXISTS (SELECT * FROM INSERTED)
BEGIN
UPDATE EMP_DEV
SET DATA_DEV_PREV = DATEADD(DD,1,DATA_EMP)
END
103
Crie uma TRIGGER que calcule e insira a data de
devolução prevista na tabela EMP_DEV sempre que
uma fita for emprestada. Se a fita for de catálogo
ela tem dois dias para ser entregue. Lançamentos
podem ficar locadas apenas 1 dia.
alter table Fita
add Tipo_fita varchar (10)
Constraint CKTipo_fita check (Tipo_fita in
('catálogo','Lançamento'))
DROP TRIGGER tg_CALCULA_DATA_DEV_PREV
104
CREATE TRIGGER tg_CALCULA_DATA_DEV_PREV
ON EMP_DEV
FOR INSERT
AS
IF EXISTS (SELECT * FROM INSERTED INNER JOIN FITA ON
FITA.COD_FITA = INSERTED.COD_FITA
WHERE Tipo_fita = 'catálogo')
BEGIN
UPDATE EMP_DEV
SET DATA_DEV_PREV = DATEADD(DD,2,DATA_EMP)
WHERE emp_dev.cod_fita = (select inserted.cod_fita from inserted)
END
ELSE
IF EXISTS (SELECT * FROM INSERTED INNER JOIN FITA ON
FITA.COD_FITA = INSERTED.COD_FITA
WHERE Tipo_fita = 'Lançamento')
BEGIN
UPDATE EMP_DEV
SET DATA_DEV_PREV = DATEADD(DD,1,DATA_EMP)
105
Crie uma TRIGGER que calcule o valor da multa de um
cliente sempre que o mesmo devolver a fita à locadora. Isso
significa que toda a vez que o campo “dev_efet” for
preenchido (UPDATE) a multa será calculada.
CREATE TRIGGER tg_CALCULA_MULTA
ON EMP_DEV
FOR UPDATE
AS
IF UPDATE (DATA_DEV_EFET)
BEGIN
UPDATE EMP_DEV
SET multa = 1.5 * DATEDIFF(DD,DATA_DEV_PREV,DATA_DEV_EFET)
WHERE DATEDIFF(DD,DATA_DEV_PREV,DATA_DEV_EFET) > 0 END
IF UPDATE (DATA_DEV_EFET)
BEGIN
UPDATE EMP_DEVSET multa = 0
WHERE DATEDIFF(DD,DATA_DEV_PREV,DATA_DEV_EFET) <= 0 END
106
Vamos supor que, por ordem da admistraçao não seja
permitido fazer alterações e inserções na tabela
Fornecedor. Para garantir esta norma implemente um
trigger que dispare em resposta a comandos UPDATE
e INSERT na tabela Fornecedor. Esta trigger deve
emitir um aviso de que as alterações e inserções
foram suspensas e registrar em uma tabela o nome
do usuário que tentou fazer a alteração e o nome do
fornecedor que tentou-se alterar ou inserir.
CREATE TABLE TENTOU_ALTERAR
(
FORNECEDOR VARCHAR (50) NOT NULL,
USUÁRIO CHAR (30) NOT NULL
)
107
CREATE TRIGGER Tg_NÃO_ALTERAINSERE_FORNECEDOR
ON FORNECEDOR
FOR INSERT, UPDATE
AS
-- VARIAVEL QUE SERÁ UTILIZADA NA TRIGGER
DECLARE @NOME_FORNECEDOR VARCHAR(50)
-- VERIFICA SE FOI FEITA ALGUMA ALTERAÇÃO (INSERT OU UPDATE)
IF EXISTS (SELECT * FROM DELETED)
BEGIN
SET @NOME_FORNECEDOR = (SELECT NOME_FORN FROM DELETED)
PRINT 'VC NÃO PODE ALTERAR O REGISTRO DE UM FORNECEDOR'
ROLLBACK
INSERT INTO TENTOU_ALTERAR
VALUES (@NOME_FORNECEDOR, CURRENT_USER)
END
IF EXISTS (SELECT * FROM INSERTED)
BEGIN
SET @NOME_FORNECEDOR = (SELECT NOME_FORN FROM INSERTED)
108
Habilitando e Desabilitando
Trigger
Para desabilitar temporariamente uma trigger:
ALTER TABLE Nome_da_Tabela
DISABLE TRIGGER Nome_da_Trigger
Para habilitar novamente uma trigger:
ALTER TABLE Nome_da_Tabela
ENABLE TRIGGER Nome_da_Trigger