sql avan çado - professor.unisinos.brprofessor.unisinos.br/ltonietto/ccti/sql/sqlavancado.pdf · 2...
TRANSCRIPT
1
SQL AvanSQL Avanççadoado
Leandro [email protected]
www.inf.unisinos.br/~ltoniettojan-07
ApresentaApresentaççãoão
Sobre o instrutor:Professor no curso de Jogos e Entretenimento Digital da Unisinos e do Instituto de Informática da Unisinos
Gerente de Projetos da empresa QualitàInformática
Expectativa quando ao aproveitamento do curso
SQL AvanSQL Avanççadoado
Agenda para 09/12Agenda para 09/12
Introdução Transact-SQLElementos de sintaxe
Implementando ViewsConceitosCriação e modificação
Otimização
SQL AvanSQL Avanççadoado
TransactionTransaction--SQLSQL
O Transact-SQL é uma linguagem de definição, manipulação e controle de dados.
Padronização SQL-92ISO e ANSI
Elementos de linguagem de programaçãoDiretivas, comentários, identificadores, controle de fluxo, loops, funções, expressões, ...
SQL AvanSQL Avanççadoado
Tipos de linguagem para BDTipos de linguagem para BD
DDL - Data Definition Language
Definição do BD: criação, alteração e remoção de campos e tabelas, regras, índices, ...
DML - Data Manipulation Language
Manipulação de dados: consulta, inclusão, alteração e exclusão
Transaction-SQLProgramação de funções auxiliares
SQL AvanSQL Avanççadoado
Elementos de LinguagemElementos de Linguagem
Diretivas de lotesComentáriosIdentificadoresTipos de dadosVariáveisFunções do sistemaOperadoresExpressõesControle de fluxoPalavras reservadas
SQL AvanSQL Avanççadoado
2
Diretiva de lotesDiretiva de lotes
Lote: Conjunto de instruções de programação
SQL Server processa um lote de instruções por vez.
Diretivas de lote: são instruções para envio dos lotes para execução do SGBDDuas instruções: GO e EXEC
SQL AvanSQL Avanççadoado
Diretiva de lotesDiretiva de lotes
GO: Envia lote atual de instruções para execuçãoO lote atual é composto de todas as instruções inseridas desde o último comando GO ou desde o início da sessão ad hoc (ou script, se esse for o primeiro GO).Os usuários devem seguir as regras referentes a lotes. Por exemplo, algumas instruções de DDL devem ser executadas isoladamente de outras instruções Transact-SQL, separando-as com um comando GO.Escopo das variáveis é definido dentro de um lote
SQL AvanSQL Avanççadoado
Diretiva de lotesDiretiva de lotes
GO: “Exemplo”:/* bloco de comandos 1 */
DECLARE @EmpID varchar(11)
GO
/* bloco de comandos 2 */
SET @EmpID = ‘Teste’
O que aconteceria se estes blocos de comandos fossem executados?O que aconteceria se estes blocos de comandos fossem executados?
O escopo da variO escopo da variáável vel éé lote. O lote lote. O lote éé
conjunto instruconjunto instruçções ões separadas por GOseparadas por GO’’ss
Serão executados Serão executados apenas os lotes apenas os lotes
apapóós o comando GOs o comando GO
SQL AvanSQL Avanççadoado
Diretiva de lotesDiretiva de lotes
EXEC:Executa comandos do usuário
Comandos TransacSQLFunçõesLotes
Comandos são passados por parâmetro e o método retorna o status da execução: sucesso ou erro.
SQL AvanSQL Avanççadoado
ComentComentááriosrios
São códigos não executáveis de um lote de comandos
Geralmente utilizados para:indicar alguma ponto importante de um códigocolocar explicações curtas sobre uma função ou loteSuprimir execução de linhas de código sem removê-las
Comentário de linha: --
Comentário de bloco: /* ... */
SQL AvanSQL Avanççadoado
ComentComentááriosrios
Exemplo 1:USE northwind
SELECT productname
, (unitsinstock-unitsonorder) -- Calcula inventário
-- , supplierid
FROM products
GO
Suprimindo um linha Suprimindo um linha
---- indica ao interpretador de indica ao interpretador de comando que ignore o estiver comando que ignore o estiver àà sua sua
direita, atdireita, atéé o fim da linha o fim da linha
SQL AvanSQL Avanççadoado
3
ComentComentááriosrios
Exemplo 2:/*
Este código recupera todas as linhas da tabela
products e exibe o preço unitário, o preço unitário
aumentado em 10% e o nome do produto.
*/
USE northwindSELECT unitprice, (unitprice * 1.1), productnameFROM productsGO
SQL AvanSQL Avanççadoado
Normalmente os comentNormalmente os comentáários de blocos são usados para rios de blocos são usados para comentar blocos de linhas de ccomentar blocos de linhas de cóódigo e colocar explicadigo e colocar explicaçções ões
sobre o que sobre o que éé executado no loteexecutado no lote
IdentificadoresIdentificadores
SQL AvanSQL Avanççadoado
São nomes ou identificação única para variáveis e funçõesOs identificadores padrão podem conter de 1 a 128 caracteres, inclusive letras, símbolos (_, @ ou #) e números.Não são permitidos espaços.Regras:
O primeiro caractere deve ser um caractere alfabético, de a-z ou A-Z.Os identificadores podem incluir letras, números ou os símbolos @, $, # ou _ .Os nomes de identificadores que começam com um símbolo têm utilizações especiais:
Um identificador que inicie com o símbolo @ indica um parâmetro ou variável local.Um identificador que inicie com um sinal de tralha (#) indica um procedimento ou uma tabela temporária.Um identificador que inicie com um sinal de tralha duplo (##) indica um objeto temporário global.
Os nomes de objetos temporários não devem ter mais de 116 caracteres, incluindo os sinais # ou ##, porque o SQL Server atribui um sufixo numérico interno aos objetos temporários.
IdentificadoresIdentificadores
SQL AvanSQL Avanççadoado
Exemplo:DECLARE @v1@v1 int
Identificadores delimitadosIdentificadores delimitados
SQL AvanSQL Avanççadoado
Os identificadores delimitados podem ser usados nas seguintes situações:
Quando os nomes contiverem espaços incorporadosQuando forem utilizadas palavras reservadas como nomes de objetos ou partes de nomes de objetos
Os identificadores delimitados devem ser colocados entre parênteses ou aspas duplas.
ConvenConvençção de Nomes de Identificadoresão de Nomes de Identificadores
SQL AvanSQL Avanççadoado
Mantém um padrão de escritaFacilita manutenção de códigoDiretrizes:
Quando possível, empregue nomes significativos.Use convenções de nomeação simples e fáceis. Use um identificador que diferencie tipos de objeto, principalmente para views e procedimentos armazenados. Mantenha a exclusividade dos nomes de objetos e usuários. Por exemplo, evite criar uma tabela sales(vendas) e um cargo sales dentro do mesmo banco de dados.
Tipos de dadosTipos de dados
SQL AvanSQL Avanççadoado
Os tipos de dados são atributos que especificam o tipo de informação que pode ser armazenado em uma coluna, parâmetro ou variável
Delimita o domínio dos valores possíveis para uma variável, parâmetro ou coluna
4
Tipos de dadosTipos de dados
SQL AvanSQL Avanççadoado
Numéricos:Para representação de númerosInteiros: int, tinyint, smallint e bigintDecimais: numeric, decimal, money e smallmoney
Ponto flutuante: float e real
Tipos de dadosTipos de dados
SQL AvanSQL Avanççadoado
Numéricos:Para representação de númerosInteiros: int, tinyint, smallint e bigintDecimais: numeric, decimal, money e smallmoneyPonto flutuante: float e real
Datas:Representa datas ou períodos de tempo. Os dois tipos de dados de data são datetime, cuja precisão é de 3,33 milissegundos, e smalldatetime, cuja precisão é de intervalos de 1 minuto.
Tipos de dadosTipos de dados
SQL AvanSQL Avanççadoado
CharactersEste tipo de dados é usado para representar seqüências ou dados de caractere e inclui tipos de dados de seqüência de tamanho fixo, como char e nchar, e de tamanho variável, como varchar e nvarchar.
BináriosEste tipo de dados é muito semelhante aos tipos de dados de caractere em termos de armazenamento e estrutura, porém o conteúdo dos dados é tratado como uma série de valores de bytes. Os tipos de dados binários incluem binary e varbinary. O tipo de dados bit indica um valor de bit único igual a zero ou um.
Tipos de dadosTipos de dados
SQL AvanSQL Avanççadoado
Unique IdentifiersEste tipo especial de dados é um uniqueidentifier que representa um identificador global exclusivo, o qual é um valor hexadecimal de 16 bytes que deve ser sempre exclusivo.
SQL VariantesEste tipo de dados pode representar valores de vários tipos de dados para os quais há suporte no SQL Server, com exceção de text, ntext, image, timestamp e rowversion.
Tipos de dadosTipos de dados
SQL AvanSQL Avanççadoado
Image e TextEstes tipos de dados são estruturas objeto binário extenso (BLOB) que representam tipos de dados de tamanho fixo e variável para o armazenamento de dados binários e de caractere Unicode e não-Unicode grandes, como image, text e ntext.
TablesEste tipo de dados pode ser usado apenas para definir variáveis locais de tipo de tabela ou o valor de retorno de uma função definida pelo usuário.
CursorsEste tipo de dados é usado para programação em procedimentos armazenados e com interfaces de cliente de baixo nível. Ele nunca é usado como parte de uma instrução de DDL.
Tipos de dadosTipos de dados
SQL AvanSQL Avanççadoado
Definidos pelo usuárioEste tipo de dados é criado pelo administrador do banco de dados e se baseia nos tipos de dados do sistema.
Use os tipos de dados definidos pelo usuário quando várias tabelas devem armazenar o mesmo tipo de dados em uma coluna, e você deve garantir que as colunas tenham exatamente o mesmo tipo de dados, tamanho e nulidade.
5
VariVariááveisveis
SQL AvanSQL Avanççadoado
Variável é um recurso de linguagem de programação para definição de identificadores que representam e armazenam um determinado valor na memória.Vários locais: DECLARE
Atribuição de valor é feita através do comando SET ou da execução de uma expressão como um SELECT
Escopo é do lote. Isto significa que?Nome da variável deve ser precedido por @
VariVariááveisveis
SQL AvanSQL Avanççadoado
Sintaxe de uso geral:DECLARE {@<nome> <tipo_de_dados>} [,...n]
SET @nome_da_variável_local = expressão
Exemplos:DECLARE @nome varchar(70)
DECLARE @soma int
SET @soma 0
VariVariááveisveis
SQL AvanSQL Avanççadoado
Exemplo:USE northwind
DECLARE @EmpID varchar(11)
,@vlName char(20)
SET @vlname = 'Dodsworth'
SELECT @EmpID = employeeid
FROM employees
WHERE LastName = @vlname
SELECT @EmpID AS EmployeeID
GO
FunFunçções do sistemaões do sistema
SQL AvanSQL Avanççadoado
O Transac-SQL permite a execução de funções pré-definidas do sistema, como:
Sum, avg, sqrt, length, ...
Consultar guia de referência para identificar todas as funções
Tipos de funções:Agem sobre um conjunto de dados e retornam alguma compilação dos mesmosUSE northwind
SELECT AVG(unitprice) AS AvgPrice
FROM products
GO
AVG calcula AVG calcula mméédiadia
FunFunçções do sistemaões do sistema
SQL AvanSQL Avanççadoado
Tipos de funções:Retornam um valor individual que opera a partir de nenhum ou de diversos valores escalares individuais. As funções escalares podem ser agrupadas nas seguintes categorias:
Configuração - Retorna informações sobre a configuração atual.Cursor - Retorna informações sobre cursores.Data e hora - Efetua uma operação sobre um valor inserido de data e hora e retorna um valor de seqüência, numérico ou de data e hora.Matemática - Efetua um cálculo com base em valores inseridos como parâmetros para a função e retorna um valor numérico.Metadados - Retorna informações sobre o banco de dados e os objetos do banco de dados.Segurança - Retorna informações sobre usuários e cargos. Seqüência de caracteresEfetua uma operação sobre um valor inserido de seqüência (char ou varchar) e retorna um valor de seqüência de caracteres ou numérico.Sistema - Efetua operações e retorna informações sobre valores, objetos e configurações no SQL Server.Estatística do sistema Retorna informações estatísticas sobre o sistema.Texto e imagem Efetua uma operação sobre um valor inserido de texto ou imagem ou sobre uma coluna, e retorna informações sobre o valor.
FunFunçções do sistemaões do sistema
SQL AvanSQL Avanççadoado
Exemplo:USE northwind
SELECT DB_NAME() AS 'database'
GO
6
FunFunçções do sistemaões do sistema
SQL AvanSQL Avanççadoado
Tipos de funções:Podem ser usadas como referências de tabela em uma instrução Transact-SQL
Exemplo:SELECT *
FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM owner.titles')
GOEstEstáá funfunçção funcionarão funcionaráá sempre?sempre?
FunFunçções do sistemaões do sistema
SQL AvanSQL Avanççadoado
Função de conversão de data: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)
GORepare que a instruRepare que a instruçção SELECT ão SELECT retorna dados que concatenadosretorna dados que concatenados
UNION agrupa conjunto de dadosUNION agrupa conjunto de dados
FunFunçções do sistemaões do sistema
SQL AvanSQL Avanççadoado
Resultado:Style
ANSI: 1998.11.20
Japanese: 11/20/98
European: 20 Nov 1998 16:44:12:857
FunFunçções do sistemaões do sistema
SQL AvanSQL Avanççadoado
Exemplo do uso da função DATEFORMAT:SET DATEFORMAT dmy
GO
DECLARE @vdate datetime
SET @vdate = '11/29/98'
SELECT @vdate
GO DATEFORMAT define o formato de DATEFORMAT define o formato de data padrão atualdata padrão atual
Repare que a data Repare que a data éé impressa (impressa (dmydmy) ) de forma diferente do padrão ANSI de forma diferente do padrão ANSI
FunFunçções do sistemaões do sistema
SQL AvanSQL Avanççadoado
Exemplo de função que interage com dados do SGDB:USE library
SELECT user_name(), app_name()
GO
FunFunçções do sistemaões do sistema
SQL AvanSQL Avanççadoado
Exemplo de função que obtém dados sobre o BD:USE library
SELECT COLUMNPROPERTY(OBJECT_ID('member'), 'firstname', 'AllowsNull')
GO
7
OperadoresOperadores
SQL AvanSQL Avanççadoado
Operadores são símbolos que efetuam cálculos matemáticos, concatenações de seqüências de caracteres e comparações entre colunas, constantes e variáveis. É possível combinar e utilizar os operadores em condições de pesquisa. A ordem em que os operadores serão processados baseia-se em uma precedência predefinida.Quatro tipos de operadores: aritméticos, de comparação, de concatenação de seqüências de caracteres e lógicos
OperadoresOperadores
SQL AvanSQL Avanççadoado
Aritméticos:Aditivos: + e –Multiplicativos: *, / e %
Comparação:Retornam verdadeiro ou falso=, <, >, <=, >= e <>
Concatenação:Somente com dados String: +
LógicosUtilizados para conectar o resultado de mais de uma expressãoOR, AND e NOTUsados na cláusula WHERE
OperadoresOperadores
SQL AvanSQL Avanççadoado
Precedência:Agrupamento primário: ( )
Aritmético Multiplicativo: *, / e %Aritmético Aditivo: – e +
Concatenação de seqüências de caracteres: +
Lógico NOT: NOTLógico AND: AND
Lógico OR: OR
ExpressõesExpressões
SQL AvanSQL Avanççadoado
Combinação de campos e variáveis com operadores e funções para retornar um resultado
Tipo de retorno depende dos elementos da expressão
ExpressõesExpressões
SQL AvanSQL Avanççadoado
Exemplo:USE northwind
SELECT OrderID, ProductID
,(UnitPrice * Quantity) as ExtendedAmount
FROM [Order Details]
WHERE (UnitPrice * Quantity) > 10000
GO
Elementos de Controle de FluxoElementos de Controle de Fluxo
SQL AvanSQL Avanççadoado
elementos de linguagem que controlam o fluxo da lógica em uma instrução
a função CASE que permite usar uma lógica condicional em um único registro de cada vez, em uma instrução SELECT ou UPDATE
8
Elementos de Controle de FluxoElementos de Controle de Fluxo
SQL AvanSQL Avanççadoado
Exemplo – nível de instrução:USE northwind
IF EXISTS (SELECT * FROM orders WHERE customerid = 'frank')
PRINT '*** Cliente não pode ser excluído ***'
ELSE
BEGIN
DELETE customers WHERE customerid = 'frank'
PRINT '*** Cliente foi excluído ***'
END
GO
Elementos de Controle de FluxoElementos de Controle de Fluxo
SQL AvanSQL Avanççadoado
Exemplo – nível de registro:DECLARE @n tinyintSET @n = 5IF (@n BETWEEN 4 and 6)BEGIN
WHILE (@n > 0)BEGINSELECT @n AS 'Número', CASE
WHEN (@n % 2) = 1THEN 'ÍMPAR'
ELSE 'PAR'END AS 'Tipo‘
SET @n = @n - 1END
ENDELSE
PRINT 'SEM ANÁLISE'GO
ViewsViews
SQL AvanSQL Avanççadoado
Definição:São tabelas que representam uma visão de um conjunto de dados de uma ou mais tabelas.
Não armazenam nenhum dado, apenas fornecem a visualização para estes de forma diferente.
VIEW == SELECT
ViewsViews
SQL AvanSQL Avanççadoado
Exemplos:Um subconjunto de registros ou colunas de uma tabela base: subconjunto das pessoas de uma tabela de pessoas com idade > 30 anos.Uma união, intersecção ou associação de duas ou mais tabelas base: Pessoas com idade > 30 e que são do sexo masculinoUm resumo estatístico de uma tabela base: tabela que mostra os pedidos com uma coluna totalizando o valor dos seus itens.Um subconjunto de outra view ou alguma combinação de views e tabelas base.
ViewsViews
SQL AvanSQL Avanççadoado
Vantagens:Visualização focalizada
Tirar a complexidade da visualização dos dados, como por exemplo, uniões de tabelas restrições sobre os conjuntos
Organização de dados para exportaçãoPermissão de acesso com restrições
Desempenho, pois o resultado fica “armezanado”
ViewsViews
SQL AvanSQL Avanççadoado
Sintaxe:CREATE VIEW propr.nome_da_view [(coluna [,n ])]
[WITH {ENCRYPTION | SCHEMABINDING | VIEW_METADATA} [,n ]]
AS
instrução_select
[WITH CHECK OPTION]
9
ViewsViews
SQL AvanSQL Avanççadoado
View no Transact:USE Northwind
GO
CREATE VIEW dbo.EmployeeView ASSELECT LastName, FirstnameFROM Employees
GO
SELECT * from EmployeeView
GO
ViewsViews
SQL AvanSQL Avanççadoado
Padronização:Segue a mesma verificação dos identificadores
Nomes devem ser únicosÉ fortemente recomendado fazer distinção entre padrão de nomes de tabelas e de views:
Tabela: PessoasView: View_Pessoas_Masculino
ViewsViews
SQL AvanSQL Avanççadoado
Só podem criar views usuários com permissão de administradores do BD
Definir usuário dba com proprietário de todas as tabelas
Qualquer usuário com permissões mínimas no sistema, por padrão, consegue visualizar os dados de uma view.
ViewsViews
SQL AvanSQL Avanççadoado
Restrições:A instrução CREATE VIEW não pode incluir as cláusulas COMPUTE ou COMPUTE BY. A instrução CREATE VIEW não pode incluir a palavra-chave INTO.A instrução CREATE VIEW só poderá incluir a cláusula ORDER BY se a palavra-chave TOP for usada.As views não podem fazer referência a tabelas temporárias.As views não podem fazer referência a mais de 1.024 colunas.A instrução CREATE VIEW não pode ser combinada com outras instruções Transact-SQL em um único lote.
ViewsViews
SQL AvanSQL Avanççadoado
Exemplo 2:USE NorthwindGOCREATE VIEW dbo.OrderSubtotalsView (OrderID, Subtotal)
ASSELECT OD.OrderID,SUM(CONVERT(money,(OD.UnitPrice*Quantity*(1-Discount)/100))*100)
FROM [Order Details] ODGROUP BY OD.OrderIDGO
SELECT * FROM OrderSubtotalsViewGO
ViewsViews
SQL AvanSQL Avanççadoado
Views para fornecer um modo conveniente de examinar informações de duas ou mais tabelas associadas em um local central:Neste exemplo, ShipStatusView associa as tabelas Customers(Clientes) e Orders (Pedidos).USE NorthwindGOCREATE VIEW dbo.ShipStatusViewASSELECT OrderID, ShippedDate, ContactNameFROM Customers c INNER JOIN Orders oON c.CustomerID = O.CustomerIDWHERE RequiredDate < ShippedDateSELECT * FROM ShipStatusViewOrderID ShippedDate ContactNameGO
10
ViewsViews
SQL AvanSQL Avanççadoado
Encriptação:Usar a opção WITH ENCRYPTION na criação da view
Criptografa as entradas da tabela syscomments, critografando a definição da view
Para descriptografar somente removendo e criando novamente a view.
Pode ser interessante guardar uma cópia do script de criação da view em algum lugar (arquivo) seguro
ViewsViews
SQL AvanSQL Avanççadoado
Exercício:Criar a view: página ?? Sem a opção de encriptação
Ver os dados da tabela syscomments
Apagar a view e criar de novo com a opção de encriptaçãoVer novamente os dados da tabela syscomments
ViewsViews
SQL AvanSQL Avanççadoado
Exercício:Crie a tabela Pessoas no transact-SQL, com os campos nome, idade e sexo
Insira cinco registros nesta tabela; sendo 3 homens e duas mulheres. Três destas pessoas tem idade maior que 30.
Crie uma view para representar as mulheres com idade maior que trinta.
Altere os dados e apenas faça mais um comando de seleção simples na view.
ViewsViews
SQL AvanSQL Avanççadoado
Alterando de definição da view
Exemplo:USE Northwind
GO
ALTER VIEW dbo.EmployeeView
AS
SELECT LastName, FirstName, Extension
FROM Employees
ViewsViews
SQL AvanSQL Avanççadoado
Atenção:Se você definir uma view com uma instrução SELECT * e, depois, alterar a estrutura das tabelas subjacentes adicionando colunas, as novas colunas não aparecerão na view. Quando todas as colunas são selecionadas em uma instrução 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.
ViewsViews
SQL AvanSQL Avanççadoado
Apagando uma viewDROP VIEW <nome da view>
Apague a view definida no exercício anterior
11
ViewsViews
SQL AvanSQL Avanççadoado
Atualização dos dados através das views épossível considerando as seguintes restrições:
Que seja proveniente de uma única tabela e que contenha todos os seu campos não nulos
Não possua funções de agregaçãoPoderão ocasionar erros se afetarem colunas às quais a view não faz referência.
ViewsViews
SQL AvanSQL Avanççadoado
Otimização de desempenhoArmazenamento de dados de consultas completas
Joins com views é mais rápido do que com várias tabelas
Evitar aninhamento de views.Podem esconder problemas com resultadosExemplo das páginas 49-50
ViewsViews
SQL AvanSQL Avanççadoado
Práticas recomendadas:Nomes consistentes e com um padrão que os distinguem das tabelas; facilitando a identificação das viewsDbo como proprietário: facilita utilização, já que, por ser o usuário default, não é necessário colocar o nome do usuário proprietário da view no momento de usá-la.Verifique dependências dos objetos antes de excluí-los
sp_denpends
Se for necessário esconder a definição de uma view, não apague esta definição da tabela syscomments; use a opção WITH ENCRYPTION nos comandos CREATE VIEW ou ALTER VIEW.Cuidado views aninhadas, tenha certeza de sua real necessidade; elas podem esconder problemas com resultados.
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Stored proceduresColeção nomeada de instruções TransactSQLque é armazenada no servidor.Suporte a recursos de programação
São funções ou procedimentos, logo encapsulam execução repetida de código (mesmo código executado em lugares diversos)
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
TiposArmazenados no BD do sistema.
Fornecem informações das tabelas do sistemaPor padrão, precedidos por “sp_”São funções do sistemaUsados por qualquer BD
Procedimentos de armazenamento localUso restrito
Procedimentos temporários locais (#) ou globais (##)Locais ao usuário ou globais para todas as sessões
Procedimentos externos (construídos como DLL).Armazenados fora do BDPrefixo “xp_”
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
CaracterísticasInstruções para executar operações sobre o BDPermite passagem de parâmetros
Retorno de status da execução
Parâmetros de saída
12
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
ProcessamentoCriaçãoPrimeira consulta, coloca o plano de consulta respectivo no cache.
Cache alocado conforme necessidade
Cache de procedimentos
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Processo de criação:CodificaçãoVerificação sintática.
Em caso erro não será criado nada.
Armazenamento da tabela de sistema sysobjects e texto na syscomments
Armazenamento é feito dentro da BD atual
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Comando de criação: CREATE PROCEDURECria o procedimento e armazena na BDA criação pode referenciar tabelas, view, variáveis, ...O que é criado dentro do procedimento não tem vida externa ao mesmoPrimeiro testar o código e depois realizar o armazenamento do mesmoUma instrução CREATE PROCEDURE não pode combinada com outras instruções SQL em um único lote (assim como a VIEW).Deve ter permissões para CREATE PROCEDURE.Tamanho máximo de um procedimento é de 128Mb.
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Sintaxe CREATE PROCEDURECREATE PROC nome [;número]
[{@parâmetro tipo_dado}
[VARYING][=padrao][OUTPUT]][,...n]
[{RECOMPILE|ENCRYPTION|”ambos”}]
[FOR REPLICATION]
AS
Instrução_sql[...n]
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Exemplo 1:USE Northwind
GO
CREATE PROC dbo.OverdueOrders
AS
SELECT * FROM dbo.Orders WHERE
RequiredDate < GETDATE() AND ShippedDate IS NULL
GO
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Diretrizes para criação:Recomendo que o usuário dbo possua todos os objetos do BD
Sempre especifique o dbo como proprietário dos procedimentos, tabelas, views e etc. que você criar
Considere as permissões necessárias em todos os objetos em que a procedure precisa referenciar.
O ideal é se logar no gerenciador do banco como administrador, na hora de criar ou alterar objetos do sistema.
Idealmente, uma procedure realiza uma açãoEvitar uso de objetos temporários, por questões de desempenho.Prefira sp_executesql do que EXECUTE
13
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Executando um procedimento:EXEC {[@status retorno=] {nome_procedimento[;número]|@var_nome_procedimento}
}
[[@parâmetro={valor|@variável[OUTPUT]
|[DEFAULT]][,...n]
[WITH RECOMPILE]
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Executando um procedimento:EXEC OverdueOrders
Possível combinar EXEC dentro de um INSERT
Inserir dados com o retorno da execução de uma procedure
Exemplo da página 69.
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
AlteraçãoAltera código de uma procedure existenteSintaxe é parecida com a CREATE
Ver página 70.
ALTER PROC vai alterar o conteúdo da PROC dentro da tabela syscommentsExemplo da página 71
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Remoção de proceduresInteressante executar comando sp_dependsantes de excluir um registro, para verificar as dependências.
Sintaxe:DROP PROCEDURE {nome_proc}
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Usando parâmetros de entradaPermitem passagem de valores externos para o procedimento. Generaliza o procedimento.Comando: CREATE PROC @param tipoConsidere:
Melhor verificar o que está se recebendo, por exemplo, evitar processar um procedimento com parâmetro nulo.Com valor padrão, execução possibilita que não se passe nenhum valor para um determinado parâmetro
Exemplo da página 76.
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Considerações sobre o exemplo:Ordem da declaração difere da ordem de passagem dos parâmetrosParâmetros @Region e @Fax não são especificados, porquê?No segundo exemplo, página 77, os parâmetros de passagem não indicam qual parâmetro eles estão se referenciando, porque eles são passados na ordem de declaração.
14
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Parâmetros de retornoServem para retornar dados processados na procedure para quem a chamou.Sintaxe:
CREATE PROC xyz @x1 int OUTPUT
EXEC xyz @idade OUTPUT
Exemplo da página 78.
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Exercícios: crie um procedimento que retorne o maior entre dois númerosoutro para o menor
outro para retornar a média.
Teste os procedimentos criados...Calcular fatorial de um número.
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Tratamento de erros: Tratamento de mensagens para informar sucesso ou falha de um procedimento.Mensagens tanto para programador, quando para usuário.Retorno satisfatório / esclarecedor para quem invocou a função, de tal forma que este possa tratar um erro.Boa prática: verificar situações de erro (RN) antes de executar uma rotina.
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Tratamento de erros: Instrução RETURN:
Retorna para método anteriorRetorna um valor ou nãoTambém usada para retornar o status de execução: normalmente 0 para êxito e valores negativos para erros.
� Valores de -1 a -14 estão em uso no SQL Server
� Valores de -15 a -99 estão reservados
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Tratamento de erros: USE Northwind
GO
CREATE PROCEDURE dbo.GetOrders
@CustomerID nchar (10)
AS
SELECT OrderID, CustomerID, EmployeeID
FROM [Order Qry]
WHERE CustomerID = @CustomerID
RETURN (@@ROWCOUNT)
GO
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Função sp_addmessageInsere uma mensagem na tabela de mensagens do BD (sysmessages)Possibilitando assim, que o usuário que executou a procedure, identifique o código do erro que retornou de uma falha de execução da procedure
15
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Função @@errorRetorna o número do erro que ocorreu na última execução Caso não tenha ocorrido erro, retorna zero
Faça o exemplo das página 85-87.
Crie uma mensagem personalizada para cada caso de erro, adicione na tabela de mensagens do sistema e mostre o erro gerado, se for o caso, no lote que executou a procedure.
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
Função RAISERRORGera um erro.Utilizada quando da verificação da possibilidade de um erro, lógico, de negócio ou de sistema.Pode ser utilizado para evitar o erro do SGBD e tratar o erro personalizado
Exemplo das páginas 89-90
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
ExercícioFazer pesquisa fonética em uma tabela do BD. Algoritmo Soundex como procedure.Este algoritimo foi criado pelo governo Americano para recuperar nomes para a administração da Seguridade Social nos arquivos Nacionais. O algoritimo é simples e esta explicado a seguir.
Uma chave de busca é foneticamente igual à algum dado da tabela, se o código SOUNDEX dela for igual ao código SOUNDEX de um registro do dado da tabela.O código soundex é obtido conforme as seguintes regras:Se o código for maior que quatro caracteres os demais não serão considerados. Se for menor serão acrescidos Zeros.Você preserva o primeiro caractere da String e atribui valores conforme a tabela abaixo até 3 caracteres.As vogais A,E,I,O,U os caracteres Y,W e H e os demais caracteres não são considerados.Os caracteres numéricos são considerados apenas para a primeira casa , os demais não consideradosHavendo caracteres repetidos somente o primeiro será considerado
Procedimentos ArmazenadosProcedimentos Armazenados
Exercício
SQL AvanSQL Avanççadoado
R6
M, N5
L4
D, T3
C , S , G , J . K , Q , X , Z2
B, P, F, V1
Para palavras curtas0
Soundex da palavra BROWN
B = B
R = 6
O = -
W = 0
N = 5
B650
CaractereCódigo do caractere
Procedimentos ArmazenadosProcedimentos Armazenados
SQL AvanSQL Avanççadoado
FunFunçções do usuões do usuááriorio
SQL AvanSQL Avanççadoado
Recurso que permite a customização de funções para o usuário.
RestriçõesDevem retornar algum valor (escalar ou tabela)
Aceitam nenhum ou vários parâmetros de entradaNão aceitam parâmetros de saída
16
FunFunçções do usuões do usuááriorio
SQL AvanSQL Avanççadoado
Tipos:Escalares
Funções simples, que processam alguma tarefa e retornam um escalar.
Com valor de tabela e instruçõesSemelhantes a procedimentosPermitem o uso numa instrução FROM e SELECT
Com valor de tabela in-lineAssemelha-se ao uso de views, porém com suporte à parâmetros
FunFunçções do usuões do usuááriorio
SQL AvanSQL Avanççadoado
Criação (CREATE FUNCTION):Veja sintaxe na página 94 do manual.GO
CREATE FUNCTION fn_NewRegion (
(@param1 NVARCHAR(30))
RETURNS NVARCHAR(30)
BEGIN
IF @param1 IS NULL
SET @param1 = ‘Não Aplicável’
RETURN @param1
END
FunFunçções do usuões do usuááriorio
SQL AvanSQL Avanççadoado
Uso da função em SELECT:SELECT LastName, City, dbo.fn_NewRegion(Region) AS Region, Country
FROM dbo.Employees
FunFunçções do usuões do usuááriorio
SQL AvanSQL Avanççadoado
Alteração:A alteração da função segue a mesma sintaxe de estrutura da criação, com exceção da palavra-chave do comando:
ALTER FUNCTION dbo.fn_NewRegion ...
Exclusão de funções:Semelhante aos demais objetos:
DROP FUNCTION dbo.fn_NewRegion
FunFunçções do usuões do usuááriorio
SQL AvanSQL Avanççadoado
Fazer exemplos das páginas:98 � funções escalares
99—100 � com valor de tabela101—102 � tabela in-line.
Discussão sobre os exemplos:Quais são as características de cada tipo?Em qual situação devemos usar qual tipo de função?
FunFunçções do usuões do usuááriorio
SQL AvanSQL Avanççadoado
Boas práticas:Funções complexas em dados pequenos
Cuidado com o encapsulamentoAs funções escondem a complexidade de uma consulta simples
Prefira funções à procedimentos
Funções in-line são parecidas com view, mas com uma vantagem: permitem parâmetros
17
FunFunçções do usuões do usuááriorio
SQL AvanSQL Avanççadoado
Exercício:Converter o procedimento SoundexFunc para uma funçãoCriar tabela de Pessoa com os atributos nome e sobrenomeEscrever testes usando a SoundexFunc para validar o uso da funçãoPergunta:
A comparação usando SoundexFunc é mais lenta que a comparação direta de nomes, porque precisa converter o nome para um código antes de pesquisar; mata o índice!! Então qual seria a solução para utilizar o recurso do soundex sem perda de índices?
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
SQL AvanSQL Avanççadoado
São um tipo especial de procedimento que executados sempre que ocorre algum evento.
Por exemplo, pode-se criar uma trigger (ou disparador) para que, toda vez que seja inserido um registro em uma determinada tabela, seja criado algum outro registro de relacionamento.
A execução ocorre automaticamente, quando ocorre o evento ao qual a trigger está associada.
Inclusive não invocados manualmente
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
SQL AvanSQL Avanççadoado
Uso:Mais usado para manter integridade
Automatização de operações complexas em cascata
Customizar verificações e mensagensPermite trabalhar com estado atual e anterior de um dado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
SQL AvanSQL Avanççadoado
Uso:Operações em cascata
Alteração e exclusão em cascata
Automatização de operações complexas de integridade
Por exemplo, verificar o estado de um atributo comparando com outras tabelas; caso ele esteja dentro de uma faixa de valores realiza alguma operação sobre os dados, caso contrário realiza outra. Digamos que pedido não pode pedir mais do que X unidades de um produto que está num limite mínimo em estoque.
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
SQL AvanSQL Avanççadoado
Uso:Customizar verificações e mensagens
Verifica alguma condição especial do sistema e lança um erro de lógica de negócios apropriado.
DesnormalizaçãoJunção de várias tabelas para consolidação de dadosModelo continua íntegro, mas a visualização pode ser feita conjunta
Permite trabalhar com estado atual e anterior de um dado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
SQL AvanSQL Avanççadoado
Considerações:Podem conter ROLLBACK
Entretanto, se é necessário sair do script da trigger quando éfeito um ROLLBACK, é melhor usar comando RETURN para sair da execução
Em geral, os disparadores são reativos:Dado um evento um disparador é executadoRestrições e INSTEAD OF são executados antes do evento
Disparadores podem afetar várias linhas de dados@@ROWCOUNT
18
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
SQL AvanSQL Avanççadoado
Criação (CREATE TRIGGER)CREATE TRIGGER nome ON tabela
{FOR | AFTER | INSTEAD OF | }
{INSERT | UPDATE | DELETE}
AS
IF UPDATE(coluna)
...
Instruções
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
SQL AvanSQL Avanççadoado
Criação (CREATE TRIGGER):FOR e AFTER são executados após as ações INSERT, UPDATE ou DELETEINSTEAD OF, pelo contrário, cancela a operação e desvia para execução do código do disparador
Conferir em casa as instruções que não podem estar presentes nas triggers (página 114)Fazer exemplo das páginas 115—116.
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
SQL AvanSQL Avanççadoado
Alterando uma trigger:Usar o comando ALTER TRIGGER, cuja sintaxe é igual a do comando CREATE TRIGGER
Descartando ou removendo uma trigger:DROP TRIGGER
Desativando / Ativando triggersALTER TABLE tabela {ENABLE | DISABLE} TRIGGER {ALL | nome da trigger [,...]}
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
SQL AvanSQL Avanççadoado
Funcionamento de triggerAcesso aos dados temporários e log para tomada de decisõesInsert: tabela insertedDelete: tabela deleted
Dados removidos das tabelas do BD
Update: registra em ambas as tabelas temporárias: deleted (os dados anteriores) e inserted (dados novos)
IF UPDATE(coluna) determina se um registro foi alterado ou não e executar instruções conforme o casoExemplo da página 122.
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
SQL AvanSQL Avanççadoado
Funcionamento INSTEAD OFPode ser associado a tabelas e views
Não pode ser associado a views com WITH CHECK OPTION
Executa operações antes da instrução de atualizaçãoExemplo das páginas 123—124
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
SQL AvanSQL Avanççadoado
Disparadores aninhados:Quando um disparador é executado, o resultado da sua execução inicia um novo disparador, que pode iniciar outro e ...Limite de 32 disparadores aninhadossp_configure habilita / desabilita aninhamento de triggers
sp_configure (‘nested triggers’, 0)
Aninhamento cíclio não é permitido / executadoAtenção para aninhamento com dados complexos
19
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
SQL AvanSQL Avanççadoado
Ativando recursividadeRecursividade é capacidade de um método em chamar ele mesmo para executar novamente, sob novas condições, até um ponto de parada.
Ativação:ALTER DATABASE ClassNorthwind SET RECURSIVE_TRIGGERS ON
Recursividade pode ser direta ou indireta (cíclica)
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
SQL AvanSQL Avanççadoado
Exercícios:Páginas 131—132Criar uma tabela pessoa com os campos: código, nome e sobrenome.Criar uma trigger que, quando um registro é inserido na tabela pessoa, ela, automaticamente, insere um registro equivalente na tabela PessoaSoundex com os dados de pessoa, passando pela função soundexTest. A tabela PessoaSoundex contém os seguintes campos: codigo, nomex, sobrenomex.Faça um procedimento que receba como parâmetro o nome de uma pessoa, e faça a pesquisa pelo nome soundex de uma pessoa, fazendo uso das tabelas acima. Lógica:
Converter o parâmetro para um código soundexProcurar na tabela PessoaSoundex os registro com códigos equivalentes, mas retornar os dados equivalentes na tabela Pessoa
ÍÍndicesndices
SQL AvanSQL Avanççadoado
UsoMelhorar o desempenho de consultas, agilizando (indexando) o acesso a dados
Criação de índicesCREATE INDEX
Remoção de índicesDROP INDEX
ÍÍndicesndices
SQL AvanSQL Avanççadoado
Índices automáticos:PRIMARY KEY e UNIQUE
Armazenados na tabela sysindexesUm índice funciona atribuindo uma chave de busca a um dado
O situação é: apenas um valor de chave para um dado (1 : 1)Pode acontecer de uma chave retornar mais de um dado.
Quando um índice de agrupamento é criado, todos os índices sem agrupamento são recriadosSintaxe e exemplo na página 135
ÍÍndicesndices
SQL AvanSQL Avanççadoado
Índices agrupamento:CLUSTERED
Exemplo da página 139, mostra índices duplicados
Sem agrupamento:NONCLUSTERED
ÍÍndicesndices
SQL AvanSQL Avanççadoado
Índices compostos:União mais de um campoPor exemplo, não permitir duplicidade de registros com valores de outras tabelas associadasDigamos uma tabela de relacionamento entre Pessoa e uma tabela de endereço. É possível colocar uma restrição com índice para que uma pessoa não dois vínculos para um mesmo endereço.Exemplo da página 141.Exercício: criar a situação exposta acima (pessoa x endereço)