Você está na página 1de 119

BANCO DE DADOS II

UNIDADE 1 1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11

LINGUAGEM DE PROGRAMAO TRANSACT-SQL ................................................................................................................ 3


ELEMENTOS DE SINTAXE DO TRANSACT-SQL ...................................................................................................................... 3
DIRETIVAS EM LOTES ..................................................................................................................................................... 3
COMENTRIOS ............................................................................................................................................................. 4
IDENTIFICADORES.......................................................................................................................................................... 6
TIPOS DE DADOS ........................................................................................................................................................... 8
VARIVEIS ................................................................................................................................................................. 10
FUNES DO SISTEMA ................................................................................................................................................. 10
OPERADORES ............................................................................................................................................................. 13
EXPRESSES .............................................................................................................................................................. 15
ELEMENTOS DE LINGUAGEM DE CONTROLE DE FLUXO ......................................................................................................... 16

UNIDADE 2 2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10

IMPLEMENTANDO FUNES DEFINIDAS PELO USURIO ........................................................................... 58

O QUE UMA FUNO DEFINIDA PELO USURIO? ............................................................................................................. 58


CRIANDO UMA FUNO DEFINIDA PELO USURIO .............................................................................................................. 58
ALTERANDO E DESCARTANDO FUNES DEFINIDAS PELO USURIO ........................................................................................ 60
EXEMPLOS DE FUNES DEFINIDAS PELO USURIO ............................................................................................................. 61
PRTICAS RECOMENDADAS ........................................................................................................................................... 65

UNIDADE 5 5.1
5.2
5.3

IMPLEMENTANDO PROCEDIMENTOS ARMAZENADOS .............................................................................. 32

DEFININDO PROCEDIMENTOS ARMAZENADOS ................................................................................................................... 32


PROCESSAMENTO INICIAL DE PROCEDIMENTOS ARMAZENADOS ............................................................................................ 33
PROCESSAMENTO SUBSEQENTE DE PROCEDIMENTOS ARMAZENADOS .................................................................................. 35
VANTAGENS DOS PROCEDIMENTOS ARMAZENADOS ........................................................................................................... 36
CRIANDO PROCEDIMENTOS ARMAZENADOS...................................................................................................................... 36
ANINHANDO PROCEDIMENTOS ARMAZENADOS ................................................................................................................. 38
DIRETRIZES PARA A CRIAO DE PROCEDIMENTOS ARMAZENADOS ........................................................................................ 38
EXECUTANDO PROCEDIMENTOS ARMAZENADOS ................................................................................................................ 39
ALTERANDO PROCEDIMENTOS ARMAZENADOS.................................................................................................................. 41
DESCARTANDO PROCEDIMENTOS ARMAZENADOS .............................................................................................................. 43
USANDO PARMETROS EM PROCEDIMENTOS ARMAZENADOS .............................................................................................. 43
RETORNANDO VALORES COM PARMETROS DE SADA......................................................................................................... 47
RECOMPILANDO EXPLICITAMENTE PROCEDIMENTOS ARMAZENADOS ..................................................................................... 48
TRATANDO MENSAGENS DE ERRO................................................................................................................................... 50
DEMONSTRAO: TRATANDO MENSAGENS DE ERRO.......................................................................................................... 55
PRTICAS RECOMENDADAS ........................................................................................................................................... 57

UNIDADE 4 4.1
4.2
4.3
4.4
4.5

IMPLEMENTANDO VIEWS ............................................................................................................................ 20

O QUE SO VIEWS ...................................................................................................................................................... 20


VANTAGENS DAS VIEWS ............................................................................................................................................... 21
CRIANDO VIEWS ......................................................................................................................................................... 22
RESTRIES S DEFINIES DE VIEWS ............................................................................................................................. 23
ALTERANDO E DESCARTANDO VIEWS ............................................................................................................................... 24
OCULTANDO DEFINIES DE VIEWS ................................................................................................................................ 26
MODIFICANDO DADOS ATRAVS DE VIEWS ....................................................................................................................... 27
OTIMIZANDO O DESEMPENHO COM O USO DE VIEWS ......................................................................................................... 27
USANDO VIEWS INDEXADAS .......................................................................................................................................... 29
PRTICAS RECOMENDADAS ........................................................................................................................................... 30

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

IMPLEMENTANDO DISPARADORES ............................................................................................................. 66

O QUE SO DISPARADORES? ......................................................................................................................................... 66


USOS DE DISPARADORES .............................................................................................................................................. 67
CONSIDERAES SOBRE O USO DE DISPARADORES ............................................................................................................. 69

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

CRIANDO E DESCARTANDO NDICES................................................................................................................................. 87


CRIANDO NDICES EXCLUSIVOS ....................................................................................................................................... 89
LOCALIZANDO TODOS OS VALORES DUPLICADOS EM UMA COLUNA ........................................................................................ 90
CRIANDO NDICES COMPOSTOS ...................................................................................................................................... 90
OBTENDO INFORMAES SOBRE OS NDICES EXISTENTES ..................................................................................................... 92

UNIDADE 7 7.1
7.2
7.3
7.4
7.5
7.6
7.7
7.8
7.9

AGENTE DE SERVIOS ............................................................................................................................ 114

INTRODUO SOBRE AGENTE DE SERVIOS .................................................................................................................... 114


INICIANDO O AGENTE DE SERVIOS .............................................................................................................................. 114
CRIANDO UM TRABALHO ............................................................................................................................................ 115
PARA CRIAR UMA ETAPA DE TRABALHO TRANSACT-SQL ................................................................................................... 115
PARA CRIAR E ANEXAR UMA AGENDA A UM TRABALHO ..................................................................................................... 116

UNIDADE 11 11.1

ESQUEMAS XML ......................................................................................................................................... 110

INTRODUO SOBRE XSD........................................................................................................................................... 110


CRIANDO UM ESQUEMA XSD...................................................................................................................................... 110
ASSOCIANDO UM ESQUEMA XSD................................................................................................................................. 111
ALTERANDO UM ESQUEMA XSD .................................................................................................................................. 112
DELETANDO UM ESQUEMA XSD .................................................................................................................................. 112

UNIDADE 10 10.1
10.2
10.3
10.4
10.5

CRIANDO CURSORES .................................................................................................................................. 103

INTRODUO SOBRE CURSORES ................................................................................................................................... 103


DECLARANDO UM CURSOR.......................................................................................................................................... 103
ABRINDO UM CURSOR ............................................................................................................................................... 104
PERCORRENDO UM CURSOR ........................................................................................................................................ 105
EXECUTANDO COMANDOS EM UM CURSOR .................................................................................................................... 105
CONFIRMANDO OU RETORNANDO UM CURSOR ............................................................................................................... 106

UNIDADE 9 9.1
9.2
9.3
9.4
9.5

OTIMIZANDO O DESEMPENHO DE CONSULTAS.......................................................................................... 94

INTRODUO AO OTIMIZADOR DE CONSULTAS .................................................................................................................. 94


COMO O OTIMIZADOR DE CONSULTAS USA A OTIMIZAO BASEADA EM CUSTOS ...................................................................... 95
COMO O OTIMIZADOR DE CONSULTAS FUNCIONA .............................................................................................................. 96
FASES DE OTIMIZAO DE CONSULTAS............................................................................................................................. 97
ARMAZENANDO EM CACHE O PLANO DE EXECUO ........................................................................................................... 97
RECOMPILANDO OS PLANOS DE EXECUO....................................................................................................................... 98
DEFININDO UM LIMITE DE CUSTO ................................................................................................................................... 99
OBTENDO INFORMAES SOBRE PLANOS DE EXECUO ...................................................................................................... 99
EXIBINDO GRAFICAMENTE O PLANO DE EXECUO ........................................................................................................... 101

UNIDADE 8 8.1
8.2
8.3
8.4
8.5
8.6

CRIANDO NDICES......................................................................................................................................... 87

PROJETO FINAL ...................................................................................................................................... 118

SITUAO PROBLEMA................................................................................................................................................ 118

Unidade 1 -

SQL

1.1 Linguagem de programao Transact-SQL


O American National Standards Institute (ANSI) e a International Standards Organization (ISO)
definiram padres para o SQL. Usando o Transact-SQL, o Microsoft SQL Server oferece suporte
implementao em nvel de acesso do SQL-92, padro SQL publicado pelo ANSI e pela ISO em
1992. Os elementos de linguagem do Transact-SQL compatveis com ANSI-SQL podem ser
executados em qualquer produto compatvel com nvel de acesso ANSI-SQL. O Transact-SQL
tambm contm vrias extenses para oferecer maior funcionalidade.

1.2 Elementos de sintaxe do Transact-SQL


As instrues de DML so construdas com o uso de vrios elementos de sintaxe do TransactSQL. Por exemplo:
Diretivas em lotes
Comentrios
Identificadores
Tipos de dados
Variveis
Funes do sistema
Operadores
Expresses
Elementos de linguagem de controle de fluxo
Palavras-chave reservadas

1.3 Diretivas em lotes


O SQL Server processa uma nica ou vrias instrues Transact-SQL em lotes. Uma diretiva em
lotes instrui o SQL Server a analisar e executar todas as instrues contidas no lote. Existem dois
mtodos bsicos de enviar os lotes para o SQL Server.

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 explicar um clculo.

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

em 10% e o nome do produto.


*/
USE northwind
SELECT unitprice, (unitprice * 1.1), productname
FROM products
GO
Insira comentrios em um script inteiro para descrever as aes das instrues. Esse recurso
importante principalmente se outros usurios precisarem examinar ou implementar o script.
Esta seo de um script est comentada para impedir a sua execuo. Esse um recurso til ao
depurar ou solucionar problemas de arquivo script.

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:

O primeiro caractere deve ser um caractere alfabtico, de a-z ou A-Z.

Banco de Dados II

Aps o primeiro caractere, os identificadores podem incluir letras, nmeros ou os smbolos


@, $, # ou _ .

Os nomes de identificadores que comeam com um smbolo tm utilizaes especiais:

Um identificador que inicie com o smbolo @ indica um parmetro ou varivel local.

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.

Os nomes de objetos temporrios no devem ter mais de 116 caracteres, incluindo os


sinais # ou ##, porque o SQL Server atribui um sufixo numrico interno aos objetos
temporrios.

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 os nomes contiverem espaos incorporados

Quando forem utilizadas palavras reservadas como nomes de objetos ou partes de nomes
de objetos

Os identificadores delimitados devem ser colocados entre parnteses ou aspas duplas


quando includos em instrues Transact-SQL.

Os identificadores agrupados so delimitados por colchetes ([ ]):

SELECT * FROM [Espaos no nome da tabela]


possvel utilizar sempre os delimitadores agrupados, independentemente do status da opo
SET QUOTED_IDENTIFIER.
Os identificadores entre aspas so delimitados por aspas duplas (""):
SELECT * FROM "Espaos no nome da tabela"
S possvel usar identificadores entre aspas com a opo SET QUOTED_IDENTIFIER ativada.

Diretrizes de nomeao de identificadores


Ao nomear objetos do banco de dados:
Mantenha os nomes curtos.

Banco de Dados II

Quando possvel, empregue nomes significativos.


Use convenes de nomeao simples e fceis. Descubra o que funcionar melhor na sua
situao e seja coerente. Evite criar convenes de nomeao muito complexas, porque podem se
tornar difceis de controlar ou entender. Por exemplo, retire as vogais se o nome deum objeto
precisar ficar parecido com uma palavra-chave (como um procedimento armazenado de backup
chamado bckup).
Use um identificador que diferencie tipos de objeto, principalmente para views e procedimentos
armazenados. Os administradores de sistemas costumam confundir views com tabelas, um
descuido que pode gerar problemas imprevisveis.
Mantenha a exclusividade dos nomes de objetos e usurios. Por exemplo, evite criar uma tabela
sales (vendas) e um cargo sales dentro do mesmo banco de dados.

1.6 Tipos de dados


Os tipos de dados restringem os tipos de valores que podem ser armazenados em um banco de
dados. Os tipos de dados so atributos que especificam o tipo de informao que pode ser
armazenado em uma coluna, parmetro ou varivel.
A maioria das instrues Transact-SQL no faz referncia explcita a tipos de dados, mas os
resultados da maioria das instrues so influenciados pelas interaes entre os tipos de dados
dos objetos aos quais a instruo faz referncia.
O SQL Server inclui tipos de dados fornecidos pelo sistema (base), mas voc tambm pode criar
tipos de dados. Alguns exemplos de tipos de dados base so:

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.

Tipos de dados definidos pelo usurio


Este tipo de dados criado pelo administrador do banco de dados e se baseia nos tipos de dados
do sistema. Use os tipos de dados definidos pelo usurio quando vrias tabelas devem armazenar
o mesmo tipo de dados em uma coluna, e voc deve garantir que as colunas tenham exatamente
o mesmo tipo de dados, tamanho e nulidade.

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

1.8 Funes do sistema


Voc pode usar funes, inclusive Funes do sistema, em qualquer local onde uma expresso
seja permitida em uma instruo de consulta do Transact-SQL.

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

Exemplos de funes do sistema


As funes do sistema so normalmente usadas para converter dados de datas do formato de um
pas no de outro.
Para alterar os formatos de data, use a funo CONVERT com a opo de estilo para determinar o
formato da data que ser retornado.
Este exemplo demonstra como converter datas em diversos estilos.
SELECT 'ANSI:', CONVERT (varchar(30), GETDATE(), 102) AS Style
UNION
SELECT 'Japanese:', CONVERT(varchar(30), GETDATE(), 111)
UNION
SELECT 'European:', CONVERT(varchar(30), GETDATE(), 113)
GO
Style
ANSI: 1998.11.20
Japanese: 11/20/98
European:

20 Nov 1998 16:44:12:857

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

operadores em condies de pesquisa. Ao combin-los, a ordem em que os operadores sero


processados baseia-se em uma precedncia predefinida.
{constante | nome_da_coluna | funo | (subconsulta)}
[{operador_aritmtico | operador_de_seqncia_de_caracteres |
AND | OR | NOT}
{constante | nome_da_coluna | funo | (subconsulta)}.]

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

Concatenao de seqncias de caracteres


O operador de concatenao de seqncias de caracteres (+) concatena valores de seqncias
de caracteres. Todas as outras manipulaes de seqncias de caracteres so tratadas atravs
das funes de seqncias de caracteres. A seqncia vazia nunca avaliada como um valor
nulo.

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

FROM [Order Details]


WHERE (UnitPrice * Quantity) > 10000
GO

1.11 Elementos de linguagem de controle de fluxo


O Transact-SQL contm vrios elementos de linguagem que controlam o fluxo da lgica em uma
instruo. Ele tambm contm a funo CASE que permite usar uma lgica condicional em um
nico registro de cada vez, em uma instruo SELECT ou UPDATE.

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.

Recue as instrues Transact-SQL em um bloco de controle de fluxo para melhorar a


legibilidade.

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

IF (@n BETWEEN 4 and 6)


BEGIN
WHILE (@n > 0)

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

2.1 O que so Views


As views permitem armazenar uma consulta predefinida como um objeto no banco de dados para
uso posterior. As tabelas consultadas em uma view so chamadas tabelas base. Com algumas
excees, voc pode nomear e armazenar qualquer instruo SELECT como uma view. Alguns
exemplos comuns de views so:

Um subconjunto de registros ou colunas de uma tabela base.

Uma unio de duas ou mais tabelas base.

Uma associao de duas ou mais tabelas base.

Um resumo estatstico de uma tabela base.

Um subconjunto de outra view ou alguma combinao de views e tabelas base.

Este exemplo cria a view dbo.EmployeeView no banco de dados Northwind.


A view exibe duas colunas da tabela Employees (Funcionrios).
USE Northwind
GO
CREATE VIEW dbo.EmployeeView
AS
SELECT LastName, Firstname
FROM Employees

