Professional Documents
Culture Documents
UNIDADE 1 1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11
UNIDADE 2 2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
UNIDADE 5 5.1
5.2
5.3
UNIDADE 4 4.1
4.2
4.3
4.4
4.5
UNIDADE 3 3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
3.10
3.11
3.12
3.13
3.14
3.15
3.16
SQL .................................................................................................................................................................. 3
5.4
5.5
5.6
5.7
5.8
5.9
CRIANDO DISPARADORES.............................................................................................................................................. 70
DESATIVANDO OU ATIVANDO UM DISPARADOR ................................................................................................................. 74
COMO FUNCIONAM OS DISPARADORES ........................................................................................................................... 74
COMO FUNCIONAM OS DISPARADORES ANINHADOS........................................................................................................... 80
EXEMPLOS DE DISPARADORES........................................................................................................................................ 83
CONSIDERAES SOBRE O DESEMPENHO ......................................................................................................................... 85
UNIDADE 6 6.1
6.2
6.3
6.4
6.5
UNIDADE 7 7.1
7.2
7.3
7.4
7.5
7.6
7.7
7.8
7.9
UNIDADE 11 11.1
UNIDADE 10 10.1
10.2
10.3
10.4
10.5
UNIDADE 9 9.1
9.2
9.3
9.4
9.5
UNIDADE 8 8.1
8.2
8.3
8.4
8.5
8.6
CRIANDO NDICES......................................................................................................................................... 87
Unidade 1 -
SQL
Banco de Dados II
GO
Os utilitrios do SQL Server interpretam GO como um sinal para enviar o lote atual de instrues
Transact-SQL para o SQL Server. O comando GO define os lotes de instrues Transact-SQL
para ferramentas e utilitrios e finaliza o lote. Esse comando no uma instruo Transact-SQL
real.
Ao usar o comando GO, considere estes fatos:
O lote atual composto de todas as instrues inseridas desde o ltimo comando GO ou desde o
incio da sesso ad hoc (ou script, se esse for o primeiro GO).
Uma instruo Transact-SQL no pode ocupar o mesmo registro que um comando GO, embora o
registro possa conter comentrios.
Os usurios devem seguir as regras referentes a lotes. Por exemplo, algumas instrues de DDL
devem ser executadas isoladamente de outras instrues Transact-SQL, separando-as com um
comando GO.
O escopo das variveis locais (definidas pelo usurio) limitado a um lote e no possvel fazer
referncia a ele depois de um comando GO.
GO no uma instruo Transact-SQL real; GO usado para definir os lotes para ferramentas e
utilitrios.
EXEC
A diretiva EXEC usada para executar uma funo definida pelo usurio, um procedimento do
sistema, um procedimento armazenado definido pelo usurio ou um procedimento armazenado
estendido; ela tambm pode controlar a execuo de uma seqncia de caracteres em um lote do
Transact-SQL. Parmetros podem ser passados como argumentos e um status de retorno pode
ser atribudo.
1.4 Comentrios
Comentrios so seqncias de texto no executveis inseridas em instrues para descrever a
ao ou desativar uma ou mais linhas da instruo. Eles podem ser usados de duas maneiras. Em
linha com uma instruo ou como um bloco.
Comentrios em linha
possvel criar comentrios em linha usando dois hifens (--) para isol-los da instruo. O
Transact-SQL ignora o texto posicionado direita dos caracteres de comentrio. Esses caracteres
de comentrio tambm podem ser usados para desativar linhas de uma instruo.
Banco de Dados II
Este exemplo usa um comentrio em linha para impedir a execuo de uma seo de uma
instruo.
USE northwind
SELECT productname
, (unitsinstock - unitsonorder) -- Calcula o inventrio
-- , supplierid
FROM products
GO
Comentrios em bloco
possvel criar blocos de comentrios de vrias linhas, inserindo um caractere de comentrio (/*)
no incio do texto do comentrio, digitando o comentrio e concluindo-o com um caractere de
encerramento de comentrio (*/). Use esse caractere indicativo para criar uma ou mais linhas de
comentrios ou cabealhos de comentrios. Texto descritivo que documenta as instrues
subseqentes. Geralmente, os cabealhos incluem o nome do autor, a data de criao e da ltima
modificao do script, informaes sobre a verso e uma descrio da ao executada pela
instruo.
Este exemplo apresenta um cabealho de comentrio que ocupa vrias linhas.
/*
Este cdigo recupera todas as linhas da tabela products e
exibe o preo unitrio, o preo unitrio aumentado
Banco de Dados II
1.5 Identificadores
O SQL Server fornece uma srie de regras de nomeao padro para identificadores de objetos e
um mtodo de uso de delimitadores para identificadores que no sejam padro. Sempre que
possvel, procure atribuir nomes aos objetos empregando os caracteres de identificadores padro.
Identificadores padro
Os identificadores padro podem conter de 1 a 128 caracteres, inclusive letras, smbolos (_, @ ou
#) e nmeros. No so permitidos espaos incorporados.
Examine a seguir as regras para usar identificadores:
Banco de Dados II
Um identificador que inicie com um sinal de tralha (#) indica um procedimento ou uma
tabela temporria.
Um identificador que inicie com um sinal de tralha duplo (##) indica um objeto temporrio
global.
Identificadores delimitados
Se um identificador atender a todas as regras de formato de identificadores, poder ser utilizado
com ou sem delimitadores. Se um identificador no atender a uma ou mais regras de formato de
identificadores, dever ser sempre delimitado.
Os identificadores delimitados podem ser usados nas seguintes situaes:
Quando forem utilizadas palavras reservadas como nomes de objetos ou partes de nomes
de objetos
Banco de Dados II
Numbers
Este tipo de dados representa valores numricos e inclui inteiros, como int, tinyint, smallint e bigint.
Ele tambm inclui valores decimais precisos, como numeric, decimal, money e smallmoney, e
valores de ponto flutuante, como float e real.
Dates
Este tipo de dados representa datas ou perodos de tempo. Os dois tipos de dados de data so
datetime, cuja preciso de 3,33 milissegundos, e smalldatetime, cuja preciso de intervalos de
1 minuto.
Characters
Este tipo de dados usado para representar seqncias ou dados de caractere e inclui tipos de
dados de seqncia de tamanho fixo, como char e nchar, e de tamanho varivel, como varchar e
nvarchar.
Banco de Dados II
Binary
Este tipo de dados muito semelhante aos tipos de dados de caractere em termos de
armazenamento e estrutura, porm o contedo dos dados tratado como uma srie de valores de
bytes. Os tipos de dados binary incluem binary e varbinary. O tipo de dados bit indica um valor de
bit nico igual a zero ou um.
O tipo de dados rowversion indica um valor binrio especial de 8 bytes que exclusivo em um
banco de dados.
Unique Identifiers
Este tipo especial de dados um uniqueidentifier que representa um identificador global exclusivo
(GUID), o qual um valor hexadecimal de 16 bytes que deve ser sempre exclusivo.
SQL Variants
Este tipo de dados pode representar valores de vrios tipos de dados para os quais h suporte no
SQL Server, com exceo de text, ntext, image, timestamp e rowversion.
Image e Text
Estes tipos de dados so estruturas objeto binrio extenso (BLOB) que representam tipos de
dados de tamanho fixo e varivel para o armazenamento de dados binrios e de caractere
Unicode e no-Unicode grandes, como image, text e ntext.
Tables
Este tipo de dados pode ser usado apenas para definir variveis locais de tipo de tabela ou o valor
de retorno de uma funo definida pelo usurio.
Cursors
Este tipo de dados usado para programao em procedimentos armazenados e com interfaces
de cliente de baixo nvel. Ele nunca usado como parte de uma instruo de DDL.
Banco de Dados II
1.7 Variveis
Variveis so elementos da linguagem com valores atribudos. Voc pode usar variveis locais no
Transact-SQL.
Uma varivel local definida pelo usurio na instruo DECLARE, recebe um valor inicial atravs
da instruo SET ou SELECT e usada na instruo, lote ou procedimento em que foi declarada.
O escopo da varivel local tem durao do lote em que definido. A varivel local precedida de
um smbolo @.
Os nomes de variveis precedidos de dois smbolos @ representam um tipo de funo.
Consulte Transact SQL Reference, Functions na guia Contents (Contedo) do Books Online
(Livros on-line) do SQL Server para obter mais informaes.
DECLARE {@varivel_local tipo_de_dados} [,...n]
SET @nome_da_varivel_local = expresso
Este exemplo cria as variveis locais @EmpID e @vlname, atribui um valor a @vlname e atribui
um valor a @EmpID consultando o banco de dados Northwind para selecionar o registro que
contm o valor da varivel @vlname.
USE northwind
DECLARE
@EmpID
varchar(11)
,@vlName char(20)
SET @vlname = 'Dodsworth'
SELECT @EmpID = employeeid
FROM employees
WHERE LastName = @vlname
SELECT @EmpID AS EmployeeID
GO
10
Banco de Dados II
O Transact-SQL dispe de vrias funes que retornam informaes. Algumas funes recebem
os parmetros de entrada e retornam valores que podem ser utilizados em expresses. Outras
apenas retornam valores sem exigir entrada. A linguagem de programao Transact-SQL fornece
muitos tipos de funes. Estes so os trs tipos de funes com os quais voc deve estar
familiarizado:
Agem sobre o conjunto de valores de uma coluna selecionada em um conjunto de resultados, mas
retornam um valor individual e de resumo.
O exemplo a seguir calcula a mdia da coluna unitprice (preos unitrios) para todos os produtos
da tabela products.
USE northwind
SELECT AVG(unitprice) AS AvgPrice
FROM products
GO
Retornam um valor individual que opera a partir de nenhum ou de diversos valores escalares
individuais. possvel utilizar essas funes sempre que houver uma expresso. As funes
escalares podem ser agrupadas nas seguintes categorias.
Configurao - Retorna informaes sobre a configurao atual.
Cursor - Retorna informaes sobre cursores.
Data e hora - Efetua uma operao sobre um valor inserido de data e hora e retorna um valor de
seqncia, numrico ou de data e hora.
Matemtica - Efetua um clculo com base em valores inseridos como parmetros para a funo e
retorna um valor numrico.
Metadados - Retorna informaes sobre o banco de dados e os objetos do banco de dados.
Segurana - Retorna informaes sobre usurios e cargos.
Seqncia de caracteres - Efetua uma operao sobre um valor inserido de seqncia (char ou
varchar) e retorna um valor de seqncia de caracteres ou numrico.
Sistema - Efetua operaes e retornam informaes sobre valores, objetos e configuraes no
SQL Server.
Estatstica do sistema - Retorna informaes estatsticas sobre o sistema.
Texto e imagem - Efetua uma operao sobre um valor inserido de texto ou
imagem ou sobre uma coluna, e retorna informaes sobre o valor.
11
Banco de Dados II
Este exemplo de funo de metadados retorna o nome do banco de dados em uso no momento.
USE northwind
SELECT DB_NAME() AS 'database'
GO
Podem ser usadas como referncias de tabela em uma instruo Transact-SQL.
O exemplo a seguir executa uma consulta distribuda para recuperar informaes da tabela titles
(ttulos). Observe que esse exemplo no ser executado corretamente sem o acesso a um banco
de dados Oracle. O SQL Server ir gerar uma mensagem para esse efeito.
SELECT *
FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM owner.titles')
GO
12
Banco de Dados II
Este exemplo utiliza a opo DATEFORMAT da instruo SET para formatar datas para a durao
de uma conexo. Essa configurao usada somente na interpretao de seqncias de
caracteres medida que elas so convertidas em valores de data. Ela no afeta a exibio dos
valores de data.
SET DATEFORMAT dmy
GO
DECLARE @vdate datetime
SET @vdate = '11/29/98'
SELECT @vdate
GO
Este exemplo retorna o nome do usurio atual e o aplicativo que o usurio est utilizando para a
sesso ou conexo atual. Neste exemplo, o usurio membro do cargo sysadmin.
USE library
SELECT user_name(), app_name()
GO
Este exemplo determina se a coluna firstname (nomes) da tabela member (membros) do banco de
dados library permite valores nulos.
Um resultado igual a zero (falso) significa que no so permitidos valores nulos e um resultado
igual a 1 (verdadeiro) significa que so permitidos valores nulos.
Observe que a funo OBJECT_ID est incorporada funo COLUMNPROPERTY. Isso permite
obter a object id da tabela member.
USE library
SELECT COLUMNPROPERTY(OBJECT_ID('member'), 'firstname', 'AllowsNull')
GO
1.9 Operadores
Operadores so smbolos que efetuam clculos matemticos, concatenaes de seqncias de
caracteres e comparaes entre colunas, constantes e variveis. possvel combinar e utilizar os
13
Banco de Dados II
Tipos de operadores
O SQL Server oferece suporte para quatro tipos de operadores: aritmticos, de comparao, de
concatenao de seqncias de caracteres e lgicos.
Aritmtico
Os operadores aritmticos efetuam clculos com colunas ou constantes numricas. O TransactSQL dispe de suporte para operadores multiplicativos, incluindo multiplicao (*), diviso (/) e
mdulo (%) . o resto inteiro de uma diviso de inteiros . e operadores aditivos, de adio (+) e
subtrao (-).
Comparao
Os operadores de comparao comparam duas expresses. possvel efetuar comparaes entre
variveis, colunas e expresses semelhantes. Voc encontrar os operadores a seguir.
= Igual a
> Maior que
< Menor que
>= Maior ou igual a
<= Menor ou igual a
<> Diferente de
14
Banco de Dados II
Lgico
Os operadores lgicos AND, OR e NOT conectam condies de pesquisa em clusulas WHERE.
Nveis de precedncia dos operadores
Se voc utilizar vrios operadores (lgicos ou aritmticos) para combinar expresses, o SQL
Server processar os operadores na respectiva ordem de precedncia, o que pode afetar o valor
resultante. Os operadores tm os seguintes nveis de precedncia (do superior para o inferior).
Agrupamento Agrupamento primrio ( )
Aritmtico Multiplicativo * / %
Aritmtico Aditivo - +
Outros Concatenao de
seqncias de caracteres
+
Lgico NOT NOT
Lgico AND AND
Lgico OR OR
O SQL Server trata primeiramente da expresso com o agrupamento mais interno. Alm disso, se
todos os operadores aritmticos em uma expresso compartilharem o mesmo nvel de
precedncia, a ordem ser da esquerda para a direita.
Os nveis de precedncia dos operadores lgicos no SQL Server so diferentes dos de outras
linguagens de programao.
1.10 Expresses
As expresses so uma combinao de smbolos e operadores que so avaliados como um valor
de dados nico.
15
Banco de Dados II
Elas podem ser simples, como uma constante, varivel, coluna ou valor escalar. Ou expresses
complexas criadas conectando-se uma ou mais expresses simples com operadores.
O tipo de dados do resultado depende dos elementos contidos na expresso. As converses
implcitas de tipos de dados so freqentemente executadas nos elementos da expresso durante
a avaliao.
O exemplo a seguir calcula o valor total de um produto em um pedido multiplicando o preo
unitrio pela quantidade solicitada; depois, filtra os resultados para que os nicos registros
retornados sejam os pedidos com produtos cujo valor total seja maior do que $ 10.000,00.
USE
northwind
SELECT
OrderID, ProductID
,(UnitPrice * Quantity) as ExtendedAmount
Nvel de instruo
Os elementos da linguagem a seguir permitem que voc controle o fluxo da lgica em um script:
Estes elementos iniciam e encerram uma seqncia de instrues Transact-SQL para que sejam
tratadas como uma unidade.
Estes elementos especificam que o SQL Server deve executar a primeira alternativa se
determinada condio for verdadeira. Caso contrrio, o SQL Server dever executar a segunda
alternativa.
Esses elementos executam uma instruo vrias vezes, enquanto a condio especificada for
verdadeira. As instrues BREAK e CONTINUE controlam a operao das instrues dentro de
um loop WHILE.
16
Banco de Dados II
Este exemplo determina se um cliente possui algum pedido, antes de exclu-lo da lista de clientes.
USE northwind
IF EXISTS (SELECT * FROM orders
WHERE customerid = 'frank')
PRINT '*** Cliente no pode ser excludo ***'
ELSE
BEGIN
DELETE customers WHERE customerid = 'frank'
PRINT '*** Cliente foi excludo ***'
END
GO
Nvel de registro
Uma funo CASE lista atributos, atribui um valor a cada atributo e testa cada um deles. Se a
expresso na clusula WHEN retornar um valor verdadeiro, a funo CASE retornar a expresso
na clusula THEN. Se a expresso for falsa e voc tiver especificado uma clusula ELSE, o SQL
Server retornar o valor na clusula ELSE. Use uma funo CASE em qualquer local vlido para
uma expresso.
CASE expresso
{WHEN expresso THEN resultado}
[,.n]
[ELSE resultado]
END
O exemplo a seguir declara uma varivel local, verifica se ela igual a 4, 5 ou 6 e, em caso
afirmativo, percorre um loop WHILE que determina se o valor atual um nmero mpar ou par.
DECLARE @n tinyint
SET
@n = 5
17
Banco de Dados II
BEGIN
SELECT
@n AS 'Nmero'
,CASE
WHEN (@n % 2) = 1
THEN 'MPAR'
ELSE 'PAR'
END AS 'Tipo'
SET @n = @n - 1
END
END
ELSE
PRINT 'SEM ANLISE'
GO
Palavras-chave reservadas
O SQL Server reserva certas palavras-chave para seu uso exclusivo. Por exemplo, o uso da
palavra-chave DUMP ou BACKUP em uma sesso do SQL Query Analyzer (Analisador de
consultas do SQL) ou do osql instrui o SQL Server a fazer uma cpia de backup de todo ou parte
de um banco de dados ou do log.
Voc no pode incluir palavras-chave reservadas em nenhum local de uma instruo TransactSQL, exceto onde definido pelo SQL Server. Voc deve evitar nomear um objeto com uma
palavra-chave reservada. Se o nome de um objeto coincidir com uma palavra-chave, voc dever
coloc-lo entre identificadores de delimitao, como aspas ou colchetes [ ], sempre que fizer
referncia ao objeto.
Os cargos de administrador do banco de dados e de administrador de sistema, ou o criador do
banco de dados, so normalmente responsveis pela verificao das palavras-chave reservadas
em nomes de bancos de dados e instrues Transact-SQL.
possvel construir instrues Transact-SQL sintaticamente corretas que podem ser compiladas e
analisadas com xito, mas que ainda retornam um erro de tempo de execuo ao serem
executadas. Recomenda-se no usar palavras-chave reservadas.
18
Banco de Dados II
Laboratrio
Para realizar os exerccios deste material, baixe gratuitamente o banco de dados de exemplo
NorthWind do site da Microsoft.
1- Declare uma varivel para receber um valor numrico. Crie uma consulta que mostre as
vendas (order) que esto a mdia est acima desta varivel
2- Calcule a soma das compras de cada cliente. Se metade do maior valor de um produto for
menor que mdia exibir maior, se no exibir menor
3- Converta as datas das vendas para o formato dd-mm-aaaa e mostre a diferena entre as
datas de pedido (RequiredDate) e data de envio (ShippedDate)
4- Mostre a maior venda de cada categoria de cada produto
5- Mostre a menor venda de cada cliente separado por anos e meses
6- Declare duas variveis e realize as quatro operaes matemticas bsicas
7- Exiba as Regies dos empregados mostrando a mdia de vendas de cada categoria
8- Exiba a mdia de produtos vendidos por fornecedor
9- Crie um lao que inicie no menor valor de um produto e termine no menor. Em cada passo
deste lao deve ser exibido o nome do produto com este valor ou exibir a mensagem Sem
produto neste valor
10- Calcule a diferena entre as datas da ultima e penltima compra de cada cliente
19
Banco de Dados II
Unidade 2 -
Implementando Views
20
Banco de Dados II
Melhorar o desempenho
As views permitem que voc armazene os resultados de consultas complexas. Outras consultas
podem usar esses resultados resumidos. As views tambm permitem o particionamento dos
dados. Voc pode colocar parties individuais em computadores separados.
21
Banco de Dados II
Voc pode criar views usando o Create View Wizard (Assistente para criao de views), o SQL
Server Enterprise Manager (Gerenciador corporativo do SQL Server) ou o Transact-SQL. As views
s podem ser criadas no banco de dados atual.
22
Banco de Dados II
A instruo CREATE VIEW no pode ser combinada com outras instrues Transact-SQL
em um nico lote.
Este um exemplo de view que cria uma coluna (Subtotal) (Subtotal), que calcula os subtotais de
um pedido com base nas colunas UnitPrice (Preo unitrio), Quantity (Quantidade) e Discount
(Desconto).
USE Northwind
GO
CREATE VIEW dbo.OrderSubtotalsView (OrderID, Subtotal)
AS
SELECT OD.OrderID,
SUM(CONVERT
(money,(OD.UnitPrice*Quantity*(1-Discount)/100))*100)
FROM [Order Details] OD
GROUP BY OD.OrderID
GO
23
Banco de Dados II
Alterando views
A instruo ALTER VIEW altera a definio de uma view, incluindo views indexadas, sem afetar os
disparadores ou procedimentos armazenados dependentes. Isso permite manter as permisses da
view. Essa instruo est sujeita s mesmas restries que a instruo CREATE VIEW. Se
descartar uma view e cri-la novamente, voc dever reatribuir permisses a ela.
24
Banco de Dados II
Descartando views
Se no precisar mais de uma view, voc poder remover sua definio do banco de dados
executando a instruo DROP VIEW. Ao descartar uma view, voc remove sua definio e todas
as permisses atribudas a ela. Alm disso, se os usurios consultarem qualquer view que faa
referncia view descartada, eles recebero uma mensagem de erro. No entanto, descartar uma
tabela que faa referncia a uma view no descarta automaticamente a view. Voc deve descartla explicitamente.
A permisso para descartar uma view atribuda ao proprietrio da view e intransfervel. Esse
o padro. No entanto, o administrador do sistema ou o proprietrio do banco de dados pode
descartar qualquer objeto especificando o nome do proprietrio na instruo DROP VIEW.
25
Banco de Dados II
Como os usurios podem exibir a definio de uma view usando o SQL Server Enterprise
Manager, consultando INFORMATION_SCHEMA.VIEWS ou consultando a tabela do sistema
syscomments, talvez voc deseje ocultar certas definies de views.
26
Banco de Dados II
As views no mantm uma cpia separada dos dados. Em vez disso, elas mostram o conjunto de
resultados de uma consulta em uma ou mais tabelas base. Portanto, sempre que voc modifica
dados em uma view, a tabela base que realmente modificada.
Com algumas restries, voc poder inserir, atualizar ou excluir livremente dados de tabelas
atravs de uma view. Em geral, a view deve ser definida em uma nica tabela e no deve incluir
funes agregadas ou clusulas GROUP BY na instruo SELECT.
Especificamente, as modificaes feitas com o uso de views:
No podem afetar mais de uma tabela subjacente. Voc pode modificar views derivadas de
duas ou mais tabelas, mas cada atualizao ou modificao pode afetar apenas uma
tabela.
O SQL Server no permite que voc altere uma coluna que seja o resultado de um clculo,
como as colunas que contm valores calculados, funes internas ou funes agregadas
de registros.
Por exemplo, voc receber uma mensagem de erro se inserir em uma view um registro
que esteja definido em uma tabela com colunas s quais a view no faz referncia e que
no permitem NULLs nem contm valores padro.
Sero verificadas se a opo WITH CHECK OPTION tiver sido especificada na definio
da view.
A opo WITH CHECK OPTION fora todas as instrues de modificao de dados que so
executadas na view a obedecer a certos critrios. Esses critrios so especificados na instruo
SELECT que define a view. Se os valores alterados estiverem fora do intervalo da definio da
view, o SQL Server rejeitar as modificaes.
Esta seo descreve as consideraes sobre o desempenho para o uso de views e como as views
permitem aperfeioar o desempenho atravs do armazenamento dos resultados de consultas
complexas e do particionamento dos dados.
27
Banco de Dados II
Quando views que associam diversas tabelas e avaliam expresses complexas so aninhadas
dentro de outra view, poder ser difcil determinar a origem imediata de qualquer problema de
desempenho. Portanto, convm considerar a criao de definies de views separadas, em vez de
aninhar views.
No exemplo a seguir, TopSalesView consulta um subconjunto de registros de TotalPurchaseView.
USE Northwind
GO
CREATE VIEW dbo.TopSalesView
AS
SELECT *
FROM dbo.TotalPurchaseView
WHERE Subtotal > 50000
GO
A definio de view dbo.TopSalesView oculta a complexidade da consulta subjacente usada para
criar TotalPurchaseView, que associa trs tabelas base.
USE Northwind
GO
CREATE VIEW dbo.TotalPurchaseView
AS
SELECT CompanyName, Sum(CONVERT(money,
(UnitPrice*Quantity*(1-Discount)/100))*100) AS Subtotal
FROM Customers c INNER JOIN Orders o
ON c.CustomerID=o.CustomerID
INNER JOIN [Order Details] od
ON o.OrderID = od.OrderID
GROUP BY CompanyName
GO
28
Banco de Dados II
29
Banco de Dados II
O primeiro ndice criado em uma view deve ser um ndice de agrupamento exclusivo.
Voc deve usar nomes de duas partes para fazer referncia a tabelas e funes definidas
pelo usurio.
Voc deve usar a propriedade IsIndexable da funo OBJECTPROPERTY para certificarse de que possa indexar uma view.
As prticas recomendadas a seguir devem ajud-lo a usar e gerenciar views em seus bancos de
dados:
Voc deve desenvolver uma conveno de nomeao consistente para fazer a distino entre
views e tabelas.
Especifique dbo como o proprietrio quando criar views. O dbo deve ser proprietrio de todos os
objetos aos quais a definio de view faz referncia. Isso torna desnecessrio especificar o nome
do proprietrio quando voc consulta a view porque o proprietrio do banco de dados o
proprietrio padro. O proprietrio do banco de dados tambm tem permisso em todos os objetos
subjacentes do banco de dados, evitando, assim, possveis cadeias de propriedades
interrompidas.
Verifique as dependncias dos objetos antes de descart-los do banco de dados. Execute o
procedimento armazenado do sistema sp_depends ou exiba as dependncias no SQL Server
Enterprise Manager para certificar-se de que no existam dependncias de um objeto que voc
planeja descartar.
Nunca exclua entradas da tabela do sistema syscomments. Se o seu aplicativo exigir que a
definio no esteja visvel para outras pessoas, inclua a opo WITH ENCRYPTION com a
instruo CREATE VIEW ou ALTER VIEW. Certifique-se de salvar a definio do script antes de
criptograf-lo.
30
Banco de Dados II
Avalie cuidadosamente se voc deve criar views baseadas em views. Elas podem ocultar
complexidades e poderiam ser a origem de problemas de desempenho.
Laboratrio
Crie as seguintes vises:
1- Mostrando a mdia de dias entre as compras por cliente
2- Mostrando para quantos clientes cada vendedor atende por dia
3- Mostrando o produto mais vendido por ms
4- Mostrando a quantidade mdia de cada produto por cliente
5- Mostrando a mdia de produtos de cada fornecedor por cliente
6- Mostre o percentual de diferena entre a mdia e o maior valor de compra por cliente
7- Mostre a diferena entre o maior e menor valor por regio
8- Criptografe a viso que mostre o maior valor de item de cada compra
9- Calcule a diferena de dias entre a primeira e a ultima compra por vendedor
10- Mostre a quantos dias cada produto no vendido
31
Banco de Dados II
32
Banco de Dados II
Criao
Quando um procedimento armazenado criado, as instrues que ele contm so analisadas para
verificar sua preciso sinttica. Depois, o SQL Server armazena o nome do procedimento
armazenado na tabela do sistema sysobjects (objetos do sistema) e seu texto na tabela do sistema
syscomments (comentrios do sistema), dentro do banco de dados atual. Ser retornado um erro
se for encontrado um erro de sintaxe, e o procedimento armazenado no ser criado.
33
Banco de Dados II
Otimizao
Quando um procedimento armazenado passa com xito pelo estgio de resoluo, o otimizador de
consultas do SQL Server analisa as instrues
Transact-SQL do procedimento e cria um plano que contm o mtodo mais rpido de acesso aos
dados. Para fazer isso, ele leva em considerao:
A presena e a natureza dos ndices da tabela e a distribuio dos dados nas colunas
indexadas.
Compilao
A compilao diz respeito ao processo de anlise do procedimento armazenado e de criao de
um plano de execuo que armazenado no cache de procedimentos. Esse cache contm os
planos de execuo de procedimentos armazenados mais importantes. Alguns dos fatores que
aumentam o valor de um plano de execuo incluem:
Uso freqente.
34
Banco de Dados II
35
Banco de Dados II
Voc poder criar um procedimento armazenado somente no banco de dados atual com
exceo de procedimentos armazenados temporrios, que so sempre criados no banco de dados
tempdb. A criao de um procedimento armazenado semelhante criao de uma view. Em
primeiro lugar, escreva e teste as instrues Transact-SQL que voc deseja incluir no
procedimento armazenado. Depois, se receber os resultados esperados, crie o procedimento
armazenado.
36
Banco de Dados II
Se um procedimento armazenado criar uma tabela temporria local, essa tabela s existir
em funo do procedimento e desaparecer aps ele ser executado.
Uma instruo CREATE PROCEDURE no pode ser combinada com outras instrues
SQL em um nico lote.
Para executar a instruo CREATE PROCEDURE, voc dever ser participante do cargo
administradores do sistema (sysadmin), do cargo proprietrio do banco de dados
(db_owner) ou do cargo administrador da Data Definition Language (DDL, linguagem de
definio de dados) (db_ddladmin), ou ter a permisso CREATE PROCEDURE.
Sintaxe
CREATE PROC[EDURE] nome_do_procedimento [;nmero]
[{@parmetro tipo de dados}
[VARYING] [= padro] [OUTPUT]
][,...n]
[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}]
[FOR REPLICATION]
AS
instruo_sql [...n]
As instrues a seguir criam um procedimento armazenado que lista todos os pedidos vencidos no
banco de dados Northwind.
37
Banco de Dados II
USE Northwind
GO
CREATE PROC dbo.OverdueOrders
AS
SELECT *
FROM dbo.Orders
WHERE RequiredDate < GETDATE() AND ShippedDate IS Null
GO
Voc tambm deve ter as permisses apropriadas em todas as tabelas ou views s quais o
procedimento armazenado faz referncia.
38
Banco de Dados II
Crie, teste e depure seu procedimento armazenado no servidor; depois, teste-o no cliente.
Voc pode executar um procedimento armazenado isoladamente ou como parte de uma instruo
INSERT. necessrio ter a permisso EXECUTE no procedimento armazenado.
39
Banco de Dados II
40
Banco de Dados II
SELECT
UPPER(SUBSTRING(lastname, 1, 4)+SUBSTRING(FirstName, 1,1)),
'Northwind Traders', RTRIM(FirstName)+' '+LastName,
'Employee', Address, City, Region, PostalCode, Country,
('(206) 555-1234'+' x'+Extension), NULL
FROM Employees
WHERE HireDate = GETDATE ()
GO
As instrues a seguir executam o procedimento armazenado EmployeeCustomer.
INSERT INTO Customers
EXEC EmployeeCustomer
O nmero de funcionrios contratados na data de hoje adicionado tabela
41
Banco de Dados II
42
Banco de Dados II
Voc deve fornecer valores padro apropriados para um parmetro. Se for definido um
padro, os usurios podero executar o procedimento armazenado sem especificar um
valor para esse parmetro.
43
Banco de Dados II
O exemplo a seguir cria o procedimento armazenado Year to Year Sales, que retorna todas as
vendas entre as datas especficas.
CREATE PROCEDURE dbo.[Year to Year Sales]
@BeginningDate DateTime, @EndingDate DateTime
AS
IF @BeginningDate IS NULL OR @EndingDate IS NULL
BEGIN
RAISERROR('NULL values are not allowed', 14, 1)
RETURN
END
SELECT O.ShippedDate,
O.OrderID,
OS.Subtotal,
DATENAME(yy,ShippedDate) AS Year
FROM ORDERS O INNER JOIN [Order Subtotals] OS
ON O.OrderID = OS.OrderID
WHERE O.ShippedDate BETWEEN @BeginningDate AND @EndingDate
GO
44
Banco de Dados II
45
Banco de Dados II
O exemplo a seguir passa valores por nome de parmetro para o procedimento armazenado
AddCustomer. Observe que a ordem dos valores diferente da instruo CREATE PROCEDURE.
Observe, tambm, que os valores dos parmetros @Region e @Fax no so especificados. Se as
colunas Region (Regio) e Fax na tabela permitirem valores nulos, o procedimento armazenado
AddCustomer ser executado com xito. No entanto, se as colunas Region e Fax no permitirem
valores nulos, voc deve passar um valor para um parmetro, independentemente de voc ter
definido o parmetro para permitir um valor nulo.
EXEC AddCustomer
@CustomerID = 'ALFKI',
@ContactName = 'Maria Anders',
@CompanyName = 'Alfreds Futterkiste',
@ContactTitle = 'Sales Representative',
@Address = 'Obere Str. 57',
@City = 'Berlin',
@PostalCode = '12209',
@Country = 'Germany',
@Phone = '030-0074321'
46
Banco de Dados II
A passagem somente de valores (sem uma referncia aos parmetros para os quais eles esto
sendo passados) denominada passagem de valores por posio. Quando voc especifica
somente um valor, os valores dos parmetros devem ser listados na ordem em que esto definidos
na instruo CREATE PROCEDURE.
Ao passar valores por posio, voc poder omitir os parmetros quando existirem padres, mas
no poder interromper a seqncia. Por exemplo, se um procedimento armazenado tiver cinco
parmetros, voc poder omitir o quarto e o quinto parmetros, mas no poder omitir o quarto
parmetro e especificar o quinto.
O script a seguir passa valores por posio para o procedimento armazenado AddCustomer.
Observe que os parmetros @Region e @Fax no tm valores.
No entanto, somente o parmetro @Region fornecido com NULL. O parmetro @Fax omitido
porque ele o ltimo parmetro.
EXEC AddCustomer 'ALFKI2', 'Alfreds Futterkiste', 'Maria
Anders', 'Sales Representative', 'Obere Str. 57', 'Berlin',
NULL, '12209', 'Germany', '030-0074321'
47
Banco de Dados II
Este exemplo cria um procedimento armazenado MathTutor que calcula o produto de dois
nmeros. Este exemplo usa a instruo SET. No entanto, voc tambm pode usar a instruo
SELECT para concatenar uma seqncia dinamicamente. Uma instruo SET requer que voc
declare uma varivel para imprimir a seqncia The result is:
CREATE PROCEDURE dbo.MathTutor
@m1 smallint,
@m2 smallint,
@result smallint OUTPUT
AS
SET @result = @m1* @m2
GO
Este lote chama o procedimento armazenado MathTutor e passa os valores de 5 e 6. Esses
valores se tornam variveis, que so fornecidas na instruo SET.
DECLARE @answer smallint
EXECUTE MathTutor 5,6, @answer OUTPUT
SELECT 'The result is:', @answer
O parmetro @result designado com a palavra chave OUTPUT. O SQL Server imprime o
contedo da varivel @result quando voc executa o procedimento armazenado MathTutor. A
varivel do resultado definida como o produto de dois valores, 5 e 6.
48
Banco de Dados II
O valor do parmetro fornecido atpico. O SQL Server fornece trs mtodos para a
recompilao explcita de um procedimento armazenado.
EXECUTE...[WITH RECOMPILE]
A instruo EXECUTE...[WITH RECOMPILE] cria um novo plano de execuo cada vez que o
procedimento executado, se voc especificar WITH RECOMPILE. O novo plano de execuo
no colocado no cache. Use essa opo se o parmetro que voc est passando for muito
diferente dos que geralmente so passados para o procedimento armazenado. Como esse plano
otimizado uma exceo e no a regra, quando a execuo for concluda, voc dever executar
novamente o procedimento armazenado com um parmetro que seja passado normalmente. Essa
opo tambm ser til se os dados tiverem sido significativamente alterados desde que o
procedimento armazenado foi compilado pela ltima vez. Este exemplo recompila o procedimento
armazenado do sistema sp_help no momento em que ele executado.
49
Banco de Dados II
sp_recompile
O procedimento armazenado do sistema sp_recompile recompila o procedimento armazenado do
sistema ou disparador especificado na prxima vez que ele executado. Se o parmetro
@objname especificar uma tabela ou view, todos os procedimentos armazenados que usam o
objeto designado sero recompilados na prxima vez que forem executados.
Use o procedimento armazenado do sistema sp_recompile com a opo nome_da_tabela se tiver
adicionado um novo ndice a uma tabela subjacente qual o procedimento armazenado faa
referncia e se acreditar que o desempenho do procedimento armazenado poder melhorar com o
novo ndice.
Este exemplo recompila todos os procedimentos armazenados ou disparadores que fazem
referncia tabela Customer do banco de dados Northwind.
EXEC sp_recompile Customers
Voc pode usar DBCC FREEPROCCACHE para desmarcar todos os planos de procedimentos
armazenados do cache.
Para tornar os procedimentos armazenados mais eficazes, voc deve incluir mensagens de erro
que comuniquem o status das transaes (xito ou falha) ao usurio. Voc dever executar a
lgica de negcios e da tarefa, bem como a verificao de erro, antes de iniciar as transaes, e
mant-las curtas. Voc pode usar estratgias de codificao, como verificaes de existncia, para
o reconhecimento de erros. Quando ocorrer um erro, fornea o mximo de informaes ao cliente.
Voc pode verificar os elementos a seguir em sua lgica de tratamento de erros: cdigos de
retorno, erros do SQL Server e mensagens de erro personalizadas.
50
Banco de Dados II
Instruo RETURN
A instruo RETURN sai de uma consulta ou procedimento armazenado de modo no condicional.
Ela tambm pode retornar um valor inteiro de status (cdigo de retorno). Um valor de retorno 0
indica xito. Os valores de retorno de 0 a -14 esto em uso no momento e os valores de retorno de
-15 a -99 esto reservados para uso futuro. Se um valor de retorno definido pelo usurio no for
fornecido, o valor do SQL Server ser usado. Os valores de retorno definidos pelo usurio sempre
prevalecem sobre os fornecidos pelo SQL Server.
Este exemplo cria o procedimento armazenado GetOrders que recupera informaes das tabelas
Orders e Customers consultando a view Orders Qry. A instruo RETURN do procedimento
armazenado GetOrders retorna o nmero total de registros da instruo SELECT para outro
procedimento armazenado. Voc tambm poderia aninhar o procedimento armazenado GetOrders
em outro procedimento armazenado.
USE Northwind
GO
CREATE PROCEDURE dbo.GetOrders
@CustomerID nchar (10)
AS
SELECT OrderID, CustomerID, EmployeeID
FROM [Order Qry]
WHERE CustomerID = @CustomerID
RETURN (@@ROWCOUNT)
GO
sp_addmessage
Esse procedimento armazenado permite que os desenvolvedores criem mensagens de erro
personalizadas. O SQL Server trata as mensagens de erro do sistema e personalizadas da mesma
forma. Todas as mensagens so armazenadas na tabela sysmessages (mensagens do sistema)
do banco de dados master. Essas mensagens de erro tambm podem ser gravadas
automaticamente no log de aplicativos do Windows 2000. Este exemplo cria uma mensagem de
erro definida pelo usurio que requer que a mensagem seja gravada no log de aplicativos do
Windows 2000 quando ela ocorre.
51
Banco de Dados II
EXEC sp_addmessage
@msgnum = 50010,
@lang='US_English',
@severity = 10,
@msgtext = 'Customer cannot be deleted.',
@with_log = 'true'
@@error
Esta funo do sistema contm o nmero do erro referente instruo Transact- SQL executada
mais recentemente. Ela limpa e redefinida toda vez que uma instruo executada. Um valor
igual a 0 ser retornado se a instruo for executada com xito. Voc poder usar a funo do
sistema @@error para detectar um nmero de erro especfico ou para sair de um procedimento
armazenado de modo condicional.
Este exemplo cria o procedimento armazenado AddSupplierProduct no banco de dados Northwind.
Esse procedimento armazenado usa a funo do sistema @@error para determinar se ocorre um
erro toda vez que uma instruo INSERT executada. Se o erro ocorrer, a transao ser
revertida.
USE Northwind
GO
CREATE PROCEDURE dbo.AddSupplierProduct
@CompanyName nvarchar (40) = NULL,
@ContactName nvarchar (40) = NULL,
@ContactTitle nvarchar (40)= NULL,
@Address nvarchar (60) = NULL,
@City nvarchar (15) = NULL,
@Region nvarchar (40) = NULL,
@PostalCode nvarchar (10) = NULL,
@Country nvarchar (15) = NULL,
@Phone nvarchar (24) = NULL,
@Fax nvarchar (24) = NULL,
@HomePage ntext = NULL,
52
Banco de Dados II
53
Banco de Dados II
END
DECLARE @InsertSupplierID int
SELECT @InsertSupplierID=@@identity
INSERT Products (
ProductName,
SupplierID,
CategoryID,
QuantityPerUnit,
Discontinued)
VALUES (
@ProductName,
@InsertSupplierID,
@CategoryID,
@QuantityPerUnit,
@Discontinued)
IF @@error <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
COMMIT TRANSACTION
54
Banco de Dados II
Instruo RAISERROR
A instruo RAISERROR retorna uma mensagem de erro definida pelo usurio e define um
sinalizador do sistema para registrar a ocorrncia de um erro. Voc deve especificar um nvel de
gravidade do erro e o estado da mensagem quando estiver usando a instruo RAISERROR.
RAISERROR permite que o aplicativo recupere uma entrada da tabela do sistema
master..sysmessages (master..mensagens do sistema) ou crie dinamicamente uma mensagem
com as informaes de estado e gravidade especificadas pelo usurio. A instruo RAISERROR
pode gravar mensagens de erro no log de erros do SQL Server e no log de aplicativos do Windows
2000.
Este exemplo gera uma mensagem de erro definida pelo usurio e grava-a no log de aplicativos do
Windows 2000.
RAISERROR(50010, 16, 1) WITH LOG
A instruo PRINT retorna uma mensagem definida pelo usurio para o indicador de mensagem
do cliente; no entanto, ao contrrio da instruo RAISERROR, ela no armazena o nmero do erro
na funo do sistema @@error.
Siga este script medida que o instrutor demonstrar as tcnicas de tratamento de erros contidas
nele.
/* UpdateCustomerPhone
Atualiza o telefone de um cliente
A verificao de erros garante o fornecimento de um
nmero de identificao vlido
*/
/*
A mensagem definida pelo usurio a seguir oferece suporte ao
procedimento armazenado UpdateCustomerPhone */
EXEC sp_addmessage 50010, 16, 'CustomerID not found.',
55
Banco de Dados II
@replace='replace'
USE Northwind
GO
CREATE PROCEDURE UpdateCustomerPhone
@CustomerID nchar (5) = NULL,
@Phone nvarchar (24) = NULL
AS
IF @CustomerID IS NULL
BEGIN
PRINT 'You must supply a valid CustomerID'
RETURN
END
/* Certifique-se de que um cliente vlido seja fornecido */
IF NOT EXISTS
(SELECT * FROM Customers WHERE CustomerID = @CustomerID)
BEGIN
RAISERROR (50010, 16, 1) -Cliente no encontrado.
RETURN
END
BEGIN TRANSACTION
UPDATE Customers
SET Phone = @Phone
WHERE CustomerID = @CustomerID
/* Exibir mensagem informando que o telefone de CompanyName
foi atualizado */
SELECT 'The phone number for' + @CustomerID + 'has been
updated to' + @Phone
COMMIT TRANSACTION
GO
56
Banco de Dados II
Para escrever procedimentos armazenados mais eficazes e eficientes, siga estas prticas
recomendadas:
Execute a lgica de negcios e da tarefa, bem como a verificao de erros, antes de iniciar
as transaes. Mantenha suas transaes curtas.
Laboratrio
Crie os seguintes procedimentos:
1. Chamado ExcluirCliente que receba como parmetro o cdigo do cliente. Se ele comprou a
menos de 3 meses ele no deve ser apagado. Se no, ele deve ser apagado e transferido
os seus dados para uma tabela temporria.
2. Chamado VerificaEstoque que receba como parmetro o cdigo do produto e retorne em
quantos meses o estoque do produto vai acabar baseado na mdia de vendas do mesmo.
3. Chamado CadastrarCliente que receba todos os dados dos clientes, includo as tabelas
que o mesmo depende
4. Chamado AumentarPreco que receba o percentual de aumento e categoria dos produtos e
execute o referido aumento
5. Chamado CriaPromocao que receba o fabricante e o percentual de desconto, concedendo
o este percentual aos produtos deste fabricante
57
Banco de Dados II
Uma funo definida pelo usurio criada de maneira semelhante a uma view ou um
procedimento armazenado.
58
Banco de Dados II
59
Banco de Dados II
Restries s funes
As funes no-determinsticas so funes, como GETDATE(), que podem retornar valores de
resultado diferentes toda vez que so chamadas com o mesmo conjunto de valores de entrada.
No so permitidas funes no-determinsticas internas no corpo de funes definidas pelo
usurio. As seguintes funes internas so no-determinsticas.
60
Banco de Dados II
Alterando funes
Modifique uma funo definida pelo usurio usando a instruo ALTER FUNCTION.
Este exemplo mostra como alterar uma funo.
ALTER FUNCTION dbo.fn_NewRegion
<Novo contedo de funo>
Descartando funes
Descarte uma funo definida pelo usurio usando a instruo DROP FUNCTION.
Este exemplo mostra como descartar uma funo.
DROP FUNCTION dbo.fn_NewRegion
61
Banco de Dados II
RETURN
CONVERT(Nvarchar(20), datepart(mm,@indate))
+ @separator
+ CONVERT(Nvarchar(20), datepart(dd, @indate))
+ @separator
+ CONVERT(Nvarchar(20), datepart(yy, @indate))
END
Voc pode chamar uma funo escalar definida pelo usurio da mesma maneira que uma funo
interna.
SELECT dbo.fn_DateFormat(GETDATE(), ':')
62
Banco de Dados II
63
Banco de Dados II
64
Banco de Dados II
Use funes in-line para criar views usando parmetros. O uso de parmetros com funes
in-line poder simplificar as referncias a tabelas e views.
Use funes in-line para filtrar views. O uso de funes in-line com views indexadas poder
aumentar significativamente o desempenho.
Laboratrio
Crie as seguintes funes;
1. Chamada MenorVenda que receba um cdigo de cliente retorne a menor compra realizada
por ele
2. Chamada MaisVendido que receba um ms e retorne o nome do produto mas vendido no
referido ms
3. Chamada MelhorVendedor que receba um ms e retorne o cdigo do melhor vendedor do
referido
4. Chamada MaiorVenda que receba um cdigo de produto e retorna a data da maior venda
do mesmo
5. Chamada MelhorProduto que receba o cdigo do fornecedor e exiba qual o seu produto
mais vendido
65
Banco de Dados II
Unidade 5 -
Implementando Disparadores
Chamados automaticamente
Quando h uma tentativa de inserir, atualizar ou excluir dados em uma tabela, e um disparador
tiver sido definido na tabela para essa ao especfica, ele ser executado automaticamente. Ele
no poder ser ignorado.
66
Banco de Dados II
Voc deve minimizar ou evitar o uso de ROLLBACK TRANSACTION no cdigo de seu disparador.
A reverso de uma transao gera um trabalho adicional, pois todo o trabalho concludo at esse
ponto na transao precisa ser desfeito. Isso ter um impacto negativo no desempenho.
recomendado que as informaes sejam verificadas e validadas fora da transao. Inicie a
transao depois que tudo for verificado.
O usurio que chamou o disparador tambm deve ter permisso para executar todas as instrues
em todas as tabelas.
67
Banco de Dados II
Quando mais de um registro inserido, atualizado ou excludo, voc deve escrever um disparador
para manipular vrios registros.
68
Banco de Dados II
69
Banco de Dados II
Os disparadores podem manipular aes com vrios registros. Uma ao INSERT, UPDATE ou
DELETE que chama um disparador pode afetar vrios registros. Voc poder:
Processar todos os registros em conjunto; nesse caso, todos os registros afetados devem
satisfazer aos critrios do disparador para que qualquer ao ocorra.
Permitir aes condicionais. Por exemplo, se desejar excluir trs clientes da tabela Customers
(Clientes), voc poder definir um disparador para garantir que no existam pedidos ativos ou
faturas pendentes para cada cliente excludo. Se um dos trs clientes tiver uma fatura pendente,
ele no ser excludo, mas os clientes qualificados sero.
Para determinar se vrios registros so afetados, use a funo do sistema
@@ROWCOUNT.
70
Banco de Dados II
Permisses apropriadas
Os proprietrios das tabelas, bem como os participantes dos cargos proprietrio do banco de
dados (db_owner) e administradores do sistema (sysadmin), tm permisso para criar um
disparador. Para evitar situaes em que o proprietrio de uma view e o proprietrio das tabelas
subjacentes sejam diferentes, recomendado que o usurio dbo seja o proprietrio de todos os
objetos de um banco de dados. Como um usurio pode ser participante de vrios cargos,
especifique sempre o usurio dbo como o nome do proprietrio ao criar o objeto. Caso contrrio, o
objeto ser criado tendo o seu nome de usurio como o proprietrio.
71
Banco de Dados II
Use Northwind
GO
CREATE TRIGGER Empl_Delete ON Employees
FOR DELETE
AS
IF (SELECT COUNT(*) FROM Deleted) > 1
BEGIN
RAISERROR(
'You cannot delete more than one employee at a time.',
16, 1)
ROLLBACK TRANSACTION
END
A instruo DELETE a seguir aciona o disparador e impede a transao.
DELETE FROM Employees WHERE EmployeeID > 6
A instruo DELETE a seguir aciona o disparador e permite a transao.
DELETE FROM Employees WHERE EmployeeID = 6
Alterando um disparador
Se for necessrio alterar a definio de um disparador existente, voc poder alter-lo sem
precisar descart-lo.
A definio alterada substitui a definio do disparador existente pela nova definio. A ao do
procedimento tambm alterada. Por exemplo, se voc criar um disparador para INSERT e,
depois, alterar a ao para UPDATE, o disparador alterado ser executado sempre que a tabela
for atualizada. Usando a resoluo de nomes com atraso, voc poder fazer referncia a tabelas e
views em um disparador que ainda no existe. Se o objeto no existir quando um disparador for
criado, voc receber uma mensagem de aviso, e o SQL Server atualizar a definio do
procedimento imediatamente.
72
Banco de Dados II
73
Banco de Dados II
Descartando um disparador
Voc pode remover um disparador descartando-o. Os disparadores so descartados
automaticamente sempre que as tabelas associadas so descartadas. A permisso para descartar
um disparador assume, por padro, o proprietrio da tabela e intransfervel. No entanto, os
participantes dos cargos administradores do sistema (sysadmin) e proprietrio do banco de dados
(db_owner) podem descartar qualquer objeto especificando o proprietrio na instruo DROP
TRIGGER.
DROP TRIGGER nome_do_disparador
Ao criar disparadores, importante compreender como eles funcionam. Esta seo aborda os
disparadores INSERT, DELETE, UPDATE, INSTEAD OF, aninhados e recursivos.
74
Banco de Dados II
75
Banco de Dados II
76
Banco de Dados II
77
Banco de Dados II
78
Banco de Dados II
79
Banco de Dados II
80
Banco de Dados II
Disparadores recursivos
Qualquer disparador pode conter uma instruo UPDATE, INSERT ou DELETE que afete a
mesma ou outra tabela. Com a opo de disparador recursivo ativada, um procedimento que altere
dados em uma tabela poder ativar a si mesmo novamente, em uma execuo recursiva. A opo
de disparador recursivo est desativada por padro quando um banco de dados criado, mas
voc pode ativ-la usando a instruo para alterar o banco de dados.
81
Banco de Dados II
A recurso indireta, que ocorre quando um disparador aciona e executa uma ao que faz
com que um disparador em outra tabela seja acionado, ocasionando subseqentemente
uma atualizao da tabela original. Isso, por sua vez, faz com que o disparador original seja
acionado
novamente.
Por exemplo, um aplicativo atualiza a tabela T2, fazendo com que o disparador Trig2 seja
acionado. Trig2 atualiza a tabela T3 novamente, fazendo com que o disparador Trig3 seja
acionado novamente. Trig3, por sua vez, atualiza a tabela T2, fazendo com que Trig2 seja
acionado novamente.
82
Banco de Dados II
Os disparadores foram a integridade dos dados e as regras de negcios. Algumas das aes que
os disparadores executam podem ser realizadas atravs do uso de restries e, no caso de
algumas aes, voc dever considerar as restries primeiro. No entanto, os disparadores so
necessrios para impor os vrios graus de desnormalizao e para impor regras de negcios
complexas.
83
Banco de Dados II
O exemplo a seguir mostrar como um disparador mantm a integridade dos dados em uma tabela
BackOrders (Pedidos retroativos). O disparador BackOrderList_delete mantm a lista de produtos
na tabela BackOrders.
Quando os produtos so recebidos, o disparador UPDATE na tabela Products exclui registros de
uma tabela BackOrders.
CREATE TRIGGER BackOrderList_Delete
ON Products FOR UPDATE
AS
IF (SELECT BO.ProductID FROM BackOrders AS BO JOIN
Inserted AS I ON BO.ProductID = I.Product_ID
) > 0
BEGIN
DELETE BO FROM BackOrders AS BO
INNER JOIN Inserted AS I
ON BO.ProductID = I.ProductID
END
84
Banco de Dados II
85
Banco de Dados II
86
Banco de Dados II
Unidade 6 -
Criando ndices
Use a instruo CREATE INDEX para criar ndices e a instruo DROP INDEX para remov-los.
Voc dever ser o proprietrio da tabela para executar qualquer uma das duas instrues em um
banco de dados.
87
Banco de Dados II
88
Banco de Dados II
89
Banco de Dados II
Este exemplo determina se existe uma identificao de cliente duplicada na coluna CustomerID da
tabela Customers. Se existir, o SQL Server retornar a identificao do cliente e o nmero de
entradas duplicadas no conjunto de resultados.
SELECT CustomerID, COUNT(CustomerID) AS '# of Duplicates'
FROM Northwind.dbo.Customers
GROUP BY CustomerID
HAVING COUNT(CustomerID)>1
ORDER BY CustomerID
90
Banco de Dados II
Por exemplo, um catlogo de telefones um bom exemplo em que seria til usar um ndice
composto. O catlogo organizado por sobrenomes. Dentro dos sobrenomes, ele organizado
por nomes, pois geralmente existem entradas com o mesmo sobrenome.
Ao criar um ndice composto, considere os fatos e as diretrizes a seguir:
Voc pode combinar at 16 colunas em um nico ndice composto. O somatrio dos comprimentos
dos dados das colunas que constituem o ndice composto no pode ultrapassar 900 bytes.
Todas as colunas de um ndice composto devem fazer parte da mesma tabela, exceto quando o
ndice criado em uma view.
Defina a coluna mais exclusiva primeiro. A primeira coluna definida na instruo CREATE INDEX
considerada a de ordem mais alta.
A clusula WHERE de uma consulta deve fazer referncia primeira coluna do ndice composto
para que o otimizador de consultas use esse ndice.
Um ndice composto em (coluna1, coluna2) no igual a um ndice composto em (coluna2,
coluna1) cada um apresenta uma ordem diferente de colunas. A coluna que contm dados mais
seletivos ou que retornaria a porcentagem mais baixa de registros geralmente determina a ordem
das colunas.
Os ndices compostos so teis para tabelas com vrias chaves de colunas.
Use ndices compostos para aumentar o desempenho das consultas e reduzir o nmero de ndices
criados em uma tabela. Em geral, vrios ndices nas mesmas colunas no so teis.
Este exemplo cria um ndice sem agrupamento composto na tabela Order Details (Detalhes do
pedido). As colunas OrderID (Identificao do pedido) e ProductID (Identificao do produto) so
os valores de chaves compostas. Observe que a coluna OrderID listada primeiro, pois mais
seletiva do que a coluna ProductID.
USE Northwind
CREATE UNIQUE NONCLUSTERED INDEX U_OrdID_ProdID
ON [Order Details] (OrderID, ProductID)
91
Banco de Dados II
92
Banco de Dados II
93
Banco de Dados II
Unidade 7 consultas
Otimizando o desempenho de
94
Banco de Dados II
Quando o otimizador de consultas otimiza consultas, ele no inicia o plano de execuo com a
menor perda de recursos. Em vez disso, escolhe o plano de execuo que retorna os resultados
da maneira mais rpida para o usurio, com uma reduo razovel de recursos.
Se o Microsoft SQL Server tiver mais de um processador disponvel, o otimizador de consultas
poder dividir a consulta entre eles. Em geral, as consultas de longa durao tiram proveito dos
planos de execuo, mas uma consulta paralela pode usar mais recursos gerais que o
processamento serial de uma consulta.
95
Banco de Dados II
Processo de anlise
O processo de anlise verifica se a consulta recebida possui a sintaxe correta e divide essa
sintaxe em partes de componentes s quais o mecanismo de banco de dados relacional pode
responder. A sada dessa etapa uma rvore de consultas analisada.
Processo de padronizao
O processo de padronizao transforma uma consulta em um formato til de otimizao. Qualquer
clusula de sintaxe redundante detectada removida. As subconsultas so padronizadas. A sada
dessa etapa uma rvore de consulta padronizada.
Otimizao de consultas
O processo de selecionar um plano de execuo a partir de vrios planos possveis chama-se
otimizao. Vrias etapas so envolvidas nessa fase. No entanto, as etapas a seguir tm o efeito
mais significativo no custo do plano de execuo: anlise de consultas, seleo de ndices e
seleo de associaes.
Compilao
A consulta compilada em um cdigo executvel.
96
Banco de Dados II
Anlise de consultas
A primeira fase da otimizao de consultas chama-se anlise de consultas. Nessa fase, o
otimizador de consultas identifica a pesquisa e os critrios de associao da consulta. Ao limitar a
pesquisa, o otimizador minimiza o nmero de registros processados. A reduo do nmero de
registros processados reduz o nmero de pginas de ndice e de dados lidas.
Seleo de ndices
A seleo de ndices a segunda fase da otimizao de consultas. Durante essa fase, o
otimizador de consultas detecta se um ndice existe para as clusulas identificadas. Em seguida,
h uma avaliao da utilidade do(s) ndice(s). A utilidade de um ndice determinada pela maneira
como vrios registros so retornados. Essas informaes so reunidas a partir de estatsticas de
ndice ou de coluna. Uma estimativa do custo de vrios mtodos de acesso ocorre por meio da
estimativa das leituras de pginas lgicas e fsicas necessrias para localizar os registros
qualificados.
Seleo de associaes
A seleo de associaes a terceira fase da otimizao de consultas. Se houver uma consulta
de vrias tabelas ou auto-associao, ocorrer uma avaliao de qual estratgia de associao
ser usada. A determinao da estratgia de associao a ser usada envolve a considerao de
vrias fatores: seletividade, densidade e memria necessrias para processar a consulta.
97
Banco de Dados II
98
Banco de Dados II
99
Banco de Dados II
100
Banco de Dados II
101
Banco de Dados II
102
Banco de Dados II
Unidade 8 -
Criando Cursores
103
Banco de Dados II
104
Banco de Dados II
105
Banco de Dados II
Caso o estoque no fique negativo, o comando para baixar o estoque realizado, caso contrrio
ser levantado um erro com o comando RAISERROR.
--Iniciando lao
WHILE @@FETCH_STATUS = 0
BEGIN
IF (SELECT unitinstock
@productid) >= 0
@quantity
FROM
products
WHERE
productid
UPDATE products
SET unitinstock = unitinstock - @quantity
WHERE productid = @productid
ELSE
RAISERROR(Abaixo do estoque mnimo, 15, 1)
--Prxima linha do cursor
FETCH NEXT FROM CursorDosItens INTO @productid, @quantity
END
--Fechando e desalocando cursor
CLOSE CursorDosItens
DEALLOCATE CursorDosItens
106
Banco de Dados II
@quantity
FROM
products
WHERE
productid
UPDATE products
107
Banco de Dados II
108
Banco de Dados II
UPDATE Orders
SET shipvia = 1
WHERE orderid = @orderid
--Confirmando transao
COMMIT TRANSACTION
Laboratrio
Crie os seguintes cursores:
1. Verifique as vendas de cada cliente. Se o valor total da venda for maior que 10.000 ento
atualize o campo contacttitle para o valor atual mais a string vip
2. Verifique cada produto, e se o mesmo no comercializado a mais de 3 meses atualize o
parmetro discotinued para 1, do contrrio exiba o nome do fabricante do mesmo
3. Verifique a quantidade de produtos vendidos em cada venda e exiba se a quantidade for de
itens da venda anterior maior ou menor que a atual
4. Verifique em cada vendedor por ordem alfabtica e se regio a regio vendedor a mesma
ou no
5. Verifique se cada venda para ver se cada a regio do cliente a mesma do vendedor, se
positivo conceda 10% de desconto do contrrio 3%
109
Banco de Dados II
Unidade 9 -
Esquemas XML
Definir o tipo dos dados XML conforme eles so armazenados no banco de dados
Atentamos ao fato de que a coleo de esquema XML uma entidade de metadados como uma
tabela no banco de dados, portanto possvel criar, modificar e delet-la.
Os esquemas criados para as exibies XML de dados relacionais so montados usando a
linguagem XSD.
Dessa forma, essas exibies podem ser consultadas por meio de consultas em linguagem XPath.
Isso semelhante criao de exibies usando instrues CREATE VIEW e especificando
consultas SQL com base na exibio.
Um esquema XML descreve a estrutura de um documento XML, alm das vrias restries
referentes aos dados do documento.
Tambm possvel usar a coleo de esquema XML para digitar variveis, parmetros e colunas
XML.
110
Banco de Dados II
111
Banco de Dados II
esquema, o banco de dados permitir que a instncia seja armazenada no sistema com suas
informaes de tipo. Caso contrrio, a instncia ser rejeitada.
O SQL Server fornece vrias instrues DDL para gerenciar os esquemas no banco de dados. No
entanto, primeiro a coleo de esquema XML precisa ser criada para que seja possvel us-la..
possvel usar a funo intrnseca XML_SCHEMA_NAMESPACE para obter dados sobre a
coleo de esquema que est armazenada no banco de dados.
112
Banco de Dados II
Laboratrio
Para realizar o exerccio crie a seguinte tabela:
113
Banco de Dados II
114
Banco de Dados II
4. Clique em OK.
115
Banco de Dados II
116
Banco de Dados II
Clique em Uma vez se quiser que a agenda seja executada apenas uma vez. Para
definir uma agenda executada apenas Uma vez, complete o grupoOcorrncia
nica na caixa de dilogo.
Laboratrio:
Crie os seguintes Jobs:
1. Backups peridicos do log de transaes
2. Checagem de tamanho de banco de dados
3. Exportao/importao de dados em um determinado horrio
4. Envio de e-mail com o resultado de um SELECT a cada 30 minutos
5. Atualizao de estatsticas quaisquer
117
Banco de Dados II
118