AT-03 SQL HEngholmJr

Propaganda
ADMINISTRAÇÃO DE BANCO DE
DADOS
ARTEFATO 03
AT03 – Diversos II
Page 1 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Indice
EXEMPLOS COM GROUP BY E COM A CLÁUSULA HAVING - TOTALIZANDO DADOS ..... 3
GROUP BY .................................................................................................................................... 3
Cláusula HAVING com GROUP BY ......................................................................................... 5
ENTENDENDO JOINS ................................................................................................................. 7
INNER JOIN ................................................................................................................................... 8
OUTER JOIN .................................................................................................................................. 9
CROSS JOIN ............................................................................................................................... 10
EXEMPLO COMPLETO INNER, LEFT, RIGHT E FULL OUTER JOIN ................................... 11
CROSS JOIN ............................................................................................................................... 12
INNER JOIN ................................................................................................................................. 12
LEFT JOIN ................................................................................................................................... 13
RIGHT JOIN ................................................................................................................................. 14
FULL OUTER JOIN ....................................................................................................................... 14
TRIGGERS .................................................................................................................................. 15
CONCEITOS ............................................................................................................................ 15
ORIENTAÇÕES BÁSICAS QUANDO ESTIVER USANDO TRIGGER. ..................................................... 16
Usos e aplicabilidade dos TRIGGERS.......................................................................... 17
CRIANDO TRIGGERS .............................................................................................................. 17
COMO FUNCIONAM OS TRIGGERS ...................................................................................... 18
TRIGGER INSERT .................................................................................................................. 18
TRIGGER DELETE .................................................................................................................. 19
DICAS PARA TRABALHARMOS COM TRIGGERS ............................................................................... 19
TRANSAÇÕES SQL SERVER ................................................................................................... 21
INTRODUÇÃO .............................................................................................................................. 21
VERIFICANDO ERROS DENTRO DE UMA TRANSAÇÃO ....................................................................... 22
EXEMPLO DE IMPLEMENTAÇÃO DE TRANSAÇÃO ............................................................................. 23
DICAS NA UTILIZAÇÃO DE TRANSAÇÕES ............................................................................ 24
STORED PROCEDURE COM SQL....................................................................................... 25
VANTAGENS ................................................................................................................................ 25
Page 2 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Exemplos com Group By e com a
cláusula Having - Totalizando Dados
Group by
Para compreendermos melhor o uso do GROUP BY, considere a tabela Produtos
Objetivo I: obter o número de produtos em estoque, agrupados pelo tipo, para que
depois seja feita a soma da quantidade existente em cada um dos grupos. Para isso
usamos a função SUM() em conjunto com o GROUP BY, como a instrução a seguir nos
mostra:
SELECT Tipo, SUM(Quantidade) AS 'Quantidade em
Estoque'
FROM Produtos
GROUP BY Tipo
Obtendo:
Page 3 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Objetivo II: contar o número de produtos em estoque de acordo com os fabricantes
disponíveis. Assim como no exemplo anterior, mais agora levando em conta os
fabricantes, os produtos devem ser agrupados por eles, para que depois sejam
contabilizados os produtos em relação a essa divisão. Para isso, devemos usar a seguinte
instrução:
SELECT Fabricante, SUM(Quantidade) AS 'Quantidade em Estoque'
FROM Produtos
GROUP BY Fabricante
Obtendo
Objetivo III: somar a quantidade de produtos em estoque de acordo com os tipos e
fabricantes disponíveis. Primeiro, será agrupados os produtos de acordo com os tipos e
fabricantes, para que depois seja feita a soma de cada um desses grupos (essa é a ordem
que o SQL Server faz logicamente, mais nossa instrução segue a ordem inversa). Utilize:
SELECT Tipo, Fabricante, SUM(Quantidade) AS 'Quantidade em
Estoque'
FROM Produtos
GROUP BY Tipo, Fabricante
Obtendo:
Page 4 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Objetivo IV: obter o valor total dos produtos em estoque, agrupados por tipo
utilizando:
SELECT Tipo, SUM(Quantidade * VlUnitario) AS 'Valor do Estoque'
FROM Produtos
GROUP BY Tipo
Obtendo:
Cláusula HAVING com GROUP BY
A cláusula HAVING determina uma condição de busca para um grupo ou um conjunto de
registros, definindo critérios para limitar os resultados obtidos a partir do agrupamento de
registros. É importante lembrar que essa cláusula só pode ser usada em parceria
com GROUP BY.
A cláusula GROUP BY pode ser empregada, entre outras finalidades, para agrupar os
produtos de acordo com cada tipo existente. Dentro de cada um dos grupos, a
cláusula HAVING pode ser usada para restringir apenas os registros que possuem uma
quantidade superior a 200 unidades no estoque, por exemplo.
Obs: O HAVING é diferente do WHERE. O WHERE restringe os resultados
obtidos sempre após o uso da cláusula FROM, ao passo que a cláusula HAVING filtra o
retorno do agrupamento.
Para fazermos o filtro conforme especificado acima, devemos usar a seguinte instrução:
SELECT Tipo, SUM(Quantidade) AS 'Quantidade em Estoque'
FROM Produtos
GROUP BY Tipo
HAVING SUM(Quantidade) > 200
Page 5 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Obtendo:
Perceba que este tipo de filtragem nos retornou apenas 2 registros, que são os tipos que,
somados,
ultrapassam
o
valor
de 200 unidades
em
estoque.
Objetivo V: agrupar os produtos com base nos tipos e fabricantes disponíveis. Logo
após, retornaremos apenas os registros cuja quantidade supera
as 200 unidades em estoque. Veja a instrução e o resultado a seguir:
novamente
SELECT Tipo, Fabricante, SUM(Quantidade) AS 'Quantidade em
Estoque'
FROM Produtos
GROUP BY Tipo, Fabricante
HAVING SUM(Quantidade) > 200
Retornando:
Objetivo VI: exemplo mais complexo: vamos supor que o agrupamento deverá ser
feito pelo Nome. Dentro deste agrupamento, desejamos obter apenas aqueles cuja
quantidade novamente supera as 200 unidades em estoque e cujo valor estocado seja
igual ou superior a 100 mil. Veja como fazer a seguir, e seu resultado:
SELECT Nome, SUM(Quantidade) AS 'Quantidade em
Estoque', SUM(Quantidade * VlUnitario) AS 'Valor em Estoque'
FROM Produtos
GROUP BY Nome
HAVING SUM(Quantidade) > 200 AND SUM (Quantidade * VlUnitario)
>= 10000.00
Page 6 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Retornando:
Entendendo Joins
Joins são a maneira de se ligar as tabelas em uma instrução SQL.
Nos exemplos, vou me referir a utilização de joins em instruções
SELECT,
mas
a
partir
do
SQL
Server
2000
podemos
utilizar
os
joins tanto nas instruções SELECT como UPDATE e DELETE.
Exercício: Crie as tabelas PEDIDO,
CLIENTE e ITENSPEDIDO, que reproduzem o clássico relacionamento
pai-filho:
CREATE
TABLE PEDIDO
(
PED_COD INT NOT NULL,
PED_DATA SMALLDATETIME NOT NULL ,
PED_CLI INT NOT NULL
)
CREATE TABLE CLIENTE
(
CLI_COD INT NOT NULL,
CLI_NOME VARCHAR(50) NOT NULL
)
CREATE TABLE ITENSPEDIDO
(
PED_COD INT NOT NULL,
ITEN_COD INT NOT NULL,
ITEN_QTD NUMERIC(5,2) NOT NULL
)
A tabela PEDIDO possui uma relação de um-para-muitos com a tabela
ITENSPEDIDO, através do campo PED_COD. A tabela PEDIDO possui
uma
relação
de
um-para-um
com
a
tabela
CLIENTE,
através
do
campo CLI_COD.
Page 7 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Inner Join
O Inner Join, que geralmente é a maneira mais utilizada de se
retornar
dados
espalhados
entre
tabelas,
funciona
seguindo
o
princípio
de
que
para
os
registros
retornados
de
uma
tabela,
deve
haver
algum
tipo
de
relação
com
os
registros
da
outra
tabela.
No
caso
da
igualdade,
somente
os
registros
das
duas
tabelas, que possuírem o mesmo valor para um determinado campo,
são retornados. Exemplo:
SELECT
PED.PED_COD ,
PED. PED_DATA ,
ITEN.lang=ES-TRAD>ITEN_COD ,
ITEN. ITEN_QTD
FROM PEDIDO PED , ITENSPEDIDO ITEN
WHERE
PED.PED_COD = ITEN.PED_COD
Verifique no exemplo acima que somente os registros que contiverem o
mesmo valor para o campo PED_COD nas duas tabelas são retornados.
Apesar
de
existir
outra
maneira
de
se
fazer
o
INNER
JOIN,
eu recomendo a maneira com o WHERE, pois torna o código da
instrução
mais
legível.
Em
termos
de
performance,
as
duas
instruções
se
equivalem.
Outra
maneira,
que
retorna
os
mesmos
resultados:
SELECT
PED.PED_COD ,
PED. PED_DATA ,
lang=ES-TRAD>ITEN. ITEN_COD ,
ITEN. ITEN_QTD
FROM PEDIDO PED INNER JOIN ITENSPEDIDO ITEN
ON PED.PED_COD = ITEN.PED_COD </span
Importante: o Inner join permite o uso de outros operadores que não sejam somente o
igual (=).
Page 8 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Outer join
O
tipo
de
join
chamado
Outer
join,
possui
o
funcionamento
um
pouco
diferente.
Utilizando
o
Outer
join,
além
de
podermos
retornar
os
registros
das
duas
tabelas
seguindo
alguma
relação,
ainda
podemos
retornar
registros
que
não
entram
nesta
relação.
Geralmente, este tipo de join pode ser utilizado em
nada impede que se utilize em mais de duas
tabela de cliente ao nosso modelo PEDIDO-ITENS por exemplo.
duas tabelas. Mas
tabelas, como a
Pensando na ligação entre duas tabela, foram criados duas opções para
se utilizar no Outer Join:
1. Opção LEFT OUTER JOIN, visando aplicar o conceito de Outer
Join na tabela que se encontrar à esquerda da relação.
Apesar de não ser recomendado, pode ser substituída pelo operador *=
2. Opção RIGHT OUTER JOIN, visando aplicar o conceito de Outer
Join na tabela que se encontrar à direita da relação.
Apesar de não ser recomendado, pode ser substituída pelo operador
=*
Como podemos alterar a ordem na qual colocamos a tabela na instrução,
há um equivalência em termos de funcionalidade para estas
opções de Outer Join.
Importante: esta ordem é em relação às tabelas, e não à comparação feita após a palavra
chave ON.
Por exemplo, queremos todos os pedidos que tenham relação com
a tabela de itens e também os pedidos que não tenham relação
com nenhum item:
SELECT
PED.PED_COD ,
PED. PED_DATA ,
<span
lang=ES-TRAD>ITEN. ITEN_COD ,
ITEN. ITEN_QTD
FROM PEDIDO PED LEFT OUTER JOIN ITENSPEDIDO ITEN
ON PED.PED_COD = ITEN.PED_COD </span
Pode ser escrita como:
SELECT
PED.PED_COD ,
PED. PED_DATA ,
<span
lang=ES-TRAD>ITEN. ITEN_COD ,
Page 9 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
ITEN. ITEN_QTD
FROM ITENSPEDIDO ITEN RIGHT OUTER JOIN PEDIDO PED
ON PED.PED_COD = ITEN.PED_COD </span
Ou ainda:
SELECT
PED.PED_COD ,
PED. PED_DATA ,
<span
lang=ES-TRAD>ITEN. ITEN_COD ,
ITEN. ITEN_QTD
FROM ITENSPEDIDO ITEN , PEDIDO PED
WHERE PED.PED_COD *= ITEN.PED_COD </span
Veja que para os registros em que a relação de igualdade foi encontrada,
os campos de ambas as tabelas são retornados corretamente.
Nos registros em que nenhum item de pedido foi encontrado,
é colocado o valor NULL para todos os campos da tabela ITENSPEDIDO.
Cross Join
O Cross Join possui uma funcionalidade completamente diferente
dos outros tipos de Join. Ele simplesmente obtém todos os
registros de todas as tabelas e faz o produto cartesiano (ou
seja, cada registro de uma tabela é relacionado com cada
registro da outra tabela), obtendo assim, o número total de
registros através da multiplicação do total de registros das
tabelas envolvidas no Cross Join.
Exemplo:
SELECT
PED.PED_COD ,
PED. PED_DATA ,
CLI.CLI_COD,
CLI.CLI_NOME
FROM PEDIDO PED , CLIENTE CLI
Perceba que no exemplo acima, todos os pedidos se relacionarão com
todos os clientes, independendo do valor dos campos CLI_COD
e PED_CLI.
Este tipo de Join poderia ser escrito e fazer dois Outer Join,
que neste caso seria chamado de Full Outer Join. A partir
da versão 2000 do SQL Server, não mais podemos utilizar o
operador *=* para fazer Cross Join, pois este operador foi
extinto.
Page 10 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Exemplo completo Inner, left, right e full
outer join
Crie as tabelas
create table carros(
marca varchar(100),
modelo varchar(100),
ano int,
cor varchar(100)
)
create table marcas(
marca varchar(50),
nome varchar(50)
)
Insira os dados abaixo
insert into marcas values('VW','Volkswagem')
insert into marcas values('Ford','Ford')
insert into marcas values('GM','General Motors')
insert into marcas values('Fiat','Fiat')
insert into marcas values('Renault','Renault')
insert into marcas values('MB','Mercedes Bens')
insert into carros values('VW','Fox',2005,'preto');
insert into carros values('VW','Fox',2008,'preto');
insert into carros values('Ford','Ecosport',2009,'verde');
insert into carros values('Ford','KA',2008,'prata');
insert into carros values('Fiat','Punto',2008,'branco');
insert into carros values('Fiat','Uno',2007,'preto');
insert into carros values('Fiat','Stilo',200,'4prata');
insert into carros values('Fiat','Uno',2005,'prata');
insert into carros values('Fiat','Stilo',2008,'verde');
insert into carros values('Fiat','Uno',2009,'branco');
insert into carros values('Peugeot','207',2010,'prata');
insert into carros values('Peugeot','207',2010,'prata');
insert into carros values('Peugeot','207',2007,'azul');
insert into carros values('Chrysler','300 C',2008,'verde');
Page 11 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Verifique como ficaram as duas tabelas:
select * from marcas
select * from carros
Cross Join
A junção cross join irá juntar todos os registros da tabela marcas com todos os registros da
tabela carros, formando um produto cartesiano. Veja o exemplo abaixo:
select m.nome, c.modelo
from marcas as m cross join carros as c
Inner Join
A junção inner join irá juntar os registros da tabela marca que tiver um correspondente na
tabela carros. Essa correspondência é feita pelos campos marca que está presente nas
duas tabelas. Embora não esteja explícito, mas o campo marca seria a chave primária (na
tabela marcas) e chave estrangeira (na tabela carros). Veja o exemplo:
Page 12 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
select m.nome, c.modelo
from marcas as m inner join carros as c
on c.marca = m.marca
Apenas 10 registros satisfazem o inner join. Podemos dizer que 10 carros estão
associados a alguma marca, enquanto que os demais não.
Left Join
O left join irá fazer a junção das duas tabelas “dando preferência” aos registros da tabela
marcas. Assim, todos os registros da tabela marcas serão mostrados, independente de
haver correspondência na tabela carros. Quando não houver correspondência na tabela
carros, será mostrado o valor NULL ou nulo. Exemplo:
select m.nome, c.modelo
from marcas as m left join carros as c
on c.marca = m.marca
Page 13 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Right Join
A junção right join funciona de forma inversa ao left join. Aplica-se o mesmo conceito,
porém, de forma invertida. Com o right join será mostrado todos os carros, mesmo aqueles
que não estejam associados a nenhum registro da tabela marcas. Exemplo:
select m.nome, c.modelo
from marcas as m right join carros as c
on c.marca = m.marca
207 e 300 C são modelos que estão cadastrados em carros, mas não estão associados a
nenhuma marca.
Full Outer Join
A junção full outer join seria o mesmo que left join e right join juntas, ou seja, ela irá
mostrar todas as marcas e todos os carros, independente de existir valores
correspondente na tabela oposta. Veja um exemplo:
select m.nome, c.modelo
from marcas as m full outer join carros as c
on c.marca = m.marca
Page 14 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Triggers
CONCEITOS
•
•
•
•
•
•
Tipo especial de procedimento armazenado, que é executado sempre que há uma
tentativa de modificar os dados de uma tabela que é protegida por ele.
São invocados automaticamente pelos servidores de banco de dados.
Os procedimentos armazenados são invocados explicitamente enquanto os
gatilhos são associados a tabelas particulares e são executados quando existe
uma tentativa de modificação dos dados da tabela.
Gatilhos e regras são associados a tabelas específicas mas enquanto as regras só
podem realizar testes simples sobre os dados, os gatilhos podem utilizar todo o
poder da SQL, podendo ser utilizados para garantir a integridade referencial.
Podem ser usados para disparar uma seqüência de modificações em diversas
tabelas relacionadas de um Banco de Dados. Dependendo do SGBD relacional,
um gatilho pode ter acesso a outras bases de dados pela rede através da chamada
de procedimentos remotos.
Pode-se também utilizar gatilhos para garantir regras de negócios. Um pedido de
cliente pode ser recusado se a sua conta corrente apresentar débito pendente, por
exemplo
Associados a uma tabela
Os TRIGGERS são definidos em uma tabela específica, que é denominada tabela de
TRIGGERS;
Page 15 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Chamados Automaticamente
Quando há uma tentativa de inserir, atualizar ou excluir os dados em uma tabela, e um
TRIGGER tiver sido definido na tabela para essa ação específica, ele será executado
automaticamente, não podendo nunca ser ignorado.
Não podem ser chamados diretamente
Ao contrário dos procedimentos armazenados do sistema, os disparadores não podem ser
chamados diretamente e não passam nem aceitam parâmetros.
É parte de uma transação
O TRIGGER e a instrução que o aciona são tratados como uma única transação, que
poderá ser revertida em qualquer ponto do procedimento, caso você queria usar
“ROLLBACK”, conceitos que veremos mais a frente.
Orientações básicas quando estiver usando TRIGGER.
- As definições de TRIGGERS podem conter uma instrução “ROLLBACK
TRANSACTION”, mesmo que não exista uma instrução explícita de “BEGIN
TRANSACTION”;
- Não é uma boa prática utilizar “ROLLBACK TRANSACTION” dentro de seus TRIGGERS,
pois isso gerará um retrabalho, afetando muito no desempenho de seu banco de dados,
pois toda a consistência deverá ser feita quando uma transação falhar, lembrando que
tanto a instrução quanto o TRIGGER formam uma única transação. O mais indicado é
validar as informações fora das transações com TRIGGER para então efetuar, evitando
que a transação seja desfeita.
Page 16 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Usos e aplicabilidade dos TRIGGERS
•
•
•
•
Impor uma integridade de dados mais complexa do que uma restrição CHECK;
Definir mensagens de erro personalizadas;
Manter dados desnormalizados;
Comparar a consistência dos dados – posterior e anterior – de uma instrução
UPDATE;
Os TRIGGERS são usados com enorme eficiência para impor e manter integridade
referencial de baixo nível, e não para retornar resultados de consultas. A principal
vantagem é que eles podem conter uma lógica de processamento complexa.
Você pode usar TRIGGERS para atualizações e exclusões em cascata através de tabelas
relacionadas em um banco de dados, impor integridades mais complexas do que uma
restrição CHECK, definir mensagens de erro personalizadas, manter dados
desnormalizados e fazer comparações dos momentos anteriores e posteriores a uma
transação.
Quando queremos efetuar transações em cascata, por exemplo, um TRIGGER de
exclusão na tabela PRODUTO do banco de dados Northwind pode excluir os registros
correspondentes em outras tabelas que possuem registros com os mesmos valores
de PRODUCTID excluídos para que não haja quebra na integridade, como a dito popular
“pai pode não ter filhos, mas filhos sem um pai é raro”.
Você pode utilizar os TRIGGERS para impor integridade referencial:
Executando uma ação ou atualizações e exclusões em cascata.
CRIANDO TRIGGERS
As TRIGGERS são criadas utilizando a instrução CREATE TRIGGER
Page 17 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
COMO FUNCIONAM OS TRIGGERS
TRIGGER INSERT
De acordo com a sua vontade, um TRIGGER por lhe enviar mensagens de erro ou
sucesso, de acordo com as transações.
Criamos a tabela
Criamos o TRIGGER INSERT
Mensagem disparada pelo TRIGGER
Page 18 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
create trigger tgr_onInsertUsuario on usuarios
for insert
as
if (select count(*) from usuarios, inserted where login = inserted.login and
senha = inserted.senha = 1
)
RAISERROR(‘PAR LOGIN/SENHA EXISTENTES’, 16, 1)
ROLLBACK TRANSACTION
end
TRIGGER DELETE
Quando um registro é acrescentado a tabela temporária DELETED, ele deixa de existir na
tabela do banco de dados. Portanto, a tabela DELETED, não apresentará registros em
comum com as tabelas do banco de dados;
—
É alocado espaço na memória para criar a tabela DELETED, que está sempre
em cache;
Dicas para trabalharmos com Triggers
•
•
•
Pode-se ter mais de um Trigger do mesmo tipo para uma mesma
tabela. A ordem de execução vai do que foi criado primeira
até o último que foi criado.
O encadeamente de Trigger (um Trigger chamado outro, ou a
si mesmo) pode ocorrer, desde que seja habilitada uma opção
do servidor. Por padrão esta opção é habilitada.
Utilize Triggers para colocar sua regra de negócio, mas sem
abusar. Para verificações mais simples, procure utilizar outros
objetos do Banco de dados, como constraints
Page 19 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
•
•
•
Triggers podem ser utilizados para replicação (cópia dos dados).
Por exemplo: a cada vez que o usuário inserir um dados, você
insere em outra tabela.
Triggers não podem ser chamados manualmente como Stored Procedures.
Eles são chamados somente pela instrução determinada pelo
tipo do Trigger.
Existem os novos Trigger INSTEAD OF que funcionam um pouco
diferente dos Triggers padrão. Eles substituem a instrução
que os disparou.
Page 20 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Transações SQL SERVER
Introdução
•
•
•
•
Sequência de operações num sistema de gerência de banco de dados que são
tratadas como um bloco único e indivisível (atômico) durante uma recuperação de
falhas
Provê isolamento entre acessos concorrentes na mesma massa de dados.
Transação é uma unidade lógica de processamento que tem por objetivo preservar
a integridade e a consistência dos dados.
O processamento da transação pode ser executado totalmente ou não.
Sintaxe básica
Begin Transaction
--Corpo de comando
Commit ou Rollback
Onde:
•
•
•
•
•
•
Begin Transaction: Tag inicial para o inicio de uma transação.
--Corpo de comando: Conjunto de comando a serem executados dentro de uma
transação.
Commit: Comando que confirma o conjunto de comandos
Rollback: Comando que desfaz todo o processo executado pelo corpo de
comandos caso tenha ocorrido algum evento contrario ao desejado.
transaction_name: Nome atribuído à operação.
@tran_name_variable: É o nome de uma variável definida pelo usuário que contém
um nome de transação válido. A variável deve ser declarada com um char,
varchar, nchar, ou o tipo de dados nvarchar. Se mais de 32 caracteres são
passados para a variável, apenas os primeiros 32 caracteres serão utilizados; os
caracteres restantes serão truncados.
WITH MARK [ 'description' ]: Especifica que a transação está marcado no registro.
A inscrição é uma string que descreve a marca. Uma descrição mais de 128
caracteres são truncados para 128 caracteres antes de serem armazenados na
tabela msdb.dbo.logmarkhistory.
Page 21 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Verificando erros dentro de uma transação
No SQL SERVE temos uma função de sistema que faz a identificação de um erro dentro
de uma transação chamada de ‘@@ERROR’ função essa que por padrão recebe o valor 0
(zero) caso não ocorra nem um erro , no caso de algum erro ela assume o valor 1 (um).
Exemplo
BEGIN TRANSACTION
UPDATE FROM TbContas
SET NuSaldo= 10.000
WHERE NuSaldo
IF @@ERROR = 0
COMMIT
ELSE
ROLLBACK
END
Nomeando transações
Page 22 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Exemplo de implementação de transação
Page 23 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Dicas na utilização de transações
1. Mantenha transações curtas, ou seja, não coloque muitas instruções SQL
entre o BEGIN TRANSACTION e o COMMIT. Apesar de outros usuários enxergarem os
dados de uma transação que ainda não fez o COMMIT, os dados ficam gravados no SQL
dentro do arquivo de Transaction Log (geralmente com a
extensão .ldf)
2. Vamos supor que alguém resolva utilizar a mesma tomada do
computador servidor em que o SQL Server está rodando para
ligar uma cafeiteira , quando uma transação foi iniciada mais
ainda não fez o COMMIT. Neste
caso , quando o serviço do SQL Server foi reiniciado , todas
as transações que ainda não executaram o COMMIT voltarão
ao seu estado inicial antes do BEGIN
TRANSACTION.
3. Procure sempre nomear as transações.Isso obriga o utilização
do TRANSACTION no COMMIT
e no ROLLBACK.
Exemplo:
BEGIN
TRANSACTION TRAN_01
DELETE
FROM TABELA1
IF
@@ERROR <> 0
ROLLBACK TRANSACTION TRAN_01
ELSE
COMMIT TRANSACTION TRAN_01
4) Encadeamento de transações são permitidos. Para ver em que
nível de transação você está , utilize a variável @@TRANCOUNT
Page 24 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Stored Procedure com SQL
Coleção de instruções implementadas com linguagem T-SQL (Transact-Sql, no SQL
Server 2000/2005), que, uma vez armazenadas ou salvas, ficam dentro do servidor de
forma pré-compilada, aguardando que um usuário do banco de dados faça sua execução.
oferecem suporte a variáveis declaradas pelo próprio usuário, uso de expressões
condicionais, de laço e muitos outros recursos
Vantagens
Modularidade:
passamos a ter o procedimento divido das outras partes do
software, bastante alterarmos somente às suas operações para que se tenha as
modificações por toda a aplicação;
·
Diminuição de I/O: uma vez que é passado parâmetros para o
servidor, chamando o procedimento armazenado, as operações se desenolam usando
processamento do servidor e no final deste, é retornado ou não os resultados de uma
transação, sendo assim, não há um tráfego imenso e rotineiro de dados pela rede;
·
Rapidez na execução:
·
Segurança de dados:
os stored procedures, após salvos no servidor,
ficam somente aguardando, já em uma posição da memória cache, serem chamados para
executarem uma operação, ou seja, como estão pré-compilados, as ações também já
estão pré-carregadas, dependendo somente dos valores dos parâmetros. Após a primeira
execução, elas se tornam ainda mais rápidas;
podemos também, ocultar a complexidade do
banco de dados para usuários, deixando que sejam acessados somente dados pertinentes
ao tipo de permissão atribuida ao usuário ou mesmo declarando se o Stored Procedure é
proprietário ou público, podendo ser também criptografada com WITH ENCRYPTION
Page 25 of 25
Documento: Adm BD / SQL
SytCom Training 2014. All rights reserved
Download