SELECT * from EmployeeView

20

Banco de Dados II

2.2 Vantagens das Views


As views oferecem diversas vantagens, incluindo focalizar os dados para os usurios, mascarar a
complexidade dos dados, simplificar o gerenciamento de permisses e organizar dados para
serem exportados para outros aplicativos.

Focalizar os dados para os usurios


As views criam um ambiente controlado que permite o acesso a dados especficos enquanto
outros dados ficam ocultos. Dados desnecessrios, confidenciais ou inadequados podem ser
deixados fora de uma view.
Os usurios podem manipular a exibio dos dados em uma view da mesma forma que em uma
tabela. Alm disso, com as permisses apropriadas e algumas restries, eles podem modificar os
dados produzidos pela view.

Mascarar a complexidade do banco de dados


As views isolam do usurio a complexidade do design do banco de dados. Isso permite que os
desenvolvedores alterem o design sem afetar a interao do usurio com o banco de dados. Alm
disso, os usurios podem ver uma verso mais amigvel dos dados usando nomes mais fceis de
compreender do que os nomes abreviados geralmente usados nos bancos de dados.
Consultas complexas, incluindo consultas distribudas a dados heterogneos, tambm podem ser
mascaradas atravs de views. O usurio consulta a view em vez de escrever a consulta ou
executar um script.

Simplificar o gerenciamento de permisses de usurios


Em vez de conceder permisso para que os usurios consultem colunas especficas em tabelas
base, os proprietrios de bancos de dados podem conceder permisses para que os usurios
consultem dados somente atravs de views. Isso tambm protege as alteraes no design das
tabelas base subjacentes. Os usurios podem continuar a consultar a view sem interrupo.

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.

Organizar dados para serem exportados para outros aplicativos


Voc pode criar uma view com base em uma consulta complexa que associe duas ou mais tabelas
e, depois, exportar os dados para outro aplicativo para anlise adicional.

21

Banco de Dados II

2.3 Criando views

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.

Criando uma view


Quando voc cria uma view, o Microsoft SQL Server verifica a existncia de objetos aos quais a
definio da view faz referncia. O nome da view deve seguir as regras dos identificadores. A
especificao do nome do proprietrio da view opcional.
Voc deve desenvolver uma conveno de nomeao consistente para fazer a distino entre
views e tabelas. Por exemplo, voc poderia adicionar a palavra view como um sufixo para cada
objeto de view criado. Isso permite que voc diferencie facilmente objetos semelhantes (tabelas e
views) ao consultar a view INFORMATION_SCHEMA.TABLES.
CREATE VIEW proprietrio.nome_da_view [(coluna [,n ])]
[WITH {ENCRYPTION | SCHEMABINDING | VIEW_METADATA} [,n ]]
AS
instruo_select
[WITH CHECK OPTION]
Para executar a instruo CREATE VIEW, voc dever ser participante do cargo de
administradores do sistema (sysadmin), do cargo de proprietrio do banco de dados (db_owner)
ou do cargo de administrador de linguagem de definio de dados (db_ddladmin) ou dever ter a
permisso CREATE VIEW.
Voc tambm dever ter a permisso SELECT em todas as tabelas ou views s quais a view faz
referncia. Para evitar situaes em que o proprietrio de uma view e o proprietrio das tabelas
subjacentes sejam diferentes, recomenda-se que o usurio dbo possua todos os objetos de um
banco de dados. Ao criar o objeto, especifique sempre o usurio dbo como o nome do proprietrio;
caso contrrio, o objeto ser criado com o seu nome de usurio como o proprietrio do objeto.
Especifique o contedo de uma view usando uma instruo SELECT. Com algumas limitaes, as
views podem ser to complexas quanto voc desejar. Voc dever especificar nomes de colunas
se:
Quaisquer colunas da view derivam de uma expresso aritmtica, de uma funo interna ou de
uma constante.

22

Banco de Dados II

Quaisquer colunas de tabelas que sero associadas compartilharem o mesmo nome.


Quando voc cria views, importante testar a instruo SELECT que define a view para garantir
que o SQL Server retorne o conjunto de resultados esperado. Depois de escrever e testar a
instruo SELECT e verificar os resultados, crie a view.

2.4 Restries s definies de views


Ao criar views, considere as restries a seguir:

A instruo CREATE VIEW no pode incluir as clusulas COMPUTE ou COMPUTE BY.

A instruo CREATE VIEW no pode incluir a palavra chave INTO.

A instruo CREATE VIEW s poder incluir a clusula ORDER BY se a palavra-chave


TOP for usada.

As views no podem fazer referncia a tabelas temporrias.

As views no podem fazer referncia a mais de 1.024 colunas.

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

Este exemplo consulta a view para ver os resultados.


SELECT * FROM OrderSubtotalsView
Freqentemente, voc cria views para fornecer um modo conveniente de examinar informaes de
duas ou mais tabelas associadas em um local central.
Neste exemplo, ShipStatusView associa as tabelas Customers (Clientes) e Orders (Pedidos).
USE Northwind
GO
CREATE VIEW dbo.ShipStatusView
AS
SELECT OrderID, ShippedDate, ContactName
FROM Customers c INNER JOIN Orders o
ON c.CustomerID = O.CustomerID
WHERE RequiredDate < ShippedDate

SELECT * FROM ShipStatusView


OrderID ShippedDate ContactName

2.5 Alterando e descartando views

Freqentemente, voc altera as views em resposta a solicitaes de informaes adicionais feitas


pelos usurios ou a alteraes na definio da tabela subjacente. Voc pode alterar uma view
descartando-a e criando-a novamente ou executando a instruo ALTER VIEW.

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

ALTER VIEW proprietrio.nome_da_view


[(coluna [,...n ])]
[WITH {ENCRYPTION | SCHEMABINDING | VIEW_METADATA} [,...n]]
AS
instruo_select
[WITH CHECK OPTION]
Se voc usar a opo WITH CHECK OPTION, WITH
ENCRYPTION, WITH SCHEMABINDING ou WITH VIEW_METADATA
O exemplo a seguir altera EmployeeView para adicionar a coluna Extension (Extenso).
USE Northwind
GO
ALTER VIEW dbo.EmployeeView
AS
SELECT LastName, FirstName, Extension
FROM Employees
Se voc definir uma view com uma instruo SELECT * e, depois, alterar a estrutura das tabelas
subjacentes adicionando colunas, as novas colunas no aparecero na view. Quando todas as
colunas so selecionadas em uma instruo CREATE VIEW, a lista de colunas interpretada
apenas quando voc cria a view pela primeira vez. Para ver as novas colunas na view, voc deve
alter-la.

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

2.6 Ocultando definies de views

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.

Usar a opo WITH ENCRYPTION


Voc pode criptografar as entradas da tabela syscomments que contm o texto da instruo
CREATE VIEW especificando a opo WITH ENCRYPTION na definio de view. Antes de
criptografar uma view, certifique-se de que a sua definio (script) seja salva em um arquivo. Para
descriptografar o texto de uma view, voc deve descart-la e cri-la novamente ou alter-la e usar
a sintaxe original.
Neste exemplo, dbo.[Order Subtotals View] criada usando a opo WITH ENCRYPTION para
ocultar a definio de view.
USE Northwind
GO
CREATE VIEW dbo.[Order Subtotals View]
WITH ENCRYPTION
AS
SELECT OrderID,
Sum(CONVERT(money,(UnitPrice*Quantity*(1-Discount)/100))*100)
AS Subtotal
FROM [Order Details]
GROUP BY OrderID

26

Banco de Dados II

2.7 Modificando dados atravs de views

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.

No podem ser feitas em certas colunas.

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.

Podero ocasionar erros se afetarem colunas s quais a view no faz referncia.

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.

2.8 Otimizando o desempenho com o uso de views

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

Se os usurios tiverem problemas de desempenho ao executarem a consulta a seguir para listar


os itens mais vendidos da empresa Ernst Handel, a origem do problema no estar imediatamente
aparente.
SELECT *
FROM dbo.TopSalesView
WHERE CompanyName = 'Ernst Handel'

2.9 Usando views indexadas


Voc pode criar ndices em views. Uma view indexada armazena o conjunto de resultados de uma
view no banco de dados. Devido ao tempo rpido de recuperao, possvel usar views
indexadas para melhorar o desempenho de consultas.

Criando uma view indexada


Crie uma view indexada implementando um ndice UNIQUE CLUSTERED em uma view. Os
resultados da view so armazenados nas pginas do nvel folha do ndice de agrupamento.
Depois de criar o ndice UNIQUE CLUSTERED, voc poder criar outros ndices nessa view. Uma
view indexada reflete automaticamente as modificaes efetuadas nos dados das tabelas base.
medida que os dados so alterados, o ndice UNIQUE CLUSTERED atualizado.

Diretrizes para a criao de views indexadas


O otimizador de consultas determina automaticamente se uma consulta se beneficiar do uso de
uma view indexada. Isso ocorre mesmo que a consulta no faa referncia view indexada. Como
prtica geral, deixe que o otimizador de consultas determine quando usar views indexadas.
Usando o Index Tuning Wizard (Assistente para ajuste de ndice), voc pode melhorar
significativamente sua capacidade de determinar a melhor combinao de ndices e views
indexadas para otimizar o desempenho de consultas.
Crie views indexadas quando:

A melhoria de desempenho em termos da maior velocidade na recuperao dos resultados


compensa o maior custo de manuteno.

Os dados subjacentes no so atualizados com freqncia.

29

Banco de Dados II

As consultas executam uma quantidade significativa de associaes e agregaes que


processam vrios registros ou so executadas freqentemente por vrios usurios.

Restries criao de views indexadas


Ao criar views indexadas, considere as restries a seguir:

O primeiro ndice criado em uma view deve ser um ndice de agrupamento exclusivo.

Voc deve criar a view com a opo SCHEMABINDING.

A view pode fazer referncia a tabelas base, mas no a outras views.

Voc deve usar nomes de duas partes para fazer referncia a tabelas e funes definidas
pelo usurio.

As conexes subseqentes devem ter as mesmas configuraes de opes para usar a


view indexada.

Voc deve usar a propriedade IsIndexable da funo OBJECTPROPERTY para certificarse de que possa indexar uma view.

2.10 Prticas recomendadas

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

Unidade 3 - Implementando Procedimentos


