Вы находитесь на странице: 1из 129

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

SQL ........................................................................................................................................................... 3

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 ................................................................................................................................................. 11 OPERADORES ............................................................................................................................................................. 14 EXPRESSES .............................................................................................................................................................. 16 ELEMENTOS DE LINGUAGEM DE CONTROLE DE FLUXO ......................................................................................................... 17 IMPLEMENTANDO VIEWS ...................................................................................................................... 21

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

O QUE SO VIEWS ...................................................................................................................................................... 21 VANTAGENS DAS VIEWS ............................................................................................................................................... 22 CRIANDO VIEWS ......................................................................................................................................................... 23 RESTRIES S DEFINIES DE VIEWS ............................................................................................................................. 24 ALTERANDO E DESCARTANDO VIEWS............................................................................................................................... 25 OCULTANDO DEFINIES DE VIEWS ................................................................................................................................ 27 MODIFICANDO DADOS ATRAVS DE VIEWS ....................................................................................................................... 28 OTIMIZANDO O DESEMPENHO COM O USO DE VIEWS ......................................................................................................... 29 USANDO VIEWS INDEXADAS .......................................................................................................................................... 30 PRTICAS RECOMENDADAS ........................................................................................................................................... 31 IMPLEMENTANDO PROCEDIMENTOS ARMAZENADOS ........................................................................... 33

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

DEFININDO PROCEDIMENTOS ARMAZENADOS ................................................................................................................... 33 PROCESSAMENTO INICIAL DE PROCEDIMENTOS ARMAZENADOS ............................................................................................ 34 PROCESSAMENTO SUBSEQENTE DE PROCEDIMENTOS ARMAZENADOS .................................................................................. 36 VANTAGENS DOS PROCEDIMENTOS ARMAZENADOS ........................................................................................................... 37 CRIANDO PROCEDIMENTOS ARMAZENADOS ..................................................................................................................... 37 ANINHANDO PROCEDIMENTOS ARMAZENADOS ................................................................................................................. 39 DIRETRIZES PARA A CRIAO DE PROCEDIMENTOS ARMAZENADOS ........................................................................................ 39 EXECUTANDO PROCEDIMENTOS ARMAZENADOS................................................................................................................ 40 ALTERANDO PROCEDIMENTOS ARMAZENADOS.................................................................................................................. 42 DESCARTANDO PROCEDIMENTOS ARMAZENADOS .............................................................................................................. 44 USANDO PARMETROS EM PROCEDIMENTOS ARMAZENADOS .............................................................................................. 44 RETORNANDO VALORES COM PARMETROS DE SADA ........................................................................................................ 49 RECOMPILANDO EXPLICITAMENTE PROCEDIMENTOS ARMAZENADOS ..................................................................................... 50 TRATANDO MENSAGENS DE ERRO .................................................................................................................................. 52 DEMONSTRAO: TRATANDO MENSAGENS DE ERRO.......................................................................................................... 58 PRTICAS RECOMENDADAS ........................................................................................................................................... 61 IMPLEMENTANDO FUNES DEFINIDAS PELO USURIO........................................................................ 62

UNIDADE 4 4.1 4.2 4.3 4.4 4.5

O QUE UMA FUNO DEFINIDA PELO USURIO? ............................................................................................................. 62 CRIANDO UMA FUNO DEFINIDA PELO USURIO .............................................................................................................. 62 ALTERANDO E DESCARTANDO FUNES DEFINIDAS PELO USURIO ........................................................................................ 64 EXEMPLOS DE FUNES DEFINIDAS PELO USURIO............................................................................................................. 65 PRTICAS RECOMENDADAS ........................................................................................................................................... 70 IMPLEMENTANDO DISPARADORES ........................................................................................................ 71

UNIDADE 5 5.1 5.2

O QUE SO DISPARADORES? ......................................................................................................................................... 71 USOS DE DISPARADORES .............................................................................................................................................. 72

5.3 5.4 5.5 5.6 5.7 5.8 5.9

CONSIDERAES SOBRE O USO DE DISPARADORES ............................................................................................................. 75 CRIANDO DISPARADORES.............................................................................................................................................. 76 DESATIVANDO OU ATIVANDO UM DISPARADOR ................................................................................................................. 80 COMO FUNCIONAM OS DISPARADORES ........................................................................................................................... 80 COMO FUNCIONAM OS DISPARADORES ANINHADOS........................................................................................................... 87 EXEMPLOS DE DISPARADORES........................................................................................................................................ 91 CONSIDERAES SOBRE O DESEMPENHO ......................................................................................................................... 93 CRIANDO NDICES .................................................................................................................................. 95

UNIDADE 6 6.1 6.2 6.3 6.4 6.5

CRIANDO E DESCARTANDO NDICES................................................................................................................................. 95 CRIANDO NDICES EXCLUSIVOS ....................................................................................................................................... 97 LOCALIZANDO TODOS OS VALORES DUPLICADOS EM UMA COLUNA ........................................................................................ 98 CRIANDO NDICES COMPOSTOS ...................................................................................................................................... 98 OBTENDO INFORMAES SOBRE OS NDICES EXISTENTES................................................................................................... 100 OTIMIZANDO O DESEMPENHO DE CONSULTAS .................................................................................... 102

