Академический Документы
Профессиональный Документы
Культура Документы
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
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
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
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
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
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
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
Unidade 1 -
SQL
Banco de Dados II
GO
Os utilitrios do SQL Server interpretam GO como um sinal para enviar o lote atual de instrues Transact-SQL para o SQL Server. O comando GO define os lotes de instrues Transact-SQL para ferramentas e utilitrios e finaliza o lote. Esse comando no uma instruo Transact-SQL real. Ao usar o comando GO, considere estes fatos: O lote atual composto de todas as instrues inseridas desde o ltimo comando GO ou desde o incio da sesso ad hoc (ou script, se esse for o primeiro GO). Uma instruo Transact-SQL no pode ocupar o mesmo registro que um comando GO, embora o registro possa conter comentrios. Os usurios devem seguir as regras referentes a lotes. Por exemplo, algumas instrues de DDL devem ser executadas isoladamente de outras instrues Transact-SQL, separando-as com um comando GO. O escopo das variveis locais (definidas pelo usurio) limitado a um lote e no possvel fazer referncia a ele depois de um comando GO. GO no uma instruo Transact-SQL real; GO usado para definir os lotes para ferramentas e utilitrios.
EXEC
A diretiva EXEC usada para executar uma funo definida pelo usurio, um procedimento do sistema, um procedimento armazenado definido pelo usurio ou um procedimento armazenado estendido; ela tambm pode controlar a execuo de uma seqncia de caracteres em um lote do Transact-SQL. Parmetros podem ser passados como argumentos e um status de retorno pode ser atribudo.
1.4 Comentrios
Comentrios so seqncias de texto no executveis inseridas em instrues para descrever a ao ou desativar uma ou mais linhas da instruo. Eles podem ser usados de duas maneiras. Em linha com uma instruo ou como um bloco.
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 ([ ]):
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.
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.
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
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
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
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
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
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
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
21
Banco de Dados II
Melhorar o desempenho
As views permitem que voc armazene os resultados de consultas complexas. Outras consultas podem usar esses resultados resumidos. As views tambm permitem o particionamento dos dados. Voc pode colocar parties individuais em computadores separados.
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.
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.
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.
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
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.
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.
27
Banco de Dados II
GROUP BY OrderID
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.
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'
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.
30
Banco de Dados II
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
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.
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.
34
Banco de Dados II
Otimizao
Quando um procedimento armazenado passa com xito pelo estgio de resoluo, o otimizador de consultas do SQL Server analisa as instrues Transact-SQL do procedimento e cria um plano que contm o mtodo mais rpido de acesso aos dados. Para fazer isso, ele leva em considerao: 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
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
37
Banco de Dados II
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
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.
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.
A instruo a seguir executa um procedimento armazenado que lista todos os pedidos vencidos no banco de dados Northwind. EXEC OverdueOrders
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
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
44
Banco de Dados II
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
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
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.
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.
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
Voc pode usar DBCC FREEPROCCACHE para desmarcar todos os planos de procedimentos armazenados do cache.
Para tornar os procedimentos armazenados mais eficazes, voc deve incluir mensagens de erro que comuniquem o status das transaes (xito ou falha) ao usurio. Voc dever executar a lgica de negcios e da tarefa, bem como a verificao de erro, antes de iniciar as transaes, e mant-las curtas. Voc pode usar estratgias de codificao, como verificaes de existncia, para o reconhecimento de erros. Quando ocorrer um erro, fornea o mximo de informaes ao cliente. Voc pode verificar os elementos a seguir em sua lgica de tratamento de erros: cdigos de retorno, erros do SQL Server e mensagens de erro personalizadas.
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.
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
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
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.
62
Banco de Dados II
Uma funo definida pelo usurio criada de maneira semelhante a uma view ou um procedimento armazenado.
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
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.
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
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(), ':')
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
68
Banco de Dados II
69
Banco de Dados II
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
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.
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.
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.
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
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.
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.
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
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
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
82
Banco de Dados II
83
Banco de Dados II
84
Banco de Dados II
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
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
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.
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.
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
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
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
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.
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)
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
97
Banco de Dados II
Este exemplo determina se existe uma identificao de cliente duplicada na coluna CustomerID da tabela Customers. Se existir, o SQL Server retornar a identificao do cliente e o nmero de entradas duplicadas no conjunto de resultados. SELECT CustomerID, COUNT(CustomerID) AS '# of Duplicates' FROM Northwind.dbo.Customers GROUP BY CustomerID HAVING COUNT(CustomerID)>1 ORDER BY CustomerID
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
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
102
Banco de Dados II
Quando o otimizador de consultas otimiza consultas, ele no inicia o plano de execuo com a menor perda de recursos. Em vez disso, escolhe o plano de execuo que retorna os resultados da maneira mais rpida para o usurio, com uma reduo razovel de recursos. Se o Microsoft SQL Server tiver mais de um processador disponvel, o otimizador de consultas poder dividir a consulta entre eles. Em geral, as consultas de longa durao tiram proveito dos planos de execuo, mas uma consulta paralela pode usar mais recursos gerais que o processamento serial de uma consulta.
103
Banco de Dados II
Processo de anlise
O processo de anlise verifica se a consulta recebida possui a sintaxe correta e divide essa sintaxe em partes de componentes s quais o mecanismo de banco de dados relacional pode responder. A sada dessa etapa uma rvore de consultas analisada.
Processo de padronizao
O processo de padronizao transforma uma consulta em um formato til de otimizao. Qualquer clusula de sintaxe redundante detectada removida. As subconsultas so padronizadas. A sada dessa etapa uma rvore de consulta padronizada.
Otimizao de consultas
O processo de selecionar um plano de execuo a partir de vrios planos possveis chama-se otimizao. Vrias etapas so envolvidas nessa fase. No entanto, as etapas a seguir tm o efeito mais significativo no custo do plano de execuo: anlise de consultas, seleo de ndices e seleo de associaes.
Compilao
A consulta compilada em um cdigo executvel.
104
Banco de Dados II
Anlise de consultas
A primeira fase da otimizao de consultas chama-se anlise de consultas. Nessa fase, o otimizador de consultas identifica a pesquisa e os critrios de associao da consulta. Ao limitar a pesquisa, o otimizador minimiza o nmero de registros processados. A reduo do nmero de registros processados reduz o nmero de pginas de ndice e de dados lidas.
Seleo de ndices
A seleo de ndices a segunda fase da otimizao de consultas. Durante essa fase, o otimizador de consultas detecta se um ndice existe para as clusulas identificadas. Em seguida, h uma avaliao da utilidade do(s) ndice(s). A utilidade de um ndice determinada pela maneira como vrios registros so retornados. Essas informaes so reunidas a partir de estatsticas de ndice ou de coluna. Uma estimativa do custo de vrios mtodos de acesso ocorre por meio da estimativa das leituras de pginas lgicas e fsicas necessrias para localizar os registros qualificados.
Seleo de associaes
A seleo de associaes a terceira fase da otimizao de consultas. Se houver uma consulta de vrias tabelas ou auto-associao, ocorrer uma avaliao de qual estratgia de associao ser usada. A determinao da estratgia de associao a ser usada envolve a considerao de vrias fatores: seletividade, densidade e memria necessrias para processar a consulta.
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.
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
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.
109
Banco de Dados II
A ordem de associao das tabelas. O modo de atualizao escolhido. As tabelas de trabalho e outras estratgias.
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.
111
Banco de Dados II
Unidade 8 -
Criando Cursores
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
113
Banco de Dados II
--Atribuindo valores do select nas variveis FETCH NEXT FROM CursorDosItens INTO @productid, @quantity
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
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
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.
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>'
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.
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>'
121
Banco de Dados II
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
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.
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.
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
127
Banco de Dados II
128