Armazenados
3.1 Definindo procedimentos armazenados
Um procedimento armazenado uma coleo nomeada de instrues Transact-SQL que
armazenada no servidor. Os procedimentos armazenados so um mtodo de encapsulamento de
tarefas repetitivas. Eles oferecem suporte para variveis declaradas pelo usurio, execuo
condicional e outros recursos avanados de programao. O SQL Server oferece suporte a cinco
tipos de procedimentos armazenados:
Armazenados no banco de dados master, os procedimentos armazenados do sistema
(identificados pelo prefixo sp_) fornecem um mtodo eficaz para recuperar informaes das
tabelas do sistema. Eles permitem que os administradores de sistema executem tarefas de
administrao de banco de dados que atualizam as tabelas do sistema, mesmo que eles no
tenham permisso para atualizar as diretamente tabelas subjacentes. Os procedimentos
armazenados do sistema podem ser executados em qualquer banco de dados.
Os procedimentos armazenados locais so criados em bancos de dados de usurio individuais.
Os procedimentos armazenados temporrios podem ser locais, com nomes que comeam com um
sinal de tralha nico (#), ou global, com nomes que iniciam com um sinal de tralha duplo (##).
Os procedimentos armazenados temporrios esto disponveis em uma sesso de usurio nico;
procedimentos armazenados globais esto disponveis para todas as sesses de usurios.
Os procedimentos armazenados remotos so um recurso anterior do SQL Server. Agora as
consultas distribudas do suporte a essa funcionalidade.
Estes procedimentos so implementados como dynamic-link libraries (DLLs, bibliotecas de
vnculos dinmicos) executadas fora do ambiente do SQL Server. Os procedimentos armazenados
estendidos costumam ser identificados pelo prefixo xp_. Eles so executados de modo semelhante
aos procedimentos armazenados.
Os procedimentos armazenados do SQL Server assemelham-se aos procedimentos de outras
linguagens de programao sob os seguintes aspectos:
Contm instrues que executam operaes no banco de dados, incluindo a capacidade de
chamar outros procedimentos armazenados.
Aceitam parmetros de entrada.
Retornam um valor de status para um lote ou procedimento armazenado de chamada para indicar
um xito ou uma falha (e a razo da falha).

32

Banco de Dados II

Retornam vrios valores para o lote ou o procedimento armazenado de chamada na forma de


parmetros de sada.

3.2 Processamento inicial de procedimentos


armazenados

O processamento de um procedimento armazenado inclui a sua criao e, depois, sua execuo


pela primeira vez, que coloca o plano de consulta respectivo no cache. O cache de procedimentos
um conjunto de pginas que contm planos de execuo para todas as instrues Transact-SQL
executadas no momento. O tamanho desse cache varia dinamicamente, de acordo com os nveis
de atividade. O cache de procedimentos est localizado no pool de memria, que a unidade
principal de memria do SQL Server. Ele contm a maioria das estruturas de dados que usa a
memria no SQL Server.

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.

Resoluo de nomes com atraso


Um processo chamado resoluo de nomes com atraso permite que os procedimentos
armazenados faam referncia a objetos que no existem quando o procedimento criado. Esse
processo proporciona flexibilidade, visto que os procedimentos armazenados e os objetos aos
quais eles fazem referncia no precisam ser criados em uma ordem especfica. Os objetos
devero existir quando o procedimento armazenado for executado. A resoluo de nomes com
atraso executada no momento em que o procedimento armazenado executado.

Execuo (primeira vez ou recompilao)

33

Banco de Dados II

Na primeira vez que um procedimento armazenado executado ou se ele precisar ser


recompilado, o processador de consultas o ler em um processo chamado resoluo.
Certas alteraes efetuadas em um banco de dados podem tornar um plano de execuo
ineficiente ou invlido. O SQL Server detecta essas alteraes e recompila automaticamente o
plano de execuo quando ocorre uma das situaes a seguir:
Uma alterao estrutural efetuada em uma tabela ou view qual a consulta (ALTER TABLE e
ALTER VIEW) faa referncia.
Novas estatsticas de distribuio so geradas explicitamente em uma instruo, como UPDATE
STATISTICS, ou automaticamente.
Um ndice usado pelo plano de execuo descartado.
Alteraes significativas so efetuadas nas chaves (instruo INSERT ou DELETE) de uma tabela
qual a consulta faa referncia.

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:

O volume de dados das tabelas.

A presena e a natureza dos ndices da tabela e a distribuio dos dados nas colunas
indexadas.

Os operadores e os valores de comparao usados nas condies da clusula WHERE.

A presena de associaes e das clusulas UNION, GROUP BY ou ORDER BY.

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:

Tempo necessrio para a recompilao (alto custo de compilao).

Uso freqente.

34

Banco de Dados II

3.3 Processamento subseqente de procedimentos


armazenados

O processamento subseqente de procedimentos armazenados mais rpido que o


processamento inicial, pois o SQL Server usa o plano de consulta otimizado armazenado no cache
de procedimentos.
Se as condies a seguir se aplicarem, o SQL Server usar o plano armazenado na memria para
executar a consulta posteriormente: _ O ambiente atual igual quele em que o plano foi
compilado.
As configuraes de servidor, banco de dados e conexo determinam o ambiente.
Os objetos aos quais o procedimento armazenado faz referncia no precisam de resoluo de
nomes.
A resoluo de nomes necessria quando objetos pertencentes a usurios diferentes possuem
nomes idnticos. Por exemplo, se o cargo sales for proprietrio de uma tabela Product (Produto) e
o cargo development for proprietrio de uma tabela Product, o SQL Server dever determinar qual
tabela dever ser consultada toda vez que uma tabela Product for referenciada.
Os planos de execuo do SQL Server apresentam dois componentes principais:
Plano de consulta a maior parte do plano de execuo encontra-se nessa estrutura de dados
reentrante, somente leitura, que pode ser usada por inmeros usurios.
Contexto de execuo cada usurio que est executando a consulta no momento possui essa
estrutura de dados reutilizvel, que armazena os dados especficos de sua execuo, como os
valores de parmetros. Se um usurio executar uma consulta, e uma das estruturas no estiver
em uso, ela ser reinicializada com o contexto do novo usurio. Haver sempre, no mximo, um
plano compilado no cache para cada combinao exclusiva de procedimento armazenado e
ambiente. Podero existir vrios planos no cache para o mesmo procedimento armazenado se
cada um se destinar a um ambiente diferente.
Os fatores a seguir resultam em diferentes ambientes que afetam as escolhas de compilao:

Planos compilados paralelos versus seriais.

Propriedade implcita de objetos.

Diferentes opes SET.

35

Banco de Dados II

3.4 Vantagens dos procedimentos armazenados


Os procedimentos armazenados oferecem inmeras vantagens. Eles podem:

Compartilhar a lgica do aplicativo com outros aplicativos, garantindo, dessa maneira, o


acesso e a modificao consistente dos dados.

Os procedimentos armazenados podem encapsular as regras de negcios. As regras ou


polticas de negcios encapsulados nos procedimentos armazenados podem ser alteradas
em um nico local. Todos os clientes podem usar os mesmos procedimentos armazenados
para garantir o acesso e a modificao consistentes dos dados.

Proteger os usurios da exposio aos detalhes das tabelas do banco de dados. Se um


conjunto de procedimentos armazenados der suporte para todas as funes de negcios
que os usurios precisam executar, eles nunca precisaro acessar as tabelas diretamente.

Fornecer mecanismos de segurana. Os usurios podem receber permisso para executar


um procedimento armazenado mesmo que no tenham permisso para acessar as tabelas
ou views s quais o procedimento armazenado faz referncia.

Melhorar o desempenho. Os procedimentos armazenados implementam vrias tarefas


como uma srie de instrues Transact-SQL. A lgica condicional pode ser aplicada aos
resultados das primeiras instrues Transact-SQL para determinar quais instrues
Transact-SQL subseqentes sero executadas. Todas essas instrues Transact-SQL e a
lgica condicional tornam-se parte de um nico plano de execuo no servidor.

Reduzir o trfego de rede. Em vez de enviar centenas de instrues Transact-SQL atravs


da rede, os usurios podem executar uma operao complexa enviando uma nica
instruo, o que reduz o nmero de solicitaes transferidas entre o cliente e o servidor.

3.5 Criando procedimentos armazenados

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

Usando CREATE PROCEDURE


Os procedimentos armazenados so criados com a instruo CREATE PROCEDURE. Considere
os fatos a seguir ao cri-los:

Os procedimentos armazenados podem fazer referncia a tabelas, views e procedimentos


armazenados, bem como a tabelas temporrias.

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.

A definio de CREATE PROCEDURE pode incluir qualquer quantidade e tipo de


instrues Transact-SQL, com exceo das instrues de criao de objetos a seguir:
CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER e
CREATE VIEW. Outros objetos de banco de dados podem ser criados em um
procedimento armazenado e devem ser qualificados com o nome do proprietrio do objeto.

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.

O tamanho mximo de um procedimento armazenado 128 megabytes (MB), dependendo


da memria disponvel.

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

3.6 Aninhando procedimentos armazenados


Os procedimentos armazenados podem ser aninhados (um procedimento armazenado chama
outro). As caractersticas do aninhamento incluem:

Os procedimentos armazenados podem ser aninhados em at 32 nveis. A tentativa de


exceder esse limite far com que toda a chamada em cadeia de procedimentos falhe.

O nvel de aninhamento atual armazenado na funo do sistema @@nestlevel.

Se um procedimento armazenado chamar um segundo procedimento armazenado, esse


poder acessar todos os objetos criados pelo primeiro, incluindo as tabelas temporrias.

Os procedimentos armazenados aninhados podem ser recursivos. Por exemplo, o


Procedimento armazenado X pode chamar o Procedimento armazenado Y. Enquanto o
Procedimento armazenado Y est sendo executado, ele pode chamar o Procedimento
armazenado X.

3.7 Diretrizes para a criao de procedimentos


armazenados
Considere as diretrizes a seguir ao criar procedimentos armazenados:

Para evitar situaes em que o proprietrio de um procedimento armazenado e o


proprietrio das tabelas subjacentes sejam diferentes, recomendado que o usurio dbo
possua todos os objetos do 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:

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

Evite situaes em que o proprietrio de um procedimento armazenado e o proprietrio das


tabelas subjacentes sejam diferentes. Se estiver criando um procedimento armazenado do
sistema definido pelo usurio, voc dever ter efetuado login como um participante do
cargo administradores do sistema (sysadmin) e usar o banco de dados master.

Crie cada procedimento armazenado para realizar uma nica tarefa.

Crie, teste e depure seu procedimento armazenado no servidor; depois, teste-o no cliente.

Para distinguir facilmente os procedimentos armazenados do sistema, evite usar o prefixo


sp_ ao atribuir nomes a procedimentos armazenados locais.

Todos os procedimentos armazenados devem assumir as mesmas configuraes de


conexo.

Minimize o uso de procedimentos armazenados temporrios para evitar a disputa por


recursos nas tabelas do sistema de tempdb, o que poder ocasionar um impacto negativo
no desempenho.

Use sp_executesql em vez de usar a instruo EXECUTE para executar dinamicamente


uma seqncia em um procedimento armazenado. sp_executesql mais eficiente, pois
gera planos de execuo que o SQL Server tem mais probabilidade de reutilizar. O SQL
Server compila a instruo ou instrues Transact-SQL na seqncia de caracteres em um
plano de execuo separado do plano de execuo do procedimento armazenado. Voc
pode usar o sp_executesql quando estiver executando uma instruo Transact-SQL vrias
vezes, se a nica variao estiver nos valores de parmetro fornecidos na instruo
Transact-SQL.

Nunca exclua entradas diretamente da tabela do sistema syscomments. Para que os


usurios no possam exibir o texto de seus procedimentos armazenados, crie-os usando a
opo WITH ENCRYPTION. Se voc no usar essa opo, os usurios podero usar o
SQL Server Enterprise Manager (Gerenciador corporativo do SQL Server) ou executar o
procedimento armazenado do sistema sp_helptext para exibir o texto dos procedimentos
armazenados localizados na tabela do sistema syscomments.

3.8 Executando procedimentos armazenados

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

Executando um procedimento armazenado isoladamente


Voc pode executar um procedimento armazenado emitindo a instruo EXECUTE junto com o
nome do procedimento e quaisquer parmetros.
[[EXEC [UTE]]
{
[@status_do_retorno =]
{nome_do_procedimento [;nmero] |
@ var_nome_do_procedimento}
}
[[@parmetro = {valor | @varivel [OUTPUT] | [DEFAULT]]
[,...n]
[WITH RECOMPILE]
A instruo a seguir executa um procedimento armazenado que lista todos os pedidos vencidos no
banco de dados Northwind.
EXEC OverdueOrders

Executando um procedimento armazenado em uma instruo INSERT


A instruo INSERT pode preencher uma tabela local com um conjunto de resultados que
retornado de um procedimento armazenado local ou remoto. O SQL Server carrega a tabela com
dados que so retornados das instrues SELECT do procedimento armazenado. A tabela j
dever existir, e os tipos de dados devero coincidir.
As instrues a seguir criam o procedimento armazenado EmployeeCustomer, que insere
funcionrios na tabela Customers (Clientes) do banco de dados Northwind.
USE northwind
GO
CREATE PROC dbo.EmployeeCustomer
AS

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

3.9 Alterando procedimentos armazenados

Para modificar um procedimento armazenado existente e manter as atribuies de permisso, use


a instruo ALTER PROCEDURE. O SQL Server substitui a definio anterior do procedimento
armazenado quando ele alterado com ALTER PROCEDURE.
altamente recomendvel no modificar diretamente os procedimentos armazenados do sistema.
Em vez disso, crie um procedimento armazenado do sistema definido pelo usurio copiando as
instrues de um procedimento armazenado do sistema existente e, depois, modifique-o de acordo
com suas necessidades. Considere os fatos a seguir ao usar a instruo ALTER PROCEDURE:
Para modificar um procedimento armazenado que tenha sido criado com quaisquer opes, como
WITH ENCRYPTION, inclua a opo na instruo ALTER PROCEDURE para manter a
funcionalidade fornecida pela opo.
ALTER PROCEDURE altera apenas um nico procedimento. Se o seu procedimento chamar
outros procedimentos armazenados, os procedimentos armazenados aninhados no sero
afetados.
A permisso para executar essa instruo assume, por padro, os criadores do procedimento
armazenado inicial, os participantes do cargo do servidor sysadmin e os participantes dos cargos
fixos de bancos de dados db_owner e db_ddladmin. Voc no pode conceder permisso para
executar ALTER PROCEDURE.

41

Banco de Dados II

ALTER 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]

O exemplo a seguir modifica o procedimento armazenado OverdueBooks para selecionar somente


nomes de colunas especficas em vez de todas as colunas da tabela Orders (Pedidos), bem como
para classificar o conjunto de resultados.
USE Northwind
GO
ALTER PROC dbo.OverdueOrders
AS
SELECT CONVERT(char(8), RequiredDate, 1) RequiredDate,
CONVERT(char(8), OrderDate, 1) OrderDate,
OrderID, CustomerID, EmployeeID
FROM Orders
WHERE RequiredDate < GETDATE() AND ShippedDate IS Null
ORDER BY RequiredDate
GO

42

Banco de Dados II

3.10 Descartando procedimentos armazenados


Use a instruo DROP PROCEDURE para remover os procedimentos armazenados definidos pelo
usurio do banco de dados atual.
Antes de descartar um procedimento armazenado, execute o procedimento armazenado
sp_depends para determinar se os objetos dependem do procedimento.
DROP PROCEDURE {procedimento} [,...n]
Este exemplo descarta o procedimento armazenado OverdueOrders.
USE Northwind
GO
DROP PROC dbo.OverdueOrders
GO

3.11 Usando parmetros em procedimentos


armazenados
Usando parmetros de entrada
Os parmetros de entrada permitem passar informaes para um procedimento armazenado. Para
definir um procedimento armazenado que aceite parmetros de entrada, declare uma ou mais
variveis como parmetros na instruo CREATE PROCEDURE. @parmetro tipo_de_dados [=
padro] Considere os fatos e as diretrizes a seguir ao especificar parmetros:

Todos os valores de parmetros de entrada devem ser verificados no incio de um


procedimento armazenado para interceptar primeiro valores ausentes e invlidos.

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.

Os padres de parmetros devem ser constantes ou NULL. Ao especificar NULL como um


valor padro de um parmetro, voc deve usar =Null; IS NULL no funcionar, pois a
sintaxe no oferece suporte designao ANSI NULL.

O nmero mximo de parmetros em um procedimento armazenado 1.024.

43

Banco de Dados II

O nmero mximo de variveis locais em um procedimento armazenado limitado


somente pela memria disponvel.

Os parmetros so locais a um procedimento armazenado. Os mesmos nomes de


parmetros podem ser usados em outros procedimentos armazenados.

As informaes sobre parmetros so armazenadas na tabela do sistema syscolumns


(colunas do sistema).

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

Executando procedimentos armazenados com parmetros de entrada


Voc pode definir o valor de um parmetro passando o valor para o procedimento armazenado por
nome de parmetro ou por posio. Voc no deve misturar formatos diferentes ao fornecer os
valores.
A especificao de um parmetro em uma instruo EXECUTE no formato @parmetro = valor
denominada de passagem por nome do parmetro.
Quando voc passa valores por nome de parmetro, os valores dos parmetros podem ser
especificados em qualquer ordem, e possvel omitir os parmetros que permitem valores nulos
ou que possuem um padro.
O valor padro de um parmetro, se definido no procedimento armazenado, usado quando:

Nenhum valor especificado para o parmetro quando o procedimento armazenado


executado.

A palavra-chave DEFAULT especificada como o valor do parmetro.

[.[ EXEC [ UTE ] ]


{
[@status_do_retorno =]
{nome_do_procedimento [;nmero] |
@ var_nome_do_procedimento}
}
[[@parmetro = {valor | @varivel [OUTPUT] | [DEFAULT]]
[,...n]
[WITH RECOMPILE]
O exemplo parcial a seguir cria o procedimento armazenado AddCustomer, que adiciona um novo
cliente ao banco de dados Northwind. Observe que todas as variveis, exceto CustomerID e
CompanyName so especificadas para permitir um valor nulo.
USE Northwind
GO
CREATE PROCEDURE dbo.AddCustomer
@CustomerID nchar (5),
@CompanyName nvarchar (40),

45

Banco de Dados II

@ContactName nvarchar (30) = NULL,


@ContactTitle nvarchar (30) = NULL,
@Address nvarchar (60) = NULL,
@City nvarchar (15) = NULL,
@Region nvarchar (15) = NULL,
@PostalCode nvarchar (10) = NULL,
@Country nvarchar (15) = NULL,
@Phone nvarchar (24) = NULL,
@Fax nvarchar (24) = NULL
AS

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'

3.12 Retornando valores com parmetros de sada


Os procedimentos armazenados podem retornar informaes para o cliente ou o procedimento
armazenado de chamada com parmetros de sada (variveis designadas com a palavra-chave
OUTPUT). Com o uso de parmetros de sada, quaisquer alteraes no parmetro que resultem
da execuo do procedimento armazenado podero ser retidas, mesmo aps sua execuo ser
concluda.
Para usar um parmetro de sada, a palavra-chave OUTPUT dever ser especificada nas
instrues CREATE PROCEDURE e EXECUTE. Se essa palavra-chave for omitida quando o
procedimento armazenado for executado, ele ainda ser executado, mas no retornar um valor.
Os parmetros de sada apresentam as seguintes caractersticas:
A instruo de chamada deve conter um nome de varivel para receber o valor de retorno. No
possvel passar constantes.
Voc poder usar a varivel posteriormente em instrues Transact-SQL adicionais, no
procedimento armazenado de chamada ou no lote.
O parmetro pode ser qualquer tipo de dados, exceto text ou image.
Eles podem ser espaos reservados para o cursor.

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.

3.13 Recompilando explicitamente procedimentos


armazenados

Os procedimentos armazenados podem ser recompilados explicitamente, mas voc no deve


fazer isso com freqncia. Use esse procedimento somente quando:

Os valores de parmetros so passados para um procedimento armazenado que retorna


conjuntos de resultados muito variados.

48

Banco de Dados II

Um novo ndice adicionado a uma tabela subjacente da qual um procedimento


armazenado poder se beneficiar.

O valor do parmetro fornecido atpico. O SQL Server fornece trs mtodos para a
recompilao explcita de um procedimento armazenado.

CREATE PROCEDURE...[WITH RECOMPILE]


A instruo CREATE PROCEDURE...[WITH RECOMPILE] indica que o SQL Server no armazena
no cache um plano para esse procedimento armazenado. Em vez disso, a opo recompila o
procedimento armazenado toda vez que ele executado.
A instruo a seguir cria um procedimento armazenado chamado OrderCount que recompilado
toda vez que executado.
USE Northwind
GO
CREATE PROC dbo.OrderCount
@CustomerID nchar (10)
WITH RECOMPILE
AS
SELECT count(*) FROM [Orders Qry]
WHERE CustomerID = @CustomerID
GO

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

EXEC sp_help WITH RECOMPILE

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.

3.14 Tratando mensagens de erro

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

@ProductName nvarchar (40) = NULL,


@CategoryID int = NULL,
@QuantityPerUnit nvarchar (20) = NULL,
@UnitPrice money = NULL,
@UnitsInStock smallint = NULL,
@UnitsOnOrder smallint = NULL,
@ReorderLevel smallint = NULL,
@Discontinued bit = NULL
AS
BEGIN TRANSACTION
INSERT Suppliers (
CompanyName,
ContactName,
Address,
City,
Region,
PostalCode,
Country,
Phone)
VALUES (
@CompanyName,
@ContactName,
@Address,
@City,
@Region,
@PostalCode,
@Country,
@Phone)
IF @@error <> 0
BEGIN
ROLLBACK TRAN
RETURN

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.

3.15 Demonstrao: Tratando mensagens de erro

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

3.16 Prticas recomendadas

Para escrever procedimentos armazenados mais eficazes e eficientes, siga estas prticas
recomendadas:

Verifique todos os parmetros de entrada no incio de cada procedimento armazenado para


interceptar valores ausentes ou invlidos inicialmente.

Crie cada procedimento armazenado para realizar uma nica tarefa.

Execute a lgica de negcios e da tarefa, bem como a verificao de erros, antes de iniciar
as transaes. Mantenha suas transaes curtas.

Use as mesmas configuraes de conexo para todos os procedimentos armazenados.

Para ocultar o texto de procedimentos armazenados, use a opo WITH ENCRYPTION.


Nunca exclua entradas da tabela do sistema syscomments.

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

Unidade 4 - Implementando Funes


Definidas Pelo Usurio
4.1 O que uma funo definida pelo usurio?
Com o Microsoft SQL Server, voc pode criar suas prprias funes para complementar e
estender as funes fornecidas pelo sistema (internas).
Uma funo definida pelo usurio pode no ter nenhum ou ter vrios parmetros de entrada e
retorna um valor escalar ou uma tabela. Os parmetros de entrada podem ser qualquer tipo de
dados, exceto timestamp, cursor ou table. As funes definidas pelo usurio no do suporte para
parmetros de sada.
O SQL Server d suporte para trs tipos de funes definidas pelo usurio:
Funes escalares
As funes escalares assemelham-se s funes internas.
Funes com valor de tabela e vrias instrues
As funes com valor de tabela e vrias instrues retornam uma tabela criada por uma ou mais
instrues Transact-SQL e assemelham-se a um procedimento armazenado. Diferentemente de
um procedimento armazenado, essas funes podem ser referenciadas na clusula FROM de uma
instruo SELECT como se fossem uma view.
Funes com valor de tabela in-line
As funes com valor de tabela in-line retornam uma tabela que o resultado de uma nica
instruo SELECT. Elas assemelham-se s views, mas oferecem maior flexibilidade do que elas
quanto ao uso de parmetros e estendem os recursos das views indexadas.

4.2 Criando uma funo definida pelo usurio

Uma funo definida pelo usurio criada de maneira semelhante a uma view ou um
procedimento armazenado.

58

Banco de Dados II

Criando uma funo


As funes definidas pelo usurio so criadas com a instruo CREATE FUNCTION. Cada funo
definida
pelo
usurio
deve
ter
um
nome
totalmente
qualificado
exclusivo
(nome_do_banco_de_dados.nome_do_proprietrio.nome_da_funo). A instruo especifica o
tipo de dados para os parmetros de entrada, as instrues de processamento e o valor retornado
por cada tipo de dados.
CREATE FUNCTION [ nome_do_proprietrio. ] nome_da_funo
( [ { @nome_do_parmetro tipo_de_dados_do_parmetro_escalar
[ = padro ] } [,...n ] ] )
RETURNS tipo_de_dados_de_retorno_escalar
[ WITH <opo_da_funo> [,...n] ]
[ AS ]
BEGIN
corpo_da_funo
RETURN expresso_escalar
END
Este exemplo cria uma funo definida pelo usurio para substituir um valor nulo pelas palavras
Not Applicable.
USE Northwind
GO
CREATE FUNCTION fn_NewRegion
(@myinput nvarchar(30))
RETURNS nvarchar(30)
BEGIN
IF @myinput IS NULL
SET @myinput = 'Not Applicable'
RETURN @myinput
END
Ao fazer referncia a uma funo escalar definida pelo usurio, especifique o proprietrio e o nome
da funo na sintaxe de duas partes.

59

Banco de Dados II

SELECT LastName, City, dbo.fn_NewRegion(Region) AS Region,


Country
FROM dbo.Employees

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.

Definindo permisses para funes definidas pelo usurio


Voc deve ter a permisso CREATE FUNCTION para criar, alterar ou descartar funes definidas
pelo usurio.
Os usurios que no so o proprietrio devem ter a permisso EXECUTE em uma funo para
us-la em uma instruo Transact-SQL. Se a funo for vinculada a esquema, voc dever ter a
permisso REFERENCE nas tabelas, views e funes s quais ela faz referncia. As permisses
REFERENCE podem ser concedidas atravs da instruo GRANT para views e funes definidas
pelo usurio, bem como para tabelas.
Se uma instruo CREATE TABLE ou ALTER TABLE fizer referncia a uma funo definida pelo
usurio em uma restrio CHECK, uma clusula DEFAULT ou uma coluna calculada, o
proprietrio da tabela tambm

4.3 Alterando e descartando funes definidas pelo


usurio
Voc pode alterar e descartar funes definidas pelo usurio usando a instruo ALTER
FUNCTION.
A vantagem de alterar uma funo em vez de descart-la e recri-la a mesma das views e dos
procedimentos. As permisses da funo so mantidas e aplicadas imediatamente funo
revisada.

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

4.4 Exemplos de funes definidas pelo usurio

Usando uma funo escalar definida pelo usurio


As funes escalares definidas pelo usurio assemelham-se s funes internas. Aps cri-las,
voc poder reutiliz-las.
Este exemplo cria uma funo definida pelo usurio que recebe separadores de coluna e data
como variveis e reformata a data como uma seqncia de caracteres.
USE Northwind
GO
CREATE FUNCTION fn_DateFormat
(@indate datetime, @separator char(1))
RETURNS Nchar(20)
AS
BEGIN

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(), ':')

Usando uma funo com valor de tabela e vrias instrues


Uma funo com valor de tabela e vrias instrues uma combinao de uma view com um
procedimento armazenado. Voc pode usar funes definidas pelo usurio que retornam uma
tabela para substituir procedimentos armazenados ou views.
Uma funo com valor de tabela (como um procedimento armazenado) pode usar uma lgica
complexa e vrias instrues Transact-SQL para criar uma tabela. Voc pode usar uma funo
com valor de tabela na clusula FROM de uma instruo Transact-SQL da mesma maneira que
usa uma view.
Ao usar uma funo com valor de tabela e vrias instrues, considere os fatos a seguir:

BEGIN e END delimitam o corpo da funo.

A clusula RETURNS especifica table como o tipo de dados retornado.

A clusula RETURNS define o nome e o formato da tabela. O escopo do nome da varivel


de retorno local funo.

62

Banco de Dados II

Exemplo de funo com valor de tabela e vrias instrues


Voc pode criar funes usando vrias instrues que executam operaes complexas.
Este exemplo cria uma funo com valor de tabela e vrias instrues que retorna o sobrenome ou
o nome e o sobrenome de um funcionrio, dependendo do parmetro fornecido.
USE Northwind
GO
CREATE FUNCTION fn_Employees
(@length nvarchar(9))
RETURNS @fn_Employees TABLE
(EmployeeID int PRIMARY KEY NOT NULL,
[Employee Name] Nvarchar(61) NOT NULL)
AS
BEGIN
IF @length = 'ShortName'
INSERT @fn_Employees SELECT EmployeeID, LastName
FROM Employees
ELSE IF @length = 'LongName'
INSERT @fn_Employees SELECT EmployeeID,
(FirstName + ' ' + LastName) FROM Employees
RETURN
END
Voc pode chamar a funo em vez de uma tabela ou view.
SELECT * FROM dbo.fn_Employees('LongName')
ou
SELECT * FROM dbo.fn_Employees('ShortName')

63

Banco de Dados II

Usando uma funo com valor de tabela in-line


As funes in-line definidas pelo usurio retornam uma tabela e so referenciadas na clusula
FROM, da mesma maneira que uma view. Ao usar funes in-line definidas pelo usurio,
considere os fatos e diretrizes a seguir:
A clusula RETURN contm uma nica instruo SELECT entre parnteses. O conjunto de
resultados da instruo SELECT constitui a tabela que a funo retorna. A instruo SELECT
usada em uma funo in-line est sujeita s mesmas restries que as instrues SELECT usadas
em views. BEGIN e END no delimitam o corpo da funo. RETURN especifica table como o tipo
de dados retornado. No necessrio definir o formato de uma varivel de retorno porque ele
definido pelo formato do conjunto de resultados da instruo SELECT na clusula RETURN.

Exemplo de uma funo com valor de tabela in-line


Voc pode usar funes in-line para obter a funcionalidade de views com parmetros.
No possvel incluir um parmetro fornecido pelo usurio na view quando ela criada.
Normalmente voc pode resolver essa questo fornecendo uma clusula WHERE ao chamar a
view. No entanto, isso poder exigir a criao de uma seqncia de caracteres para execuo
dinmica, o que poder aumentar a complexidade do aplicativo. Voc poder obter a
funcionalidade de uma view com parmetros usando uma funo com valor de tabela in-line.
Este exemplo cria uma funo com valor de tabela in-line que aceita um valor de regio como
parmetro.
USE Northwind
GO
CREATE FUNCTION fn_CustomerNamesInRegion
( @RegionParameter nvarchar(30) )
RETURNS table
AS
RETURN (
SELECT CustomerID, CompanyName
FROM Northwind.dbo.Customers
WHERE Region = @RegionParameter
)

64

Banco de Dados II

4.5 Prticas recomendadas


As prticas recomendadas a seguir devem ajud-lo a implementar funes definidas pelo usurio:

Use funes escalares complexas em conjuntos de resultados pequenos. As funes


definidas pelo usurio permitem encapsular um raciocnio complexo em uma consulta
simples, mas, se todos os usurios da funo no compreenderem a complexidade do
clculo subjacente, a funo poder resultar em clculos demorados que no so visveis
para o usurio. No aplique uma agregao complexa em cada participante de um conjunto
grande de resultados.

Use funes de vrias instrues em vez de procedimentos armazenados que retornam


tabelas. Escrever procedimentos armazenados que retornam tabelas como funes de
vrias instrues definidas pelo usurio poder aumentar a eficincia.

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

5.1 O que so disparadores?


Um disparador um tipo especial de procedimento armazenado que executado sempre que h
uma tentativa de modificar os dados de uma tabela protegida por ele. Os disparadores esto
associados a tabelas especficas.

Associados a uma tabela


Os disparadores so definidos em uma tabela especfica, que denominada tabela de
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.

No podem ser chamados diretamente


Ao contrrio dos procedimentos armazenados do sistema padro, os disparadores no podem ser
chamados diretamente e no passam nem aceitam parmetros.

parte de uma transao


O disparador e a instruo que o aciona so tratados como uma nica transao que poder ser
revertida em qualquer ponto do procedimento. Quando estiver usando disparadores, considere
estes fatos e diretrizes:
As definies de disparadores podem incluir uma instruo ROLLBACK TRANSACTION, mesmo
que no exista uma instruo BEGIN TRANSACTION explcita.
Se uma instruo ROLLBACK TRANSACTION for encontrada, a transao inteira ser revertida.
Se uma instruo no script do disparador seguir a instruo ROLLBACK TRANSACTION, a
instruo ser executada. Portanto, poder ser necessrio usar uma clusula RETURN em uma
instruo IF para impedir o processamento de outras instrues.
_Se um disparador que contm uma instruo ROLLBACK TRANSACTION for acionado em uma
transao definida pelo usurio, essa instruo reverter a transao inteira. Um disparador
executado em um lote que executa uma instruo ROLLBACK TRANSACTION cancela o lote; as
instrues subseqentes do lote no sero executadas.

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.

5.2 Usos de disparadores


Os disparadores so usados com maior eficincia para manter a integridade de dados de baixo
nvel, e no para retornar os resultados de consultas. A sua principal vantagem que eles podem
conter uma lgica de processamento complexa. Os disparadores podem colocar em cascata as
alteraes atravs de tabelas relacionadas em um banco de dados, impor a integridade dos dados
mais complexos do que uma restrio CHECK, definir mensagens de erro personalizadas, manter
os dados desnormalizados e comparar os estados anteriores e posteriores dos dados que
sofreram modificaes.

Alteraes em cascata em tabelas relacionadas de um banco de dados


Voc pode usar um disparador para atualizaes e excluses em cascata atravs de tabelas
relacionadas em um banco de dados. Por exemplo, um disparador de excluso na tabela Products
(Produtos) do banco de dados Northwind pode excluir os registros correspondentes em outras
tabelas que possuem registros com os mesmos valores de ProductID (Identificao do produto)
excludos. Um disparador faz isso usando a coluna de chave externa ProductID como uma forma
de localizar registros na tabela Order Details (Detalhes do pedido).

Impor uma integridade de dados mais complexa do que uma restrio


CHECK
Ao contrrio das restries CHECK, os disparadores podem fazer referncia a colunas de outras
tabelas. Por exemplo, voc poderia colocar um disparador de insero na tabela Order Details que
verificasse a coluna UnitsInStock (Unidades em estoque) para esse item na tabela Products. O
disparador determinaria que quando o valor UnitsInStock fosse menor do que 10, a quantidade
mxima do pedido seria trs itens. Este tipo de verificao faz referncia a colunas em outras
tabelas. Fazer referncias a colunas em outras tabelas no permitido com uma restrio
CHECK. Voc pode usar disparadores para impor uma integridade referencial complexa das
seguintes maneiras: _ Executando uma ao ou efetuando atualizaes ou excluses em cascata.
A integridade referencial pode ser definida atravs do uso das restries FOREIGN KEY e
REFERENCE com a instruo CREATE TABLE. Os disparadores so teis para garantir aes
apropriadas quando excluses ou atualizaes em cascata devem ser efetuadas. Se existirem
restries na tabela de disparadores, elas sero verificadas antes da execuo do procedimento.
Se as restries forem violadas, o procedimento no ser executado.

67

Banco de Dados II

Criando disparadores de vrios registros.

Quando mais de um registro inserido, atualizado ou excludo, voc deve escrever um disparador
para manipular vrios registros.

Impondo a integridade referencial entre bancos de dados.

Definir mensagens de erro personalizadas


Ocasionalmente, sua implementao poder tirar vantagem de mensagens de erro personalizadas
que indicam o status de uma ao. Usando disparadores, voc poder chamar mensagens de erro
personalizadas predefinidas ou dinmicas quando ocorrerem certas condies durante a execuo
de um procedimento.

Manter dados desnormalizados


Os disparadores podem ser usados para manter a integridade de dados de baixo nvel em
ambientes de bancos de dados desnormalizados. A manuteno de dados desnormalizados
diferente da manuteno em cascata, visto que essa geralmente se refere manuteno de
relacionamentos entre valores de chaves primrias e externas. Em geral, os dados
desnormalizados so valores de dados projetados, derivados ou redundantes. Voc dever usar
um disparador se:
A integridade referencial exigir algo diferente de uma correspondncia exata, como, por exemplo, a
manuteno de dados derivados (vendas do ano at a data) ou a sinalizao de colunas (S ou N
para no para indicar se um produto est disponvel).
Voc precisar de mensagens personalizadas e mensagens de erro complexas.
Os dados redundantes e derivados geralmente requerem o uso de disparadores.

Comparar os estados anteriores e posteriores dos dados que esto


sendo modificados
Os disparadores permitem fazer referncia s alteraes efetuadas pela instruo INSERT,
UPDATE ou DELETE nos dados. Dessa maneira, possvel fazer referncia aos registros que
esto sendo afetados pelas instrues de modificao contidas no procedimento.
As restries, regras e padres podem comunicar erros somente atravs de mensagens de erro
padronizadas do sistema. Se o seu aplicativo exigir (ou puder tirar vantagem de) mensagens
personalizadas e o tratamento de erros mais complexos, voc dever usar um disparador.

68

Banco de Dados II

5.3 Consideraes sobre o uso de disparadores

Considere os fatos e diretrizes a seguir ao trabalhar com disparadores:


A maioria dos disparadores reativa; as restries e o disparador INSTEAD OF so pr-ativos. Os
disparadores so executados aps a execuo de uma instruo INSERT, UPDATE ou DELETE
na tabela em que o procedimento definido. Por exemplo, uma instruo UPDATE atualiza um
registro de uma tabela e, depois, o disparador dessa tabela executado automaticamente. As
restries so verificadas antes da execuo de uma instruo INSERT, UPDATE ou DELETE.
As restries so verificadas primeiro. Se existirem restries na tabela de disparadores, elas
sero verificadas antes da execuo do procedimento. Se as restries forem violadas, o
disparador no ser executado.
As tabelas podem conter vrios disparadores para uma ao. O Microsoft SQL Server permite o
aninhamento de vrios disparadores em uma nica tabela. Uma tabela poder conter vrios
disparadores definidos para ela. Cada procedimento poder ser definido para uma nica ou vrias
aes.
Os proprietrios das tabelas podem designar o primeiro e o ltimo disparador a ser acionado.
Quando vrios disparadores so colocados em uma tabela, o proprietrio da tabela pode usar o
procedimento armazenado do sistema sp_settriggerorder para especificar os primeiros
disparadores a serem acionados. A ordem do acionamento dos disparadores restantes no pode
ser definida.
Os proprietrios das tabelas devem ter permisso para executar todas as instrues definidas pelo
disparador. Somente o proprietrio da tabela, os participantes do cargo fixo do servidor sysadmin e
participantes dos cargos fixos do servidor db_owner e db_ddladmin podem criar e descartar
disparadores para essa tabela. Essas permisses no podem ser transferidas. Alm disso, o
criador do disparador tambm deve ter permisso para executar todas as instrues em todas as
tabelas afetadas. Se forem negadas permisses para qualquer parte das instrues Transact-SQL
contidas no disparador, a transao inteira ser revertida.
Os proprietrios das tabelas no podem criar disparadores AFTER em views ou tabelas
temporrias. No entanto, eles podem fazer referncia a views e tabelas temporrias.
Os proprietrios das tabelas podem criar disparadores INSTEAD OF em views e tabelas; dessa
forma, os disparadores INSTEAD OF estendem, em grande parte, os tipos de atualizaes para as
quais uma view pode oferecer suporte.
Os disparadores no devem retornar conjuntos de resultados. Assim como os procedimentos
armazenados, os disparadores contm instrues Transact-SQL e podem conter instrues que
retornam um conjunto de resultados. No entanto, a incluso de instrues que retornem valores
em disparadores no recomendada, pois os usurios ou desenvolvedores no esperam ver
nenhum conjunto de resultados quando uma instruo UPDATE, INSERT ou DELETE
executada.

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.

5.4 Criando disparadores


Crie disparadores usando a instruo CREATE TRIGGER. A instruo especifica a tabela em que
um disparador definido, os eventos para os quais ele executado e as suas instrues
especficas.
CREATE TRIGGER [proprietrio.] nome_do_disparador
ON [proprietrio.] nome_da_tabela
[WITH ENCRYPTION]
{{FOR | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}
AS
[IF UPDATE (nome_da_coluna)...]
[{AND | OR} UPDATE (nome_da_coluna)...]
instrues_sql}
Quando uma ao FOR UPDATE especificada, a clusula IF UPDATE (nome_da_coluna) pode
ser usada para enfocar a ao em uma coluna especfica que atualizada. Tanto FOR quanto
AFTER tm sintaxe igual criando o mesmo tipo de disparador, que acionado depois da ao
(INSERT, UPDATE ou DELETE).
Os disparadores INSTEAD OF cancelam a ao do disparador e executam uma nova ao.
Quando voc cria um disparador, as informaes sobre o mesmo so inseridas nas tabelas do
sistema sysobjects (objetos do sistema) e syscomments (comentrios do sistema). Se um
disparador for criado com o mesmo nome que outro existente, o novo procedimento sobrescrever
o original. O SQL Server no oferece suporte para a adio de disparadores definidos pelo usurio
nas tabelas do sistema; portanto, no ser possvel criar disparadores nessas tabelas.

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.

No pode conter certas instrues


O SQL Server no permite que as instrues a seguir sejam usadas na definio de um
disparador:
_ ALTER DATABASE
_ CREATE DATABASE
_ DISK INIT
_ DISK RESIZE
_ DROP DATABASE
_ LOAD DATABASE
_ LOAD LOG
_ RECONFIGURE
_ RESTORE DATABASE
_ RESTORE LOG
Para determinar as tabelas com disparadores, execute o procedimento armazenado do sistema
sp_depends <nome_da_tabela>. Para exibir a definio de um disparador, execute o
procedimento armazenado do sistema sp_helptext <nome_do_disparador>. Para determinar os
disparadores existentes em uma tabela especfica e suas aes, execute o procedimento
armazenado do sistema sp_helptrigger <nome_da_tabela>.
O exemplo a seguir cria um disparador na tabela Employees que impede que os usurios excluam
mais de um funcionrio por vez. O disparador acionado toda vez que um registro ou grupo de
registros excludo da tabela. O disparador verifica o nmero de registros que est sendo excludo
consultando a tabela Deleted. Se mais de um registro estiver sendo excludo, o disparador retorna
uma mensagem de erro personalizada e reverte a transao.

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

ALTER TRIGGER nome_do_disparador


ON tabela
[WITH ENCRYPTION]
{{FOR {[,] [DELETE] [,] [UPDATE] [,][INSERT]}
[NOT FOR REPLICATION]
AS
instruo_sql [...n] }
|
{FOR {[,] [INSERT] [,] [UPDATE]}
[NOT FOR REPLICATION]
AS
IF UPDATE (coluna)
[{AND | OR} UPDATE (coluna) [,...n]]
instruo_sql [...n] }
}
Este exemplo altera o disparador excludo criado no exemplo anterior. O contedo do novo
disparador fornecido, o que altera o limite de excluso de um registro para seis registros.
Use Northwind
GO
ALTER TRIGGER Empl_Delete ON Employees
FOR DELETE
AS
IF (SELECT COUNT(*) FROM Deleted) > 6
BEGIN
RAISERROR(
'You cannot delete more than six employees at a time.',
16, 1)
ROLLBACK TRANSACTION
END

73

Banco de Dados II

5.5 Desativando ou ativando um disparador


Voc pode desativar ou ativar um disparador especfico ou todos os disparadores de uma tabela.
Quando um disparador desativado, ele permanece definido para a tabela; no entanto, quando
uma instruo INSERT, UPDATE ou DELETE executada na tabela, as aes do procedimento
no sero executadas at que ele seja reativado.
Voc poder ativar ou desativar disparadores na instruo ALTER TABLE.
ALTER TABLE tabela
{ENABLE | DISABLE} TRIGGER
{ALL | nome_do_disparador [,n]}

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

5.6 Como funcionam os disparadores

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

Como funciona um disparador INSERT


Voc pode definir um disparador para que seja executado sempre que uma instruo INSERT
inserir dados em uma tabela. Quando um disparador INSERT acionado, novos registros so
adicionados tabela de disparadores e tabela inserted (inserido). A tabela inserted uma tabela
lgica que armazena uma cpia dos registros que foram inseridos. Essa tabela contm a atividade
de insero registrada no log da instruo INSERT. Ela permite que voc faa referncia aos
dados registrados no log da instruo INSERT que iniciou a operao. O disparador pode
examinar a tabela inserted para determinar se ou como as suas aes devem ser executadas. Os
registros da tabela inserted sempre so cpias de um ou mais registros da tabela de
procedimentos armazenados. Toda a atividade de modificao de dados (instrues INSERT,
UPDATE e DELETE) registrada no log, mas as informaes do log de transaes no podem ser
lidas. No entanto, a tabela inserted permite que voc faa referncia s alteraes registradas no
log que foram ocasionadas pela instruo INSERT. Depois, voc poder comparar as alteraes
com os dados inseridos para verific-las ou tomar outra ao. Tambm possvel fazer referncia
aos dados inseridos sem precisar armazenar as informaes em variveis.
O disparador neste exemplo foi criado para atualizar uma coluna (UnitsInStock) na tabela Products
sempre que um pedido solicitado (sempre que um registro inserido na tabela Order Details). O
novo valor definido como o valor anterior menos a quantidade solicitada.
USE Northwind
GO
CREATE TRIGGER OrdDet_Insert
ON [Order Details]
FOR INSERT
AS
UPDATE P SET
UnitsInStock = (P.UnitsInStock I.Quantity)
FROM Products AS P INNER JOIN Inserted AS I
ON P.ProductID = I.ProductID

75

Banco de Dados II

Como funciona um disparador DELETE


Quando um disparador DELETE acionado, os registros excludos da tabela afetada so
colocados em uma tabela especial chamada deleted (excludo). Essa uma tabela lgica que
armazena uma cpia dos registros que foram excludos. Ela permite que voc faa referncia aos
dados registrados no log da instruo DELETE que iniciou a operao. Considere os fatos a seguir
ao usar o disparador DELETE:
Quando um registro acrescentado tabela deleted, ele deixa de existir na tabela do banco de
dados; portanto, a tabela deleted e as tabelas do banco de
dados no apresentam registros em comum.
alocado espao da memria para criar a tabela deleted. Essa tabela est sempre no cache.
Um disparador definido para uma ao DELETE no executado para a instruo TRUNCATE
TABLE porque TRUNCATE TABLE no registrada no log.
O disparador neste exemplo foi criado para atualizar uma coluna Discontinued na tabela Products
sempre que uma categoria excluda (sempre que um registro excludo da tabela Categories).
Todos os produtos afetados so marcados com 1, indicando que eles so descontinuados.
USE Northwind
GO
CREATE TRIGGER Category_Delete
ON Categories
FOR DELETE
AS
UPDATE P SET Discontinued = 1
FROM Products AS P INNER JOIN deleted AS d
ON P.CategoryID = d.CategoryID

76

Banco de Dados II

Como funciona um disparador UPDATE


Uma instruo UPDATE pode ser analisada em duas etapas: a etapa DELETE que captura a
imagem anterior dos dados e a etapa INSERT que captura a imagem posterior dos dados. Quando
uma instruo UPDATE executada em uma tabela que contm um disparador definido, os
registros originais (imagem anterior) so movidos para a tabela deleted e os registros atualizados
(imagem posterior) so inseridos na tabela inserted. O disparador pode examinar as tabelas
deleted e inserted, bem como a tabela atualizada, para determinar se vrios registros foram
atualizados e como as aes do procedimento devem ser executadas. Voc pode definir um
disparador para monitorar as atualizaes de dados em uma coluna especfica usando a instruo
IF UPDATE. Isso permite que o disparador isole facilmente a atividade relativa a uma coluna
especfica. Ao detectar que a coluna foi atualizada, ele poder tomar a ao adequada, como, or
exemplo, gerar uma mensagem de erro inormando que a coluna no pode er atualizada ou
processar uma srie de instrues com base no valor da coluna atualizada recentemente.
Este exemplo impede que um usurio modifique a coluna a EmployeeID
(Identificao do funcionrio) na tabela Employees.
USE Northwind
GO
CREATE PROCEDURE Employee_Update
ON Employees
FOR UPDATE
AS
IF UPDATE (EmployeeID)
BEGIN TRANSACTION
RAISERROR ('Transaction cannot be processed.\
***** Employee ID number cannot be modified.', 10, 1)
ROLLBACK TRANSACTION

77

Banco de Dados II

Como funciona um disparador INSTEAD OF


Voc pode especificar um disparador INSTEAD OF em tabelas e views. Esse disparador
executado em vez da ao do disparador original. Os disparadores INSTEAD OF aumentam a
variedade de tipos de atualizaes que voc pode executar em uma view. Cada tabela ou view
limitada a um disparador INSTEAD OF para cada ao de disparo (INSERT, UPDATE ou
DELETE). Voc no pode criar um disparador INSTEAD OF em views que tm WITH CHECK
OPTION definido.
Este exemplo cria uma tabela com clientes na Alemanha e uma tabela com clientes no Mxico. Um
disparador INSTEAD OF colocado na view redireciona as atualizaes para a tabela subjacente
apropriada. A insero na tabela CustomersGer (Clientes da Alemanha) ocorre em vez de (instead
of) insero na view.
Crie duas tabelas com dados do cliente
USE ClassNorthwind
SELECT * INTO CustomersGer FROM Customers WHERE
Customers.Country = 'Germany'
SELECT * INTO CustomersMex FROM Customers WHERE
Customers.Country = 'Mexico'
GO

Crie uma view sobre esses dados


CREATE VIEW CustomersView AS
SELECT * FROM CustomersGer
UNION
SELECT * FROM CustomersMex
GO

78

Banco de Dados II

Crie um disparador INSTEAD OF sobre a view


CREATE TRIGGER Customers_Update2
ON CustomersView
INSTEAD OF UPDATE AS
DECLARE @Country nvarchar(15)
SET @Country = (SELECT Country FROM Inserted)
IF @Country = 'Germany'
BEGIN
UPDATE CustomersGer
SET CustomersGer.Phone = Inserted.Phone
FROM CustomersGer JOIN Inserted
ON CustomersGer.CustomerID = Inserted.CustomerID
END
ELSE
IF @Country = 'Mexico'
BEGIN
UPDATE CustomersMex
SET CustomersMex.Phone = Inserted.Phone
FROM CustomersMex JOIN Inserted
ON CustomersMex.CustomerID = Inserted.CustomerID
END
Teste o disparador atualizando a view
UPDATE CustomersView SET Phone = '030-007xxxx'
WHERE CustomerID = 'ALFKI'
SELECT CustomerID, Phone FROM CustomersView
WHERE CustomerID = 'ALFKI'
SELECT CustomerID, Phone FROM CustomersGer
WHERE CustomerID = 'ALFKI'

79

Banco de Dados II

5.7 Como funcionam os disparadores aninhados


Qualquer disparador pode conter uma instruo UPDATE, INSERT ou DELETE que afete outra
tabela. Quando o aninhamento est ativado, um disparador que altera uma tabela poder ativar
um segundo procedimento que, por sua vez, poder ativar um terceiro e assim por diante. O
aninhamento ativado durante a instalao, mas voc poder desativ-lo e reativ-lo usando o
rocedimento armazenado do sistema sp_configure
Os disparadores podem ser aninhados em at 32 nveis. Se um disparador em ma corrente
aninhada inicia um loop infinito, o nvel de aninhamento ultrapassado. Dessa forma, o disparador
termina e reverte a transao. Os disparadores aninhados podem ser usados para executar
funes, como o armazenamento de uma cpia de backup dos registros que foram afetados por
um disparador anterior. Considere os fatos a seguir ao usar disparadores aninhados:
Por padro, a opo de configurao de disparadores aninhados est ativada.
Um disparador aninhado no ser acionado duas vezes na mesma transao do disparador; um
disparador no se chama em resposta a uma segunda atualizao na mesma tabela no
disparador. Por exemplo, se um disparador modificar uma tabela que, por sua vez, modifique a
tabela do disparador original, o disparador no acionado novamente.
Como um disparador uma transao, uma falha em qualquer nvel de um conjunto de
disparadores aninhados cancelar a transao inteira, e todas as modificaes de dados sero
revertidas.

Verificando o nvel de aninhamento


Toda vez que um disparador aninhado acionado, o nvel de aninhamento incrementado. O SQL
Server oferece suporte para at 32 nveis de aninhamento, mas voc poder limitar os nveis para
evitar que o nvel mximo de aninhamento seja ultrapassado. Voc pode usar a funo
@@NESTLEVEL para ver os nveis atuais de aninhamento.
Determinando se o aninhamento deve ou no ser usado
O aninhamento um recurso poderoso que pode ser usado para manter a integridade dos dados
de um banco de dados. No entanto, ocasionalmente, talvez voc deseje desativ-lo. Se o
aninhamento for desativado, um disparador que modifica outra tabela no chamar nenhum dos
disparadores da segunda tabela. Use a instruo a seguir para desativar o aninhamento:
sp_configure nested triggers, 0 Voc pode decidir desativar o aninhamento porque:
Os disparadores aninhados requerem um projeto complexo e bem planejado. As alteraes em
cascata podem modificar dados que voc no tinha inteno de alterar.
Uma modificao de dados efetuada em qualquer ponto de uma srie de disparadores aninhados
aciona toda a srie de procedimentos. Embora esse recurso oferea uma poderosa proteo para
seus dados, ele poder ser um problema caso as suas tabelas devam ser atualizadas em uma
ordem especfica. Voc pode criar a mesma funcionalidade com ou sem o recurso de
aninhamento; no entanto, o projeto de seus disparadores ser bastante diferente.

80

Banco de Dados II

Ao criar disparadores aninhados, cada procedimento dever iniciar somente a prxima


modificao de dados . o projeto dever ser modular. Ao criar disparadores no aninhados, cada
procedimento dever iniciar todas as modificaes de dados que voc deseja que ele faa.
Este exemplo mostra como a colocao de um pedido faz com que o disparador OrDe_Update
seja executado. Este disparador executa uma instruo UPDATE na coluna UnitsInStock da tabela
Products. Quando a atualizao ocorre, ela aciona o disparador Products_Update e compara o
novo valor da ao no inventrio, mais a ao no pedido, com o nvel de reordenao. Se a ao
no inventrio mais a ao no pedido cair abaixo do nvel de reordenao, uma mensagem
enviada alertando ao comprador que compre mais aes.
USE Northwind
GO
CREATE TRIGGER Products_Update
ON Products
FOR UPDATE
AS
IF UPDATE (UnitsInStock)
IF (Products.UnitsInStock + Products.UnitsOnOrder) <
Products.ReorderLevel
BEGIN
-- Envie uma mensagem ao departamento de compras
END

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

Ativando um disparador de modo recursivo


Use a instruo a seguir para ativar disparadores recursivos: ALTER DATABASE ClassNorthwind
SET RECURSIVE_TRIGGERS ON sp_dboption nome_do_banco_de_dados, recursive triggers,
True Use o procedimento armazenado do sistema sp_settriggerorder para especificar um
disparador que seja acionado como o primeiro disparador AFTER, ou o ltimo disparador AFTER.
No h uma ordem fixa para a execuo de vrios disparadores definidos para um determinado
evento. Cada disparador deve ser independente. Se a opo de disparador aninhado estiver
desativada, a opo de disparador recursivo tambm estar, independente da configurao de
disparador recursivo do banco de dados.
As tabelas inserted e deleted referentes a um determinado disparador contm os registros que
correspondem somente ltima instruo UPDATE, INSERT ou DELETE que chamou o
disparador. At 32 nveis de recurso de disparadores so permitidos. Se qualquer disparador de
um loop recursivo provocar um loop infinito, o nvel de aninhamento ser ultrapassado, o
procedimento ser encerrado e a transao ser revertida.

Tipos de disparadores recursivos


H dois tipos diferentes de recurso:

Recurso direta, que ocorre quando um disparador aciona e


com
que
o
mesmo
disparador
seja
Por exemplo, um aplicativo atualiza a tabela T1, fazendo com
acionado. Trig1 atualiza a tabela T1 novamente, fazendo com
acionado novamente.

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.

executa uma ao que faz


acionado
novamente.
que o disparador Trig1 seja
que o disparador Trig1 seja

Determinando se disparadores recursivos devem ou no ser usados


Os disparadores recursivos so um recurso complexo que voc pode usar para solucionar
relacionamentos complexos, como relacionamentos de autoreferncia (tambm conhecidos como
fechamentos transitivos). Nessas situaes especiais, voc poder desejar ativar disparadores
recursivos. Os disparadores recursivos podem ser teis quando voc tiver que manter:
O nmero de colunas de relatrios na tabela employee quando a tabela contm uma coluna
employee ID (identificao do funcionrio) e outra manager ID (identificao do gerente).

82

Banco de Dados II

Por exemplo, suponha que dois disparadores de atualizao, tr_update_employee e


tr_update_manager, sejam definidos na tabela employee. O procedimento tr_update_employee
atualiza a tabela employee.
Uma instruo UPDATE aciona os disparadores tr_update_employee e tr_update_manager uma
vez. Alm disso, a execuo de tr_update_employee aciona a execuo de tr_update_employee
novamente (de modo recursivo) e de tr_update_manager.
Um grfico para dados de planejamento de produo em que exista uma hierarquia implcita de
planejamento.
Um sistema de controle de montagem no qual partes menores sejam controladas por suas partes
principais.
Considere as diretrizes a seguir antes de usar disparadores recursivos:
Os disparadores recursivos so complexos e precisam ser bem projetados e completamente
testados. Eles requerem um cdigo de lgica de loop controlado (verificao de trmino). Caso
contrrio, o limite de aninhamento de 32 nveis ser excedido.
Uma modificao de dados efetuada em qualquer ponto poder acionar a srie de disparadores.
Embora permita o processamento de relacionamentos complexos, isso poder ser um problema se
suas tabelas tiverem de ser atualizadas em uma ordem especfica.
Voc poder criar uma funcionalidade semelhante sem o recurso de disparadores recursivos; no
entanto, o projeto de seus disparadores ser bastante diferente. Ao criar disparadores recursivos,
cada procedimento dever conter uma verificao condicional para interromper o processamento
recursivo quando a condio se tornar falsa. Ao criar disparadores no recursivos, cada
procedimento dever conter as verificaes e estruturas completas de loop de programao.

5.8 Exemplos de disparadores

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.

Impondo a integridade dos dados


Os disparadores podem ser usados para manter a integridade dos dados efetuando alteraes em
cascata nas tabelas relacionadas em todo o banco de dados.

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

Impondo regras de negcios


Voc pode usar disparadores para impor regras de negcios que sejam muito complexas para a
restrio CHECK. Isso inclui verificar o status dos registros em outras tabelas.
Por exemplo, voc poder desejar garantir que as multas pendentes dos participantes sejam
pagas antes que eles possam acabar com a participao. Este exemplo cria um disparador que
determina se um produto tem um histrico de pedidos. Se ele tiver, DELETE revertido e o
disparador retorna uma mensagem de erro personalizada.
Use Northwind
GO
CREATE TRIGGER Product_Delete
ON Products FOR DELETE
AS
IF (Select Count (*)
FROM [Order Details] INNER JOIN deleted

84

Banco de Dados II

ON [Order Details].ProductID = Deleted.ProductID ) > 0


BEGIN
RAISERROR('Transaction cannot be processed. \
This product has order history.', 16, 1)
ROLLBACK TRANSACTION
END

5.9 Consideraes sobre o desempenho

Considere estas questes relacionadas ao desempenho ao usar disparadores.


Os disparadores funcionam com rapidez, pois as tabelas Inserted e Deleted encontram-se no
cache. As tabelas Inserted e Deleted esto sempre na memria, em vez de no disco, pois so
tabelas lgicas e geralmente so muito pequenas.
O nmero de tabelas referenciadas e o nmero de registros afetados determinam o tempo de
execuo.
O tempo gasto para chamar um disparador mnimo. A maior parte do tempo de execuo resulta
da referncia a outras tabelas (que podem estar na memria ou em disco) e da modificao dos
dados, se a definio do disparador determinar isso.
As aes contidas nos disparadores consistem em uma parte implcita de uma transao.
Depois que um disparador definido, a ao do usurio (instruo INSERT, UPDATE ou DELETE)
na tabela que executa o procedimento sempre uma parte implcita de uma transao, junto com
o disparador propriamente dito. Se uma instruo ROLLBACK TRANSACTION for encontrada, a
transao inteira ser revertida. Se existirem quaisquer instrues no script do disparador aps a
instruo ROLLBACK TRANSACTION, elas sero executadas. Portanto, poder ser necessrio
usar uma clusula RETURN em uma instruo IF para evitar o processamento de outras
instrues.
Laboratrio
Crie os seguintes disparadores:
1. Ao incluir um novo produto na compra verifique se existe estoque suficiente para realizar,
caso contrrio emita um aviso
2. Ao incluir um novo cliente emita um aviso que mostre o vendedor que realizou mais vendas
para a regio do mesmo

85

Banco de Dados II

3. Ao atualizar o valor de algum produto verifique a diferena entre os valores e exiba a


diferena entre as vendas realizadas com o antigo valor e o novo valor
4. Ao deletar algum cliente verifique se o mesmo tem vendas no ultimo ms e em caso
positivo crie uma tabela idntica a dos clientes com o mesmo ou se ela j existir apenas
insira o referido
5. Ao deletar um fornecedor verificar quando foi a ultima venda o mesmo e exibir a soma de
todas as vendas realizadas nesta data

86

Banco de Dados II

Unidade 6 -

Criando ndices

6.1 Criando e descartando 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.

Usando a instruo CREATE INDEX


Use a instruo CREATE INDEX para criar ndices. Voc tambm pode usar o Create Index
Wizard (Assistente para criao de ndices) no SQL Server Enterprise Manager (Gerenciador
corporativo do SQL Server). Ao criar um ndice em uma ou mais colunas de uma tabela, considere
os fatos e as diretrizes a seguir:
O SQL Server cria ndices automaticamente quando uma restrio PRIMARY KEY ou UNIQUE
criada em uma tabela. prefervel definir uma restrio PRIMARY KEY ou UNIQUE a criar ndices
padro.
Voc deve ser o proprietrio da tabela para executar a instruo CREATE INDEX.
possvel criar ndices em views.
O SQL Server armazena as informaes sobre ndices na tabela do sistema sysindexes.
Antes de criar um ndice em uma coluna, verifique se ela j contm ndices.
Mantenha seus ndices pequenos definindo-os em colunas pequenas. Em geral, ndices menores
so mais eficientes do que os que apresentam valores de chaves maiores.
Selecione as colunas com base na exclusividade, de modo que cada valor de chave identifique um
pequeno nmero de registros.
Quando voc cria um ndice de agrupamento, todos os ndices sem agrupamento existentes so
recriados.

87

Banco de Dados II

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ]


INDEX nome_do_ndice ON { tabela | view } ( coluna [ ASC | DESC ]
[ ,...n ] )
[WITH
[PAD_INDEX ]
[[,] FILLFACTOR = fator_de_preenchimento ]
[[,] IGNORE_DUP_KEY ]
[[,] DROP_EXISTING ]
[[,] STATISTICS_NORECOMPUTE ]
[[,] SORT_IN_TEMPDB ]
]
[ON grupo_de_arquivos ]
Este exemplo cria um ndice de agrupamento na coluna LastName (Sobrenome) da tabela
Employees (Funcionrios).
USE Northwind
CREATE CLUSTERED INDEX CL_lastname
ON employees(lastname)

Usando a instruo DROP INDEX


Use a instruo DROP INDEX para remover um ndice de uma tabela. Ao descartar um ndice,
considere os fatos a seguir:
O SQL Server recupera o espao em disco ocupado pelo ndice quando voc executa a instruo
DROP INDEX.
Voc no pode usar a instruo DROP INDEX nos ndices criados pelas restries PRIMARY KEY
ou UNIQUE. Ser necessrio descartar a restrio para descartar esses ndices.
Quando voc descartar uma tabela, todos os ndices da tabela tambm sero descartados.
Quando voc descartar um ndice de agrupamento, todos os ndices sem agrupamento da tabela
sero recriados automaticamente.
Voc dever estar no banco de dados em que o ndice reside para descart-lo.
No possvel usar a restrio DROP INDEX nas tabelas do sistema. DROP INDEX ndice.tabela
| ndice.view [, ...n ]

88

Banco de Dados II

Este exemplo descarta o ndice cl_lastname da tabela Employees (Funcionrios).


USE Northwind
DROP INDEX employees.CL_lastname

6.2 Criando ndices exclusivos


Os ndices exclusivos garantem que todos os dados da coluna indexada sejam exclusivos e no
contenham valores duplicados. Os ndices exclusivos garantem que os dados das colunas
indexadas sejam exclusivos. Se a tabela tiver uma restrio PRIMARY KEY ou UNIQUE, o SQL
Server criar um ndice exclusivo automaticamente quando voc executar a instruo CREATE
TABLE ou ALTER TABLE.
Garantindo que os dados das colunas indexadas sejam exclusivos
Crie um ndice exclusivo para ndices de agrupamento ou sem agrupamento quando os prprios
dados forem inerentemente exclusivos. No entanto, se for necessrio impor a exclusividade, crie
restries PRIMARY KEY ou UNIQUE na coluna em vez de criar um ndice exclusivo. Ao criar um
ndice exclusivo, considere os fatos e as diretrizes a seguir:
O SQL Server cria automaticamente ndices exclusivos nas colunas de uma tabela definida com
restries PRIMARY KEY ou UNIQUE.
Se a tabela contiver dados, o SQL Server verificar se existem valores duplicados quando voc
criar o ndice.
O SQL Server verificar se existem valores duplicados toda vez que voc usar a instruo INSERT
ou UPDATE. Se existirem valores de chaves duplicados, ele cancelar sua instruo e retornar
uma mensagem de erro com o primeiro valor duplicado.
Certifique-se de que cada registro tenha um valor exclusivo dois registros no podem ter o
mesmo nmero de identificao se um ndice exclusivo for criado nessa coluna. Essa regra
garante que cada entidade seja identificada de maneira exclusiva.
Crie ndices exclusivos somente nas colunas em que a integridade da entidade possa ser imposta.
Por exemplo, voc no criaria um ndice exclusivo na coluna LastName da tabela Employees
porque alguns funcionrios podem ter o mesmo sobrenome.
Este exemplo cria um ndice sem agrupamento exclusivo chamado U-CustID na tabela Customers
(Clientes). O ndice criado na coluna CustomerID (Identificao do cliente). O valor dessa coluna
deve ser exclusivo para cada registro da tabela.
USE Northwind
CREATE UNIQUE NONCLUSTERED INDEX U_CustID ON customers(CustomerID)

89

Banco de Dados II

6.3 Localizando todos os valores duplicados em uma


coluna
Se existirem valores de chaves duplicados quando voc criar um ndice exclusivo, a instruo
CREATE INDEX falhar. O SQL Server retornar uma mensagem de erro com o primeiro valor
duplicado, mas tambm podero existir outros valores duplicados. Use o script de exemplo a
seguir em qualquer tabela para localizar todos os valores duplicados em uma coluna. Substitua o
texto em itlico pelas informaes especficas sua consulta.
SELECT coluna_de_ndice, COUNT (coluna_de_ndice)
FROM nome_da_tabela
GROUP BY coluna_de_ndice
HAVING COUNT(coluna_de_ndice)>1 ORDER BY coluna_de_ndice

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

6.4 Criando ndices compostos


Os ndices compostos especificam mais de uma coluna como o valor de chave.
Crie ndices compostos:
Quando for mais eficiente pesquisar duas ou mais colunas como uma chave.
Se as consultas fizerem referncia somente s colunas do ndice.

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

6.5 Obtendo informaes sobre os ndices existentes


Voc poder precisar de informaes sobre os ndices existentes antes de criar, modificar ou
remover um ndice.

Usando o procedimento armazenado do sistema sp_helpindex


Voc pode usar o SQL Server Enterprise Manager ou executar o procedimento armazenado do
sistema sp_helpindex para obter informaes sobre ndices, como nome, tipo e opes de ndice
para uma tabela especfica.
Este exemplo lista os ndices da tabela Customers.
USE Northwind
EXEC sp_helpindex Customers
index_name
index_description
index_keys
PK_Customers clustered, unique, Primary Key located on PRIMARY CustomerID
PostalCode nonclustered located on PRIMARY PostalCode
City nonclustered located on PRIMARY City
Usando o procedimento armazenado do sistema sp_help nome_da_tabela
Voc tambm pode executar o procedimento armazenado do sistema sp_help nome_da_tabela
para obter informaes sobre ndices, bem como outras informaes sobre a tabela.
USE Northwind
EXEC sp_help Customers
Laboratrio
1. Localize os produtos que estiveram em mais de uma venda no mesmo ms.
2. Exiba estrutura de cada tabela do sistema

92

Banco de Dados II

3. Entre os produtos que foram vendidos em quantidades maiores a 10 itens em mais de 3


vendas
4. Localize produtos em que a mdia itens vendidos seja maior que a quantidade de produtos
em estoque
5. Monte uma consulta que retorne a quantidade de vezes em que cada produto utilizado
em uma venda, para os produtos vendidos em quantidades superiores a 10

93

Banco de Dados II

Unidade 7 consultas

Otimizando o desempenho de

7.1 Introduo ao otimizador de consultas


O conhecimento sobre a funo do otimizador de consultas na otimizao de consultas prepara
voc para criar ndices teis, escrever consultas eficientes e ajustar as consultas de baixo
desempenho.

Funo do otimizador de consultas


O otimizador de consultas o componente responsvel pela gerao do melhor plano de
execuo para uma consulta.
Determina o plano de execuo mais eficiente
O otimizador de consultas avalia cada instruo Transact-SQL e determina o plano de execuo
mais eficiente.
O otimizador de consultas calcula a E/S necessria para processar uma consulta:
Determinando se os ndices existem e calculando sua utilidade para uma consulta.
Determinando os ndices ou colunas que podem ser usados para reduzir o nmero de registros
examinados pela consulta. Com a reduo do nmero de registros examinados, a quantidade de
E/S reduzida, que o objetivo do desempenho da consulta.
Determinando a estratgia mais efetiva de processamento de operaes de associao, como a
ordem em que as tabelas devem ser associadas e a estratgia de associao a ser usada.
Usando a avaliao baseada em custos de alternativas para selecionar o plano mais eficiente para
determinada consulta.
Criando estatsticas de colunas para melhorar o desempenho da consulta.

Usa informaes adicionais


O otimizador de consultas usa informaes adicionais sobre os dados subjacentes e estruturas de
armazenamento, tamanho do arquivo e tipos de estruturas de arquivos. Ele tambm usa suas
prprias operaes internas, como a criao de ndices ou tabelas temporrias na memria, para
melhorar o desempenho de consultas.

94

Banco de Dados II

Produz um plano de execuo


O otimizador de consultas produz um plano de execuo que descreve a seqncia de etapas
necessria para executar uma consulta. Alm disso, otimiza o processo de localizao,
associao, agrupamento e ordenamento de registros.

7.2 Como o otimizador de consultas usa a otimizao


baseada em custos
O otimizador de consultas baseado em custos, o que significa que avalia cada plano de
execuo estimando o custo de execuo. As estimativas de custo s podem ter o mesmo grau de
exatido que os dados estatsticos disponveis sobre as colunas, ndices e tabelas.

Limita o nmero de planos de otimizao


Para ser executado em um perodo de tempo razovel, o otimizador de consultas limita o nmero
de planos de otimizao por ele considerado. Ao avaliar as seqncias das operaes relacionais
necessrias para produzir o conjunto de resultados, o otimizador de consultas alcana um plano
de execuo que tem o custo estimado mais baixo em termos perda de recursos de E/S e CPU.

Determina o tempo de processamento da consulta


O desempenho da consulta determinado pelos operadores fsicos usados pelo otimizador de
consultas e a seqncia em que as operaes so processadas. O objetivo reduzir:

O nmero de registros retornados.

O nmero de pginas lidas.

O tempo total de processamento minimizando os recursos de E/S e CPU usados para um


plano de execuo.

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

7.3 Como o otimizador de consultas funciona


Depois que uma consulta submetida, ocorrem vrias etapas que transformam a consulta original
em um formato que o otimizador de consultas pode interpretar.

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.

Rotinas de acesso a bancos de dados


O otimizador de consultas determina o melhor mtodo de acesso a dados, executando um exame
de tabela ou usando um ndice disponvel. O melhor mtodo ento aplicado.

96

Banco de Dados II

7.4 Fases de otimizao de consultas


O processo de otimizao de consultas constitudo de trs fases. Essas fases no so etapas de
processamento distintas e so usadas apenas para representar conceitualmente a atividade
interna do otimizador de consultas.

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.

7.5 Armazenando em cache o plano de execuo


O SQL Server possui um pool de memria usado para armazenar os planos de execuo e buffers
de dados. A porcentagem alocada pelo pool para os planos de execuo ou buffers de dados
oscila dinamicamente, de acordo com o estado do sistema. A parte do pool de memria usada
para armazenar os planos de execuo chamada cache de procedimento.

Armazenando um plano de execuo na memria


O plano de execuo em massa uma estrutura de dados somente leitura reutilizvel, que pode
ser usada por inmeros usurios. Nenhum contexto de usurio armazenado no plano de
execuo. Nunca h mais de duas cpias do plano de execuo na memria:
Uma cpia de todas as execues seriais.

97

Banco de Dados II

Outra cpia de todas as execues paralelas.


A cpia paralela inclui todas as execues paralelas, independentemente de seu grau de
paralelismo.

Usando um contexto de execuo


Cada usurio que executa uma consulta possui uma estrutura de dados que contm os dados
especficos a uma execuo, como valores de parmetro. Essa estrutura de dados chama-se
contexto de execuo. Quando uma instruo Transact-SQL executada, o SQL Server examina
o cache de procedimentos
para determinar se existe um plano de execuo para a mesma instruo Transact-SQL.
Se existir algum plano de execuo, o SQL Server o reutilizar. Esse procedimento economiza a
sobrecarga de recompilar a instruo Transact-SQL.
Se no existir um plano de execuo, o SQL Server gerar um novo para a consulta.

7.6 Recompilando os planos de execuo


Certas alteraes efetuadas em um banco de dados podem tornar um plano de execuo
ineficiente ou impreciso. Quando o SQL Server detecta alteraes que invalidam um plano de
execuo, marca-o como invlido. Um novo plano de execuo compilado para a prxima
conexo que executa a consulta. O desempenho pode ser melhorado atravs da reduo do
nmero de vezes que um plano recompilado. As condies que invalidam um plano de execuo
incluem:
Qualquer alterao estrutural efetuada em uma tabela ou view qual a consulta (instrues
ALTER TABLE e ALTER VIEW) faa referncia.
Novas estatsticas de distribuio geradas explicitamente em uma instruo, como UPDATE
STATISTICS, ou de forma automtica.
Descartar um ndice usado pelo plano de execuo.
Uma chamada explcita para o procedimento armazenado do sistema sp_recompile.
Diversas alteraes so efetuadas nas chaves (instruo INSERT ou DELETE) de uma tabela
qual a consulta faa referncia.
Para tabelas com disparadores, se o nmero de registros nas tabelas inseridas ou excludas
crescer de modo significativo.
O SQL Server usa um algoritmo de contagem de tempo para gerenciar eficientemente os planos
de execuo no cache, alm de avaliar o custo e uso do plano de execuo.

98

Banco de Dados II

7.7 Definindo um limite de custo


Convm controlar o custo de execuo de uma consulta definindo um limite de custo. O termo
custo da consulta refere-se ao tempo decorrido estimado, em segundos, necessrio para executar
uma consulta em uma configurao de hardware especfica.

Especificando um limite superior


Voc pode usar a opo query governor cost limit (limite de custos do regulador de consultas) para
impedir que consultas de longa durao sejam executadas e consumam os recursos do sistema.
Por padro, possvel executar as consultas, seja qual for sua durao. O regulador de consultas
usa um custo estimado para impedir que as consultas com um alto custo sejam executadas.
Embora o valor da configurao seja especificado em segundos, no se correlaciona
verdadeiramente ao tempo, mas ao custo estimado real da consulta.
possvel especificar um limite superior do custo da consulta a ser executada. Como o regulador
de consultas baseado no custo estimado da consulta, em vez de no tempo decorrido real, no
possui sobrecarga de tempo de execuo. Se o custo estimado de uma consulta for maior que o
limite de custo especificado, a instruo do regulador de consultas impedir que a consulta seja
executada. Essa ao ser mais eficiente que permitir que uma consulta seja executada, at que
algum limite predefinido seja alcanado, e depois interromper sua execuo.

Especificando limites de conexo


possvel especificar limites para todas as conexes ou para apenas as consultas referentes a
uma conexo especfica. Para aplicar limites de custo ao regulador de consultas, voc pode:
Usar o procedimento armazenado sp_configure para aplicar limites a todas as conexes. S ser
possvel alterar o limite de custo do regulador de consultas quando show advanced options for
definida como 1. A configurao ter efeito imediatamente. No ser necessrio par-la e reiniciar
o servidor.
Execute a instruo SET QUERY_GOVERNOR_COST_LIMIT para aplicar limites para uma
conexo especfica.
Especifique 0 (o padro) para desativar o regulador de consultas. Nesse caso, todas as consultas
sero executadas sem limites.

7.8 Obtendo informaes sobre planos de execuo


O otimizador de consultas responde s informaes disponveis durante a determinao do melhor
plano de execuo. Voc pode obter informaes sobre o plano de execuo consultando a tabela
sysindexes. Tambm possvel obter informaes usando as instrues STATISTICS e
SHOWPLAN e exibindo graficamente o plano de execuo.

99

Banco de Dados II

Exibindo a sada de instrues STATISTICS


Voc pode usar as instrues STATISTICS IO, STATISTICS TIME e STATISTICS PROFILE para
obter informaes que podem ajud-lo a diagnosticar consultas de longa durao. A sada das
instrues STATISTICS fornece informaes sobre o plano de execuo real. STATISTICS TIME
obtm informaes sobre o nmero de milissegundos necessrios para analisar, compilar e
executar cada instruo.
STATISTICS PROFILE exibe as informaes de perfil referentes a uma instruo. Quando voc
executa uma consulta, a sada da instruo SHOWPLAN_ALL e as duas colunas adicionais so
includas no conjunto de resultados
STATISTICS IO obtm informaes sobre a quantidade de leituras de pgina geradas por
consultas.

Exibindo a sada de SHOWPLAN_ALL e de SHOWPLAN_TEXT


Voc pode usar as instrues SET SHOWPLAN_TEXT e SET SHOWPLAN_ALL para obter
informaes detalhadas sobre como as consultas so executadas e quantos recursos so
necessrios para processar a consulta.
Estrutura da sada da instruo SHOWPLAN

A sada da instruo SHOWPLAN:


Retorna as informaes como um conjunto de registros.
Forma uma rvore hierrquica.
Representa as etapas usadas pelo otimizador de consultas para executar cada instruo.
Mostra os valores estimados de como uma consulta foi otimizada, e no o plano de execuo real.
Os valores estimados so baseados em estatsticas existentes.
Detalhes das etapas de execuo
Cada instruo refletida na sada contm um nico registro com o texto da instruo, seguido de
vrios registros com os detalhes das etapas de execuo.
Os detalhes das etapas de execuo incluem:
Os ndices que so usados com determinadas tabelas.
A ordem de associao das tabelas.
O modo de atualizao escolhido.
As tabelas de trabalho e outras estratgias.

100

Banco de Dados II

Diferena entre a sada de SHOWPLAN_TEXT e de SHOWPLAN_ALL


A diferena entre a sada SHOWPLAN_TEXT e SHOWPLAN_ALL que a ltima retorna
informaes adicionais, como os registros estimados, E/S, CPU e o tamanho de registro mdio da
consulta. As instrues SET permanecem ativas em relao sesso at que voc especifique a
opo OFF, ou at que finalize a sesso.

7.9 Exibindo graficamente o plano de execuo


Voc pode usar o SQL Query Analyzer (Analisador de consultas do SQL) para exibir graficamente
um plano de execuo codificado por cores.

Elementos do plano de execuo grfico


O plano de execuo grfico, que contm os elementos a seguir, usa cones para representar a
execuo de partes especficas das instrues e consultas: Etapas so unidades de trabalho
usadas para processar uma consulta. Seqncia de etapas a ordem em que as etapas so
processadas. Os operadores lgicos descrevem a operao algbrica relacional usada para
processar uma instruo; por exemplo, a execuo de uma agregao. Em geral, o operador
lgico corresponde ao operador fsico. Nem todas as etapas usadas para processar uma consulta
ou atualizar operaes envolvem operaes lgicas. Os operadores fsicos descrevem o algoritmo
de implementao fsica usado para processar uma instruo; por exemplo, o exame de um ndice
de agrupamento. Cada etapa da execuo de uma consulta ou operao de atualizao envolve
um operador fsico.

Lendo a sada do plano de execuo grfico


A sada do plano de execuo grfico lida da direita para a esquerda e de cima para baixo. Cada
consulta no lote analisado exibida, inclusive o custo de cada consulta como uma porcentagem do
custo total do lote.
Cada etapa pode ter um ou vrios ns a serem processados. O termo n referese a uma operao
usada pelo otimizador de consultas, que representado por um cone.
O plano de execuo pode ter vrios ns para uma etapa especfica.
Cada n relacionado a um n pai.
Todos os ns com o mesmo pai so dispostos na mesma coluna.
As pontas de seta conectam-se ao n e a seu pai.
As operaes recursivas so mostradas com um smbolo de iterao.
Os operadores so mostrados como smbolos relacionados a um pai especfico.
Quando o lote contm vrias instrues, vrios planos de execuo so desenhados.

101

Banco de Dados II

Exibindo informaes adicionais


Ao posicionar o ponteiro sobre cada n (representado por um cone), voc pode visualizar
informaes detalhadas sobre os operadores fsicos e lgicos.

102

Banco de Dados II

Unidade 8 -

Criando Cursores

8.1 Introduo sobre cursores


Os Cursores so utilizados quando precisamos executar uma ou mais aes em cada registro
individualmente retornado por determinada consulta.
Antes de utilizamos os bancos de dados relacionais, em que o armazenamento ocorria nos
arquivos textos e flat files, como o dBase, o acesso aos dados era realizado seqencialmente.
Se houvesse a necessitasse acessar vrios elementos de uma s vez era necessria a utilizao
de um lao (comando While, por exemplo) para acessar os registros necessrios.
No SQL Server, assim como em qualquer SGBD isso no mais necessrio, pois com o modelo
relacional de banco de dados, so acessados vrios registros de uma s vez atravs dos
comandos SELECT, UPDATE e DELETE.
A quantidade de linhas retornadas depende do tamanho da tabela e da forma com que so
buscados em conjunto com a clusula WHERE, que realiza uma filtragem nos dados selecionados.
Contudo, existem situaes em que trazer os registros de uma s vez no conveniente ou
possvel para realizar certos tipos de operaes, onde necessrio obter resultado de cada linha
uma a uma. Nestes casos os SGBDs atuais fornecem um recurso bastante interessante,
chamados cursores.
O cursor uma instruo SELECT que ser acessada linha a linha atravs de um lao While e
alguns comandos especficos para cursores e utilizado normalmente em procedimentos
armazenados (stored procedures).

8.2 Declarando um cursor


Para criarmos um curso deveremos em primeiro lugar definir a instruo SELECT que ele
acessar. Vamos utilizar uma consulta que nos mostre quantidade de produtos em vendidos em
uma determinada venda, para isso vamos usar uma varivel de controle @orderid que vir de um
procedimento.
--Select utilizado para o cursor
SELECT productid, quantity FROM [order details] WHERE orderid = @orderid

103

Banco de Dados II

recomendado que execute a instruo de SELECT para verificar se o resultado o esperado.


Aps isso, deve ser utilizado o comando DECLARE, que serve para declarar variveis e o cursor.
A varivel @orderid ser um parmetro do procedimento, logo no necessita declarao. Abaixo
est a declarao do cursor.
--Declarando cursor
DECLARE CursorDosItens --Nome do cursor
CURSOR FOR
-- Select utilizado para o cursor
SELECT productid, quantity FROM [order details] WHERE orderid = @orderid

8.3 Abrindo um cursor


Realizada a declarao do cursor necessrio realizar a abertura dele buscando o primeiro
registro.
Para isto sero declaradas variveis que recebero o cdigo do produto e a quantidade vendida,
atravs do comando FETCH.
O comando FETCH NEXT traz a prxima linha do SELECT, contudo o comando FETCH pode ser
usado em conjunto com outras clusulas para outros comportamentos, como o FETCH PRIOR
(Anterior), FETCH FIRST (Primeiro), FETCH LAST (ltimo), entre outros.
--Declarando variveis
DECLARE @productid INTEGER, @quantity DOUBLE
--Abrindo cursor
OPEN CursorDosItens
--Atribuindo valores do select nas variveis
FETCH NEXT FROM CursorDosItens INTO @productid, @quantity

104

Banco de Dados II

8.4 Percorrendo um cursor


Aps definirmos os valores da primeira linha de retorno, necessrio acessar as demais linhas,
pois est a finalidade do mesmo.
Para isso ser utilizado um lao (WHILE) em conjunto com a varivel global do SQL Server
@@FETCH_STATUS.
Esta varivel retorna 0 (zero) caso o ltimo comando de FETCH tenha sido executado com
sucesso e tenha retornado dados e 1 caso no haja mais dados (EOF fim de arquivo).
Por fim utilizamos os comandos CLOSE , para fechar o cursor e DEALLOCATE, para elimin-lo da
memria, pois caso o procedimento seja executado novamente, pode apresentar erro na
declarao do cursor, caso o cursor ainda exista.
O lao descrito abaixo:
--Iniciando lao
WHILE @@FETCH_STATUS = 0
BEGIN
--Prxima linha do cursor
FETCH NEXT FROM CursorDosItens INTO @productid, @quantity
END
--Fechando e desalocando cursor
CLOSE CursorDosItens
DEALLOCATE CursorDosItens

8.5 Executando comandos em um cursor


De posse do cdigo do produto e da quantidade em de itens comprados na venda atual podemos
baixar o estoque na tabela de produtos(products) com o cuidado de no deixarmos os estoque
negativo, o que poderia ser feito atravs de uma restrio de domnio (check) na tabela de
estoque, entretanto neste exemplo utilizaremos uma verificao com um SELECT na tabela de
estoque.

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

8.6 Confirmando ou retornando um cursor


Para finalizar, caso tudo tenha ocorrido com sucesso, devemos finalizar a venda propriamente dita,
mudando o campo shipvia de 0 para 1.
Uma prtica muito recomendada trabalhar com transao, pois caso um item d problemas, os
demais que j teriam sido baixados devem ser retornados.
Desta forma o procedimento completo ficaria como descrito:

106

Banco de Dados II

--Procedimento para finalizao de uma venda


CREATE PROCEDURE realiza_venda (@orderid INTEGER) AS
--Declarando cursor
DECLARE CursorDosItens --Nome do cursor
CURSOR FOR
-- Select utilizado para o cursor
SELECT productid, quantity FROM [order details] WHERE orderid = @orderid
--Declarando variveis
DECLARE @productid INTEGER, @quantity DOUBLE
--Iniciando transao
BEGIN TRANSACTION
--Abrindo cursor
OPEN CursorDosItens
--Atribuindo valores do select nas variveis
FETCH NEXT FROM CursorDosItens INTO @productid, @quantity
--Iniciando lao
WHILE @@FETCH_STATUS = 0
BEGIN
IF (SELECT unitinstock
@productid) >= 0

@quantity

FROM

products

WHERE

productid

UPDATE products

107

Banco de Dados II

SET unitinstock = unitinstock - @quantity


WHERE productid = @productid
ELSE
BEGIN
--Desfazendo o que foi realizado anteriormente
ROLLBACK TRANSACTION
--Levantando erro
RAISERROR(Abaixo do estoque mnimo, 15, 1)
--Fechando e desalocando cursor aqui tambm, pois o return sair do
procedimento
CLOSE CursorDosItens
DEALLOCATE CursorDosItens
--Saindo do procedimento
RETURN
END
--Prxima linha do cursor
FETCH NEXT FROM CursorDosItens INTO @productid, @quantity
END
--Fechando e desalocando cursor
CLOSE CursorDosItens
DEALLOCATE CursorDosItens
--Caso tudo tenha ocorrido OK, alterando a situao da venda

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

9.1 Introduo sobre XSD


Com de conhecimento de todos, o SQL Server fornece armazenamento nativo de dados XML
por meio do tipo de dados XML.
Podemos, opcionalmente, associar esquemas XML a uma varivel ou a uma coluna de
tipo XML por meio de uma coleo de esquema XML. A coleo de esquema XML armazena os
esquemas XML importados e, em seguida, usada para fazer o seguinte:

Validar instncias 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.

9.2 Criando um esquema XSD


Para criarmos um esquema XML (XSD) utilizamos uma instruo CREATE XML SCHEMA
COLLECTION (Transact-SQL)

110

Banco de Dados II

CREATE XML SCHEMA COLLECTION MeuEsquema AS N'


<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Funcionario" sql:relation="dbo.Employees" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="FName"
sql:field="FirstName"
type="xsd:string" />
<xsd:element name="LName"
sql:field="LastName"
type="xsd:string" />
</xsd:sequence>
<xsd:attribute name="FId"
sql:field="employeedid"
type="xsd:integer" />
</xsd:complexType>
</xsd:element>
</xsd:schema>'

9.3 Associando um esquema XSD


No momento da criao de uma tabela podemos associar um campo do tipo de dado XML a um
esquema previamente criado:
[campo] [xml](CONTENT [dbo].[MeuEsquema])
Os dados em XML armazenados em uma coluna ou varivel qual um esquema est associado
so referidos como XML com tipo porque o esquema fornece as informaes necessrias do tipo
de dados para os dados da instncia.
O SQL Server usa essas informaes de tipo para otimizar o armazenamento de dados. No
processamento de consultas tambm utilizado o esquema para verificao de tipo e otimizar
modificao de dados e consultas.
Alm disso, o SQL Server usa a coleo de esquema XML associada, no caso de XML com tipo
de dados de uma coluna para validar a instncia XML. Se a instncia XML estiver de acordo com o

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.

9.4 Alterando um esquema XSD


possvel alterar componentes do esquema em um objeto de coleo existente no banco de
dados usando a instruo ALTER XML SCHEMA COLLECTION (Transact-SQL).

ALTER XML SCHEMA COLLECTION MeuEsquema ADD '


<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://MySchema/test_xml_schema">
<element name="outroElemento" type="byte"/>
</schema>'

9.5 Deletando um esquema XSD


Para deletar um esquema XSD de nosso banco de dados basta utilizarmos a intruo DROP XML
SCHEMA COLLECTION.
Veja o script abaixo
DROP XML SCHEMA COLLECTION MeuEsquema
GO

112

Banco de Dados II

Laboratrio
Para realizar o exerccio crie a seguinte tabela:

1. Crie um esquema XML para a estrutura de clientes e insira 5 registros


2. Crie um esquema XML para a estrutura de fornecedores e insira 5 registros
3. Crie um esquema XML para a estrutura de produtos e insira 5 registros
4. Crie um esquema XML para a estrutura de categorias e insira 5 registros
5. Crie um esquema XML para a estrutura de territrios e insira 5 registros

113

Banco de Dados II

Unidade 10 - Agente de Servios


10.1 Introduo sobre Agente de Servios
O SQL Server Agent um servio do Windows que executa tarefas administrativas agendadas,
que so chamadas de trabalhos. O SQL Server Agent usa o SQL Server para armazenar
informaes de trabalhos.
Estes trabalhos contm uma ou mais etapas de trabalho, e cada etapa contm sua prpria tarefa;
por exemplo, fazer o backup de um banco de dados.
O SQL Server Agent pode executar um trabalho de uma agenda, em resposta a um evento
especfico ou sob demanda. Por exemplo, se desejar fazer o backup de todos os servidores da
empresa todo dia aps o expediente, voc pode automatizar essa tarefa. Agende o backup para
execuo aps as 22:00, de segunda a sexta; se o backup encontrar um problema, o SQL Server
Agent poder registrar o evento e notific-lo.
Caso ocorra algum erro na execuo de um trabalho agendado, os trabalhos que esto vinculados
a este trabalho que gerou erro so executados at que um novo erro ocorra novamente.

10.2 Iniciando o Agente de Servios


Por padro, o servio do SQL Server Agent encontra-se desabilitado quando o SQL Server 2005
ou posterior instalado, a menos que o usurio escolha, de maneira explcita, iniciar
automaticamente o servio.
Inicie uma instncia de servio do SQL Server ou do SQL Server Agent a partir de um prompt de
comando com o comando net start ou executando o sqlservr.exe.
Ou siga os seguintes passos:
1. No menu Iniciar, aponte para Todos os Programas, aponte para Microsoft SQL Server,
aponte para Ferramentas de Configurao e clique em SQL Server Configuration
Manager.
2. No SQL Server Configuration Manager, expanda Servios e clique em SQL Agent.
3. No painel de resultados, clique com o boto direito do mouse em qualquer instncia e
depois clique em Iniciar.
Uma seta verde no cone prximo ao SQL Server Agent e na barra de ferramentas indica
que o SQL Server Agent foi iniciado com xito.

114

Banco de Dados II

4. Clique em OK.

10.3 Criando um trabalho


Para que uma determinada ao ocorra momentaneamente ou em um tempo determinando
necessrio criar o que chamamos de trabalho.
Para tal execute os seguintes passos:
1. No Pesquisador de Objetos, conecte-se a uma instncia do Mecanismo de banco de
dados do SQL Server e expanda-a.
2. Expanda o SQL Server Agent.
3. Clique com o boto direito do mouse em Trabalhos e clique em Novo Trabalho.
4. Na pgina Geral, na caixa Nome, digite um nome para o trabalho.
5. Desmarque a caixa de seleo Habilitado se no quiser executar o trabalho
imediatamente aps a sua criao. Por exemplo, se voc quiser testar um trabalho antes
agend-lo para execuo, desabilite-o.
6. Na caixa Descrio, insira uma descrio do que o trabalho faz. O nmero mximo de
caracteres 512.

10.4 Para criar uma etapa de trabalho Transact-SQL


Um trabalho formado por uma ou mais etapas. Estas etapas so as aes propriamente ditas
que o trabalho ir executar.
Siga os seguintes passos;
1. No Pesquisador de Objetos, conecte-se a uma instncia do Mecanismo de banco de
dados do SQL Server e expanda-a.
2. Expanda SQL Server Agent, crie um novo trabalho ou clique com o boto direito do mouse
em um trabalho existente e, em seguida, clique em Propriedades.
Para obter mais informaes sobre como criar um trabalho, consulte Criando trabalhos.
3. Na caixa de dilogo Propriedades do Trabalho, clique na pgina Etapas e, em seguida,
em Nova.

115

Banco de Dados II

4. Na caixa de dilogo Nova Etapa de Trabalho, digite o Nome da etapa de trabalho.


5. Na lista Tipo, clique em Script Transact-SQL (TSQL).
6. Na caixa Comando, digite os lotes de comandos Transact-SQL ou clique em Abrir para
selecionar um arquivo Transact-SQL a ser usado como comando.
7. Clique em Analisar para verificar a sintaxe.
8. A mensagem "xito da anlise" ser exibida se a sintaxe estiver correta. Se um erro for
encontrado, corrija a sintaxe antes de continuar.
9. Clique na pgina Avanado para definir opes para a etapa de trabalho, tais como: que
ao deve ser adotada em caso de xito ou falha da etapa, quantas vezes o SQL Server
Agent deve tentar executar a etapa e em que arquivo ou tabela o SQL Server Agent deve
gravar a sada da etapa de trabalho. S membros da funo de servidor
fixa sysadmin podem gravar a sada de etapas de trabalho em um arquivo do sistema
operacional. Todos os usurios do SQL Server Agent podem registrar a sada em uma
tabela.
10. Se voc for membro da funo de servidor fixa sysadmin e desejar executar a etapa de
trabalho como um logon SQL diferente, selecione esse logon na lista Executar como
usurio.

10.5 Para criar e anexar uma agenda a um trabalho


Aps ter criado um trabalho e gerado tarefas para o mesmo necessrio criar e anexar
uma agenda a ele.
Para isso siga os seguintes passos:
1. No Pesquisador de Objetos, conecte-se instncia do Mecanismo de banco de dados do
SQL Server e expanda-a.
2. Expanda SQL Server Agent, expanda Trabalhos, clique com o boto direito do mouse no
trabalho que deseja agendar e clique em Propriedades.
3. Selecione a pgina Agendas e clique em Nova.
4. Na caixa Nome, digite um nome para a nova agenda.
5. Desmarque a caixa de seleo Habilitado se no quiser que a agenda entre em vigor
imediatamente aps a sua criao.
6. Para Tipo de Agenda, siga um destes procedimentos:

116

Banco de Dados II

Clique em Iniciar automaticamente quando o SQL Server Agent for


iniciado para iniciar o trabalho quando o servio do SQL Server Agent for iniciado.

Clique em Iniciar quando as CPUs estiverem ociosas para iniciar o trabalho


quando as CPUs atingirem uma condio de ociosidade.

Clique em Recorrente se desejar que a agenda seja executada seguidamente.


Para definir a agenda recorrente, complete os grupos Freqncia, Freqncia
Diria e Durao na caixa de dilogo.

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

Unidade 11 - Projeto Final


11.1 Situao Problema
Construa o seguinte bando de dados para uma empresa de vendas de ingressos on-line:
O sistema deve possuir controle de usurio e senha.
A empresa controla a venda de ingressos para determinados eventos, que pode ser de tipos
diferentes
Os ingressos so de tipos e valores diferentes
Cada evento tem um ou mais contratantes diferentes
Todo evento possui uma ou mais atraes que por sua vez so classificadas por categorias
Deve existir um controle de lotao do evento por tipo de igresso.
possvel realizar um controle de over booking (excesso de vendas)
Relatrio de vendas dirio
Permite vrias formas de pagamento
Venda com marcao de lugar
Log de atividades dos usurios
Fechamento de caixa por caixa/usurio.
Histrico detalhado de todas as vendas.
Permite desfazer vendas indevidas.
Permite emisso de cupons de venda de produtos. (apenas venda)
Vendas e renovaes on-line de ingressos para temporada

118