UNIDADE 7 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9

INTRODUO AO OTIMIZADOR DE CONSULTAS ................................................................................................................ 102 COMO O OTIMIZADOR DE CONSULTAS USA A OTIMIZAO BASEADA EM CUSTOS.................................................................... 103 COMO O OTIMIZADOR DE CONSULTAS FUNCIONA ............................................................................................................ 104 FASES DE OTIMIZAO DE CONSULTAS .......................................................................................................................... 105 ARMAZENANDO EM CACHE O PLANO DE EXECUO ......................................................................................................... 105 RECOMPILANDO OS PLANOS DE EXECUO..................................................................................................................... 106 DEFININDO UM LIMITE DE CUSTO ................................................................................................................................. 108 OBTENDO INFORMAES SOBRE PLANOS DE EXECUO.................................................................................................... 108 EXIBINDO GRAFICAMENTE O PLANO DE EXECUO ........................................................................................................... 110 CRIANDO CURSORES ............................................................................................................................ 112

UNIDADE 8 8.1 8.2 8.3 8.4 8.5 8.6

INTRODUO SOBRE CURSORES ................................................................................................................................... 112 DECLARANDO UM CURSOR ......................................................................................................................................... 112 ABRINDO UM CURSOR ............................................................................................................................................... 113 PERCORRENDO UM CURSOR ........................................................................................................................................ 114 EXECUTANDO COMANDOS EM UM CURSOR .................................................................................................................... 114 CONFIRMANDO OU RETORNANDO UM CURSOR ............................................................................................................... 115 ESQUEMAS XML ................................................................................................................................... 119

UNIDADE 9 9.1 9.2 9.3 9.4 9.5

INTRODUO SOBRE XSD........................................................................................................................................... 119 CRIANDO UM ESQUEMA XSD ...................................................................................................................................... 119 ASSOCIANDO UM ESQUEMA XSD................................................................................................................................. 120 ALTERANDO UM ESQUEMA XSD .................................................................................................................................. 121 DELETANDO UM ESQUEMA XSD .................................................................................................................................. 121 AGENTE DE SERVIOS ...................................................................................................................... 123

UNIDADE 10 10.1 10.2 10.3 10.4 10.5

INTRODUO SOBRE AGENTE DE SERVIOS .................................................................................................................... 123 INICIANDO O AGENTE DE SERVIOS .............................................................................................................................. 123 CRIANDO UM TRABALHO ............................................................................................................................................ 124 PARA CRIAR UMA ETAPA DE TRABALHO TRANSACT-SQL ................................................................................................... 124 PARA CRIAR E ANEXAR UMA AGENDA A UM TRABALHO ..................................................................................................... 125 PROJETO FINAL ................................................................................................................................ 127

UNIDADE 11 11.1

SITUAO PROBLEMA ............................................................................................................................................... 127

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.

Banco de Dados II

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

Banco de Dados II

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

Banco de Dados II

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

Banco de Dados II

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

Banco de Dados II

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.

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
9

Banco de Dados II

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.

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

10

Banco de Dados II

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

11

Banco de Dados II

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

12

Banco de Dados II

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

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.

13

Banco de Dados II

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

14

Banco de Dados II

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

15

Banco de Dados II

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. 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 SELECT northwind OrderID, ProductID ,(UnitPrice * Quantity) as ExtendedAmount FROM [Order Details]

16

Banco de Dados II

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.

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 ***'

17

Banco de Dados II

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} [ELSE resultado] END [,.n]

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) BEGIN SELECT ,CASE WHEN (@n % 2) = 1 THEN 'MPAR' ELSE 'PAR' END AS 'Tipo' SET @n = @n - 1 END @n AS 'Nmero'

18

Banco de Dados II

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.

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

19

Banco de Dados II

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

20

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

21

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

22

Banco de Dados II

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.

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.

23

Banco de Dados II

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

24

Banco de Dados II

GROUP BY OD.OrderID GO

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.

25

Banco de Dados II

Alterando views
A instruo ALTER VIEW altera a definio de uma view, incluindo views indexadas, sem afetar os disparadores ou procedimentos armazenados dependentes. Isso permite manter as permisses da view. Essa instruo est sujeita s mesmas restries que a instruo CREATE VIEW. Se descartar uma view e cri-la novamente, voc dever reatribuir permisses a ela.

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

26

Banco de Dados II

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.

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]

27

Banco de Dados II

GROUP BY OrderID

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.

28

Banco de Dados II

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

29

Banco de Dados II

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

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.

30

Banco de Dados II

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. 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:

31

Banco de Dados II

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

32

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.

33

Banco de Dados II

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). 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.

34

Banco de Dados II

Execuo (primeira vez ou recompilao)


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.

35

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.

36

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.

37

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

38

Banco de Dados II

instruo_sql [...n]

As instrues a seguir criam um procedimento armazenado que lista todos os pedidos vencidos no banco de dados Northwind. 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:

39

Banco de Dados II

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

40

Banco de Dados II

Voc pode executar um procedimento armazenado isoladamente ou como parte de uma instruo INSERT. necessrio ter a permisso EXECUTE no procedimento armazenado.

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

41

Banco de Dados II

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

42

Banco de Dados II

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.

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

43

Banco de Dados II

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

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

44

Banco de Dados II

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

45

Banco de Dados II

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

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

46

Banco de Dados II

[@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), @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.

47

Banco de Dados II

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'

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'

48

Banco de Dados II

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

49

Banco de Dados II

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

50

Banco de Dados II

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

51

Banco de Dados II

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.

52

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.

53

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,

54

Banco de Dados II

@Phone nvarchar (24) = NULL, @Fax nvarchar (24) = NULL, @HomePage ntext = NULL, @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)

55

Banco de Dados II

IF @@error <> 0 BEGIN ROLLBACK TRAN RETURN 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

56

Banco de Dados II

57

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 */

58

Banco de Dados II

EXEC sp_addmessage 50010, 16, 'CustomerID not found.', @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

59

Banco de Dados II

60

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

61

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

62

Banco de Dados II

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

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'

63

Banco de Dados II

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

64

Banco de Dados II

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.

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.

65

Banco de Dados II

USE Northwind GO CREATE FUNCTION fn_DateFormat (@indate datetime, @separator char(1)) RETURNS Nchar(20) AS BEGIN 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.

66

Banco de Dados II

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.

67

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')

68

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

69

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

70

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.

71

Banco de Dados II

_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. 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

72

Banco de Dados II

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

73

Banco de Dados II

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.

74

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.

75

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.

76

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.

77

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.

78

Banco de Dados II

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.

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

79

Banco de Dados II

AS IF (SELECT COUNT(*) FROM Deleted) > 6 BEGIN RAISERROR( 'You cannot delete more than six employees at a time.', 16, 1) ROLLBACK TRANSACTION END

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

80

Banco de Dados II

Ao criar disparadores, importante compreender como eles funcionam. Esta seo aborda os disparadores INSERT, DELETE, UPDATE, INSTEAD OF, aninhados e recursivos.

81

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

82

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

83

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

84

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

85

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'

86

Banco de Dados II

SELECT CustomerID, Phone FROM CustomersGer WHERE CustomerID = 'ALFKI'

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:

87

Banco de Dados II

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

88

Banco de Dados II

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.

89

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 executa uma ao que faz com que o mesmo disparador seja acionado novamente. Por exemplo, um aplicativo atualiza a tabela T1, fazendo com que o disparador Trig1 seja acionado. Trig1 atualiza a tabela T1 novamente, fazendo com que o disparador Trig1 seja 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.

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:

90

Banco de Dados II

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). 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

91

Banco de Dados II

Os disparadores podem ser usados para manter a integridade dos dados efetuando alteraes em cascata nas tabelas relacionadas em todo o banco de dados. 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

92

Banco de Dados II

AS IF (Select Count (*) FROM [Order Details] INNER JOIN deleted 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:

93

Banco de Dados II

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

94

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.

95

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.

96

Banco de Dados II

No possvel usar a restrio DROP INDEX nas tabelas do sistema. DROP INDEX ndice.tabela | ndice.view [, ...n ] 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.

97

Banco de Dados II

USE Northwind CREATE UNIQUE NONCLUSTERED INDEX U_CustID ON customers(CustomerID)

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.

98

Banco de Dados II

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. 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)

99

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.

100

Banco de Dados II

2. Exiba estrutura de cada tabela do sistema 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

101

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.

102

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.

103

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.

104

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

105

Banco de Dados II

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

106

Banco de Dados II

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.

107

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

108

Banco de Dados II

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.

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.

109

Banco de Dados II

A ordem de associao das tabelas. O modo de atualizao escolhido. As tabelas de trabalho e outras estratgias.

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.

110

Banco de Dados II

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.

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.

111

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

112

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

113

Banco de Dados II

--Atribuindo valores do select nas variveis FETCH NEXT FROM CursorDosItens INTO @productid, @quantity

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

114

Banco de Dados II

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

@quantity

FROM

products

WHERE

productid

8.6 Confirmando ou retornando um cursor


115

Banco de Dados II

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: --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

116

Banco de Dados II

--Iniciando lao WHILE @@FETCH_STATUS = 0 BEGIN IF (SELECT unitinstock @productid) >= 0 UPDATE products 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

@quantity

FROM

products

WHERE

productid

117

Banco de Dados II

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 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%

118

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)

119

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.

120

Banco de Dados II

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

121

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

122

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.

123

Banco de Dados II

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

124

Banco de Dados II

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

125

Banco de Dados II

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:
o

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

126

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

127

Banco de Dados II

128

Вам также может понравиться