Você está na página 1de 19
SQLSQL AvanAvanççadoado
SQLSQL AvanAvanççadoado

Leandro Tonietto

ltonietto@unisinos.br

www.inf.unisinos.br/~ltonietto

jan-07

SQLSQL AvanAvanççadoado Leandro Tonietto ltonietto@unisinos.br www.inf.unisinos.br/~ltonietto jan-07
SQLSQL AvanAvanççadoado AgendaAgenda parapara 09/1209/12 Introdução Transact-SQL Elementos de sintaxe
SQLSQL AvanAvanççadoado
AgendaAgenda parapara 09/1209/12
Introdução Transact-SQL
Elementos de sintaxe
Implementando Views
Conceitos
Criação e modificação
Otimização
SQLSQL AvanAvanççadoado TiposTipos dede linguagemlinguagem parapara BDBD DDL - Data Definition Language Definição
SQLSQL AvanAvanççadoado
TiposTipos dede linguagemlinguagem parapara BDBD
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-SQL
Programação de funções auxiliares
SQLSQL AvanAvanççadoado ApresentaApresentaççãoão Sobre o instrutor: Professor no curso de Jogos e Entretenimento
SQLSQL AvanAvanççadoado
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
ltonietto@unisinos.br
Expectativa quando ao aproveitamento do
curso
SQLSQL AvanAvanççadoado TransactionTransaction--SQLSQL O Transact-SQL é uma linguagem de definição, manipulação
SQLSQL AvanAvanççadoado
TransactionTransaction--SQLSQL
O Transact-SQL é uma linguagem de
definição, manipulação e controle de dados.
Padronização SQL-92
ISO e ANSI
Elementos de linguagem de programação
Diretivas, comentários, identificadores, controle
de fluxo, loops, funções, expressões,
SQLSQL AvanAvanççadoado ElementosElementos dede LinguagemLinguagem Diretivas de lotes Comentários
SQLSQL AvanAvanççadoado
ElementosElementos dede LinguagemLinguagem
Diretivas de lotes
Comentários
Identificadores
Tipos de dados
Variáveis
Funções do sistema
Operadores
Expressões
Controle de fluxo
Palavras reservadas
SQLSQL AvanAvanççadoado DiretivaDiretiva dede loteslotes Lote: Conjunto de instruções de programação SQL Server
SQLSQL AvanAvanççadoado
DiretivaDiretiva dede loteslotes
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 SGBD
Duas instruções: GO e EXEC
SQLSQL AvanAvanççadoado DiretivaDiretiva dede loteslotes GO: “Exemplo”: /* bloco de comandos 1 */ DECLARE
SQLSQL AvanAvanççadoado
DiretivaDiretiva dede loteslotes
GO:
“Exemplo”:
/* bloco de comandos 1 */
DECLARE @EmpID varchar(11)
GO
/* bloco de comandos 2 */
SET @EmpID = ‘Teste’
OO escopoescopo dada varivariáávelvel
éé lote. lote. O O lote lote éé
conjuntoconjunto instruinstruççõesões
separadasseparadas porpor GOGO’’ss
Serão Serão executados executados
apenas apenas os os lotes lotes
apapóós s o o comando comando GO GO
OO queque aconteceriaaconteceria sese estesestes blocosblocos dede comandoscomandos fossefossemm executados?executados?
SQLSQL AvanAvanççadoado ComentComentááriosrios São códigos não executáveis de um lote de comandos Geralmente
SQLSQL AvanAvançç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ódigo
colocar explicações curtas sobre uma função ou lote
Suprimir execução de linhas de código sem removê-las
Comentário de linha: --
Comentário de bloco: /*
*/
SQLSQL AvanAvanççadoado DiretivaDiretiva dede loteslotes GO: Envia lote atual de instruções para execução O lote
SQLSQL AvanAvanççadoado
DiretivaDiretiva dede loteslotes
GO:
Envia lote atual de instruções para execução
O 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
SQLSQL AvanAvanççadoado DiretivaDiretiva dede loteslotes EXEC: Executa comandos do usuário Comandos TransacSQL
SQLSQL AvanAvanççadoado
DiretivaDiretiva dede loteslotes
EXEC:
Executa comandos do usuário
Comandos TransacSQL
Funções
Lotes
Comandos são passados por parâmetro e o
método retorna o status da execução: sucesso
ou erro.
SQLSQL AvanAvanççadoado ComentComentááriosrios Exemplo 1: USE northwind SELECT productname ,
SQLSQL AvanAvanççadoado
ComentComentááriosrios
Exemplo 1:
USE northwind
SELECT productname
, (unitsinstock-unitsonorder) -- Calcula inventário
-- , supplierid
FROM products
---- indicaindica aoao interpretadorinterpretador dede
GO
comandocomando queque ignoreignore oo estiverestiver àà suasua
direita,direita, atatéé oo fimfim dada linhalinha
SuprimindoSuprimindo umum linhalinha
SQLSQL AvanAvanççadoado ComentComentááriosrios Exemplo 2: /* Este código recupera todas as linhas da tabela
SQLSQL AvanAvanççadoado
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 northwind
SELECT unitprice, (unitprice * 1.1), productname
FROM products
GO
NormalmenteNormalmente osos comentcomentááriosrios dede blocosblocos sãosão usadosusados parapara
comentarcomentar blocosblocos dede linhaslinhas dede ccóódigodigo ee colocarcolocar explicaexplicaççõesões
sobresobre oo queque éé executadoexecutado nono lotelote
SQLSQL AvanAvanççadoado IdentificadoresIdentificadores Exemplo: DECLARE @v1@v1 int
SQLSQL AvanAvanççadoado
IdentificadoresIdentificadores
Exemplo:
DECLARE @v1@v1 int
SQLSQL AvanAvanççadoado ConvenConvenççãoão dede NomesNomes dede IdentificadoresIdentificadores Mantém um padrão
SQLSQL AvanAvanççadoado
ConvenConvenççãoão dede NomesNomes dede IdentificadoresIdentificadores
Mantém um padrão de escrita
Facilita manutenção de código
Diretrizes:
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
dados.
de
SQLSQL AvanAvanççadoado IdentificadoresIdentificadores São nomes ou identificação única para variáveis e
SQLSQL AvanAvanççadoado
IdentificadoresIdentificadores
São nomes ou identificação única para variáveis e funções
Os 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.
SQLSQL AvanAvanççadoado IdentificadoresIdentificadores delimitadosdelimitados Os identificadores delimitados podem ser
SQLSQL AvanAvanççadoado
IdentificadoresIdentificadores delimitadosdelimitados
Os identificadores delimitados podem ser
usados nas seguintes situações:
Quando os nomes contiverem espaços
incorporados
Quando forem utilizadas palavras reservadas
como nomes de objetos ou partes de nomes
objetos
de
Os identificadores delimitados devem ser
colocados entre parênteses ou aspas
duplas.
SQLSQL AvanAvanççadoado TiposTipos dede dadosdados Os tipos de dados são atributos que especificam o tipo
SQLSQL AvanAvanççadoado
TiposTipos dede dadosdados
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
SQLSQL AvanAvanççadoado TiposTipos dede dadosdados Numéricos: Para representação de números Inteiros: int,
SQLSQL AvanAvanççadoado
TiposTipos dede dadosdados
Numéricos:
Para representação de números
Inteiros: int, tinyint, smallint e bigint
Decimais: numeric, decimal, money e
smallmoney
Ponto flutuante: float e real
SQLSQL AvanAvanççadoado TiposTipos dede dadosdados Characters Este tipo de dados é usado para representar
SQLSQL AvanAvanççadoado
TiposTipos dede dadosdados
Characters
Este 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ários
Este 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.
SQLSQL AvanAvanççadoado TiposTipos dede dadosdados Image e Text Estes tipos de dados são estruturas objeto
SQLSQL AvanAvanççadoado
TiposTipos dede dadosdados
Image e Text
Estes 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.
Tables
Este 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.
Cursors
Este 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.
SQLSQL AvanAvanççadoado TiposTipos dede dadosdados Numéricos: Para representação de números Inteiros: int,
SQLSQL AvanAvanççadoado
TiposTipos dede dadosdados
Numéricos:
Para representação de números
Inteiros: int, tinyint, smallint e bigint
Decimais: numeric, decimal, money e smallmoney
Ponto 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.
SQLSQL AvanAvanççadoado TiposTipos dede dadosdados Unique Identifiers Este tipo especial de dados é um
SQLSQL AvanAvanççadoado
TiposTipos dede dadosdados
Unique Identifiers
Este 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 Variantes
Este 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.
SQLSQL AvanAvanççadoado TiposTipos dede dadosdados Definidos pelo usuário Este tipo de dados é criado pelo
SQLSQL AvanAvanççadoado
TiposTipos dede dadosdados
Definidos pelo usuário
Este tipo de dados é criado pelo administrador
do banco de dados e se baseia nos tipos de
dados do sistema.
Use os tipos de dados definidos pelo 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.
SQLSQL AvanAvanççadoado VariVariááveisveis Variável é um recurso de linguagem de programação para definição
SQLSQL AvanAvanççadoado
VariVariááveisveis
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 @
SQLSQL AvanAvanççadoado VariVariááveisveis Exemplo: USE northwind DECLARE @EmpID varchar(11) ,@vlName char(20)
SQLSQL AvanAvanççadoado
VariVariááveisveis
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
SQLSQL AvanAvanççadoado FunFunççõesões dodo sistemasistema Tipos de funções: Retornam um valor individual que
SQLSQL AvanAvanççadoado
FunFunççõesões dodo sistemasistema
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 caracteres
Efetua 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.
SQLSQL AvanAvanççadoado VariVariááveisveis Sintaxe de uso geral: DECLARE {@<nome> <tipo_de_dados>}
SQLSQL AvanAvanççadoado
VariVariááveisveis
Sintaxe de uso geral:
DECLARE {@<nome> <tipo_de_dados>} [,
SET @nome_da_variável_local = expressão
n]
Exemplos:
DECLARE @nome varchar(70)
DECLARE @soma int
SET @soma 0
SQLSQL AvanAvanççadoado FunFunççõesões dodo sistemasistema O Transac-SQL permite a execução de funções
SQLSQL AvanAvanççadoado
FunFunççõesões dodo sistemasistema
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 mesmos
USE northwind
SELECT AVG(unitprice) AS AvgPrice
FROM products
GO
AVG AVG calcula calcula
mméédiadia
SQLSQL AvanAvanççadoado FunFunççõesões dodo sistemasistema Exemplo: USE northwind SELECT DB_NAME() AS
SQLSQL AvanAvanççadoado
FunFunççõesões dodo sistemasistema
Exemplo:
USE northwind
SELECT DB_NAME() AS 'database'
GO
SQLSQL AvanAvanççadoado FunFunççõesões dodo sistemasistema Tipos de funções: Podem ser usadas como referências
SQLSQL AvanAvanççadoado
FunFunççõesões dodo sistemasistema
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')
GO
EstEstáá funfunççãoão funcionarfuncionaráá sempre?sempre?
SQLSQL AvanAvanççadoado FunFunççõesões dodo sistemasistema Resultado: Style ANSI: 1998.11.20 Japanese:
SQLSQL AvanAvanççadoado
FunFunççõesões dodo sistemasistema
Resultado:
Style
ANSI: 1998.11.20
Japanese: 11/20/98
European: 20 Nov 1998 16:44:12:857
SQLSQL AvanAvanççadoado FunFunççõesões dodo sistemasistema Exemplo de função que interage com dados do SGDB:
SQLSQL AvanAvanççadoado
FunFunççõesões dodo sistemasistema
Exemplo de função que interage com dados
do SGDB:
USE library
SELECT user_name(), app_name()
GO
SQLSQL AvanAvanççadoado FunFunççõesões dodo sistemasistema Função de conversão de data: SELECT
SQLSQL AvanAvanççadoado
FunFunççõesões dodo sistemasistema
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)
RepareRepare queque aa instruinstruçção SELECT
ão SELECT
GO
retornaretorna dadosdados queque concatenadosconcatenados
UNIONUNION agrupaagrupa conjuntoconjunto dede dadosdados
SQLSQL AvanAvanççadoado FunFunççõesões dodo sistemasistema Exemplo do uso da função DATEFORMAT: SET DATEFORMAT
SQLSQL AvanAvanççadoado
FunFunççõesões dodo sistemasistema
Exemplo do uso da função DATEFORMAT:
SET DATEFORMAT dmy
GO
DECLARE @vdate datetime
SET @vdate = '11/29/98'
SELECT @vdate
GO
DATEFORMATDATEFORMAT definedefine oo formatoformato dede
datadata padrãopadrão atualatual
RepareRepare queque aa datadata éé impressaimpressa ((dmydmy))
dede formaforma diferentediferente dodo padrãopadrão ANSIANSI
SQLSQL AvanAvanççadoado FunFunççõesões dodo sistemasistema Exemplo de função que obtém dados sobre o BD: USE
SQLSQL AvanAvanççadoado
FunFunççõesões dodo sistemasistema
Exemplo de função que obtém dados sobre
o BD:
USE library
SELECT
COLUMNPROPERTY(OBJECT_ID('member'),
'firstname', 'AllowsNull')
GO
SQLSQL AvanAvanççadoado OperadoresOperadores Operadores são símbolos que efetuam cálculos matemáticos,
SQLSQL AvanAvanççadoado
OperadoresOperadores
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
SQLSQL AvanAvanççadoado OperadoresOperadores Precedência: Agrupamento primário: ( ) Aritmético Multiplicativo: *,
SQLSQL AvanAvanççadoado
OperadoresOperadores
Precedência:
Agrupamento primário: ( )
Aritmético Multiplicativo: *, / e %
Aritmético Aditivo: – e +
Concatenação de seqüências de caracteres:
+
Lógico NOT: NOT
Lógico AND: AND
Lógico OR: OR
SQLSQL AvanAvanççadoado ExpressõesExpressões Exemplo: USE northwind SELECT OrderID, ProductID ,(UnitPrice *
SQLSQL AvanAvanççadoado
ExpressõesExpressões
Exemplo:
USE northwind
SELECT OrderID, ProductID
,(UnitPrice * Quantity) as ExtendedAmount
FROM [Order Details]
WHERE (UnitPrice * Quantity) > 10000
GO
SQLSQL AvanAvanççadoado OperadoresOperadores Aritméticos: Aditivos: + e – Multiplicativos: *, / e %
SQLSQL AvanAvanççadoado
OperadoresOperadores
Aritméticos:
Aditivos: + e –
Multiplicativos: *, / e %
Comparação:
Retornam verdadeiro ou falso
=, <, >, <=, >= e <>
Concatenação:
Somente com dados String: +
Lógicos
Utilizados para conectar o resultado de mais de uma expressão
OR, AND e NOT
Usados na cláusula WHERE
SQLSQL AvanAvanççadoado ExpressõesExpressões Combinação de campos e variáveis com operadores e funções para
SQLSQL AvanAvanççadoado
ExpressõesExpressões
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
SQLSQL AvanAvanççadoado ElementosElementos dede ControleControle dede FluxoFluxo elementos de linguagem que controlam
SQLSQL AvanAvanççadoado
ElementosElementos dede ControleControle dede FluxoFluxo
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
SQLSQL AvanAvanççadoado ElementosElementos dede ControleControle dede FluxoFluxo Exemplo – nível de instrução:
SQLSQL AvanAvanççadoado
ElementosElementos dede ControleControle dede FluxoFluxo
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
=
SQLSQL AvanAvanççadoado ViewsViews Definição: São tabelas que representam uma visão de um conjunto de dados
SQLSQL AvanAvanççadoado
ViewsViews
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
SQLSQL AvanAvanççadoado ViewsViews Vantagens: Visualização focalizada Tirar a complexidade da visualização dos
SQLSQL AvanAvanççadoado
ViewsViews
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ção
Permissão de acesso com restrições
Desempenho, pois o resultado fica
“armezanado”
SQLSQL AvanAvanççadoado ElementosElementos dede ControleControle dede FluxoFluxo Exemplo – nível de registro:
SQLSQL AvanAvanççadoado
ElementosElementos dede ControleControle dede FluxoFluxo
Exemplo – nível de registro:
DECLARE @n tinyint
SET @n = 5
IF (@n BETWEEN 4 and 6)
BEGIN
WHILE (@n > 0)
BEGIN
SELECT @n AS 'Número',
CASE
WHEN (@n % 2) = 1
THEN 'ÍMPAR'
ELSE 'PAR'
END AS 'Tipo‘
SET @n = @n - 1
END
END
ELSE
PRINT 'SEM ANÁLISE'
GO
SQLSQL AvanAvanççadoado ViewsViews Exemplos: Um subconjunto de registros ou colunas de uma tabela base: subconjunto
SQLSQL AvanAvanççadoado
ViewsViews
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 masculino
Um 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.
SQLSQL AvanAvanççadoado ViewsViews Sintaxe: CREATE VIEW propr.nome_da_view [(coluna [,n ])] [WITH {ENCRYPTION |
SQLSQL AvanAvanççadoado
ViewsViews
Sintaxe:
CREATE VIEW propr.nome_da_view [(coluna [,n ])]
[WITH {ENCRYPTION | SCHEMABINDING | VIEW_METADATA}
[,n ]]
AS
instrução_select
[WITH CHECK OPTION]
SQLSQL AvanAvanççadoado ViewsViews View no Transact: USE Northwind GO CREATE VIEW dbo.EmployeeView AS SELECT
SQLSQL AvanAvanççadoado
ViewsViews
View no Transact:
USE Northwind
GO
CREATE VIEW dbo.EmployeeView AS
SELECT LastName, Firstname
FROM Employees
GO
SELECT * from EmployeeView
GO
SQLSQL AvanAvanççadoado ViewsViews Só podem criar views usuários com permissão de administradores do BD Definir
SQLSQL AvanAvanççadoado
ViewsViews
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.
SQLSQL AvanAvanççadoado ViewsViews Exemplo 2: USE Northwind GO CREATE VIEW dbo.OrderSubtotalsView (OrderID,
SQLSQL AvanAvanççadoado
ViewsViews
Exemplo 2:
USE Northwind
GO
CREATE VIEW dbo.OrderSubtotalsView (OrderID,
Subtotal)
AS
SELECT OD.OrderID,
SUM(CONVERT
(money,(OD.UnitPrice*Quantity*(1-
Discount)/100))*100)
FROM [Order Details] OD
GROUP BY OD.OrderID
GO
SELECT * FROM OrderSubtotalsView
GO
SQLSQL AvanAvanççadoado ViewsViews Padronização: Segue a mesma verificação dos identificadores Nomes devem ser
SQLSQL AvanAvanççadoado
ViewsViews
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: Pessoas
View: View_Pessoas_Masculino
SQLSQL AvanAvanççadoado ViewsViews Restrições: A instrução CREATE VIEW não pode incluir as cláusulas COMPUTE
SQLSQL AvanAvanççadoado
ViewsViews
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.
SQLSQL AvanAvanççadoado ViewsViews Views para fornecer um modo conveniente de examinar informações de duas ou
SQLSQL AvanAvanççadoado
ViewsViews
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 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
GO
SQLSQL AvanAvanççadoado ViewsViews Encriptação: Usar a opção WITH ENCRYPTION na criação da view Criptografa
SQLSQL AvanAvanççadoado
ViewsViews
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
SQLSQL AvanAvanççadoado ViewsViews Exercício: Crie a tabela Pessoas no transact-SQL, com os campos nome, idade
SQLSQL AvanAvanççadoado
ViewsViews
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.
SQLSQL AvanAvanççadoado ViewsViews Atenção: Se você definir uma view com uma instrução SELECT * e,
SQLSQL AvanAvanççadoado
ViewsViews
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.
SQLSQL AvanAvanççadoado ViewsViews Exercício: Criar a view: página ?? Sem a opção de encriptação Ver
SQLSQL AvanAvanççadoado
ViewsViews
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ção
Ver novamente os dados da tabela
syscomments
SQLSQL AvanAvanççadoado ViewsViews Alterando de definição da view Exemplo: USE Northwind GO ALTER VIEW
SQLSQL AvanAvanççadoado
ViewsViews
Alterando de definição da view
Exemplo:
USE Northwind
GO
ALTER VIEW dbo.EmployeeView
AS
SELECT LastName, FirstName, Extension
FROM Employees
SQLSQL AvanAvanççadoado ViewsViews Apagando uma view DROP VIEW <nome da view> Apague a view definida
SQLSQL AvanAvanççadoado
ViewsViews
Apagando uma view
DROP VIEW <nome da view>
Apague a view definida no exercício anterior
SQLSQL AvanAvanççadoado ViewsViews Atualização dos dados através das views é possível considerando as seguintes
SQLSQL AvanAvanççadoado
ViewsViews
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ção
Poderão ocasionar erros se afetarem colunas
às quais a view não faz referência.
SQLSQL AvanAvanççadoado ViewsViews Práticas recomendadas: Nomes consistentes e com um padrão que os distinguem das
SQLSQL AvanAvanççadoado
ViewsViews
Práticas recomendadas:
Nomes consistentes e com um padrão que os distinguem das
tabelas; facilitando a identificação das views
Dbo 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.
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Tipos Armazenados no BD do sistema.
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Tipos
Armazenados no BD do sistema.
Fornecem informações das tabelas do sistema
Por padrão, precedidos por “sp_”
São funções do sistema
Usados por qualquer BD
Procedimentos de armazenamento local
Uso 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 BD
Prefixo “xp_”
SQLSQL AvanAvanççadoado ViewsViews Otimização de desempenho Armazenamento de dados de consultas completas Joins
SQLSQL AvanAvanççadoado
ViewsViews
Otimização de desempenho
Armazenamento 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 resultados
Exemplo das páginas 49-50
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Stored procedures Coleção nomeada de
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Stored procedures
Coleção nomeada de instruções TransactSQL
que é 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)
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Características Instruções para executar
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Características
Instruções para executar operações sobre o
Permite passagem de parâmetros
Retorno de status da execução
Parâmetros de saída
BD
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Processamento Criação Primeira consulta,
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Processamento
Criação
Primeira consulta, coloca o plano de consulta
respectivo no cache.
Cache alocado conforme necessidade
Cache de procedimentos
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Comando de criação: CREATE PROCEDURE Cria
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Comando de criação: CREATE PROCEDURE
Cria o procedimento e armazena na BD
A criação pode referenciar tabelas, view, variáveis,
O que é criado dentro do procedimento não tem vida
externa ao mesmo
Primeiro testar o código e depois realizar o
armazenamento do mesmo
Uma 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.
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Exemplo 1: USE Northwind GO CREATE PROC
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Exemplo 1:
USE Northwind
GO
CREATE PROC dbo.OverdueOrders
AS
SELECT * FROM dbo.Orders WHERE
RequiredDate < GETDATE() AND
ShippedDate IS NULL
GO
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Processo de criação: Codificação
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Processo de criação:
Codificação
Verificaçã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
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Sintaxe CREATE PROCEDURE CREATE PROC nome
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Sintaxe CREATE PROCEDURE
CREATE PROC nome [;número]
[{@parâmetro tipo_dado}
[VARYING][=padrao][OUTPUT]][,
n]
[{RECOMPILE|ENCRYPTION|”ambos”}]
[FOR REPLICATION]
AS
Instrução_sql[
n]
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Diretrizes para criação: Recomendo que o
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
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ção
Evitar uso de objetos temporários, por questões de
desempenho.
Prefira sp_executesql do que EXECUTE
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Executando um procedimento: EXEC {[@status
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Executando um procedimento:
EXEC {[@status retorno=]
{nome_procedimento[;número]|@var_no
me_procedimento}
}
[[@parâmetro={valor|@variável[OUTPUT]
|[DEFAULT]][,
n]
[WITH RECOMPILE]
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Alteração Altera código de uma procedure
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Alteração
Altera código de uma procedure existente
Sintaxe é parecida com a CREATE
Ver página 70.
ALTER PROC vai alterar o conteúdo da PROC
dentro da tabela syscomments
Exemplo da página 71
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Usando parâmetros de entrada Permitem
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Usando parâmetros de entrada
Permitem passagem de valores externos para o
procedimento. Generaliza o procedimento.
Comando: CREATE PROC @param tipo
Considere:
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.
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Executando um procedimento: EXEC
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
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.
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Remoção de procedures Interessante
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Remoção de procedures
Interessante executar comando sp_depends
antes de excluir um registro, para verificar as
dependências.
Sintaxe:
DROP PROCEDURE {nome_proc}
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Considerações sobre o exemplo: Ordem da
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Considerações sobre o exemplo:
Ordem da declaração difere da ordem de
passagem dos parâmetros
Parâ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.
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Parâmetros de retorno Servem para retornar
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Parâmetros de retorno
Servem 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.
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Tratamento de erros: Tratamento de
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
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.
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Tratamento de erros: USE Northwind GO
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
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
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Exercícios: crie um procedimento que
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Exercícios:
crie um procedimento que retorne o maior entre
dois números
outro para o menor
outro para retornar a média.
Teste os procedimentos criados
Calcular fatorial de um número.
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Tratamento de erros: Instrução RETURN:
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Tratamento de erros:
Instrução RETURN:
Retorna para método anterior
Retorna um valor ou não
També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
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Função sp_addmessage Insere uma mensagem
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Função sp_addmessage
Insere 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
procedure
da
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Função @@error Retorna o número do erro
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Função @@error
Retorna 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.
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Exercício Fazer pesquisa fonética em uma
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Exercício
Fazer 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 ,
demais não considerados
Havendo caracteres repetidos somente o primeiro será considerado
os
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Função RAISERROR Gera um erro. Utilizada
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Função RAISERROR
Gera 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
SQLSQL AvanAvanççadoado ProcedimentosProcedimentos ArmazenadosArmazenados Exercício Código do caractere Caractere
SQLSQL AvanAvanççadoado
ProcedimentosProcedimentos ArmazenadosArmazenados
Exercício
Código do caractere
Caractere
Soundex da palavra BROWN
B = B
0
Para palavras curtas
R
= 6
1
B,
P, F, V
O
= -
W
= 0
2
C
, S
, G , J
. K
, Q , X , Z
N
= 5
3
D,
T
4
L
B650
5
M,
N
6
R
SQLSQL AvanAvanççadoado FunFunççõesões dodo usuusuááriorio Recurso que permite a customização de funções
SQLSQL AvanAvanççadoado
FunFunççõesões dodo usuusuááriorio
Recurso que permite a customização de
funções para o usuário.
Restrições
Devem retornar algum valor (escalar ou tabela)
Aceitam nenhum ou vários parâmetros de
entrada
Não aceitam parâmetros de saída
SQLSQL AvanAvanççadoado FunFunççõesões dodo usuusuááriorio Tipos: Escalares Funções simples, que processam
SQLSQL AvanAvanççadoado
FunFunççõesões dodo usuusuááriorio
Tipos:
Escalares
Funções simples, que processam alguma tarefa e
retornam um escalar.
Com valor de tabela e instruções
Semelhantes a procedimentos
Permitem o uso numa instrução FROM e SELECT
Com valor de tabela in-line
Assemelha-se ao uso de views, porém com suporte
à parâmetros
SQLSQL AvanAvanççadoado FunFunççõesões dodo usuusuááriorio Uso da função em SELECT: SELECT LastName, City,
SQLSQL AvanAvanççadoado
FunFunççõesões dodo usuusuááriorio
Uso da função em SELECT:
SELECT LastName, City,
dbo.fn_NewRegion(Region) AS Region,
Country
FROM dbo.Employees
SQLSQL AvanAvanççadoado FunFunççõesões dodo usuusuááriorio Fazer exemplos das páginas: 98 funções escalares
SQLSQL AvanAvanççadoado
FunFunççõesões dodo usuusuááriorio
Fazer exemplos das páginas:
98 funções escalares
99—100 com valor de tabela
101—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?
SQLSQL AvanAvanççadoado FunFunççõesões dodo usuusuááriorio Criação (CREATE FUNCTION): Veja sintaxe na página
SQLSQL AvanAvanççadoado
FunFunççõesões dodo usuusuááriorio
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
SQLSQL AvanAvanççadoado FunFunççõesões dodo usuusuááriorio Alteração: A alteração da função segue a mesma
SQLSQL AvanAvanççadoado
FunFunççõesões dodo usuusuááriorio
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
SQLSQL AvanAvanççadoado FunFunççõesões dodo usuusuááriorio Boas práticas: Funções complexas em dados
SQLSQL AvanAvanççadoado
FunFunççõesões dodo usuusuááriorio
Boas práticas:
Funções complexas em dados pequenos
Cuidado com o encapsulamento
As 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
SQLSQL AvanAvanççadoado FunFunççõesões dodo usuusuááriorio Exercício: Converter o procedimento SoundexFunc
SQLSQL AvanAvanççadoado
FunFunççõesões dodo usuusuááriorio
Exercício:
Converter o procedimento SoundexFunc para uma
função
Criar tabela de Pessoa com os atributos nome e
sobrenome
Escrever testes usando a SoundexFunc para validar o
uso da função
Pergunta:
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?
SQLSQL AvanAvanççadoado DisparadoresDisparadores (TRIGGERS)(TRIGGERS) Uso: Mais usado para manter integridade
SQLSQL AvanAvanççadoado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
Uso:
Mais usado para manter integridade
Automatização de operações complexas em
cascata
Customizar verificações e mensagens
Permite trabalhar com estado atual e anterior
de um dado
SQLSQL AvanAvanççadoado DisparadoresDisparadores (TRIGGERS)(TRIGGERS) Uso: Customizar verificações e mensagens
SQLSQL AvanAvanççadoado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
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ção
Junção de várias tabelas para consolidação de
dados
Modelo continua íntegro, mas a visualização pode
ser feita conjunta
Permite trabalhar com estado atual e anterior
de um dado
SQLSQL AvanAvanççadoado DisparadoresDisparadores (TRIGGERS)(TRIGGERS) São um tipo especial de procedimento que
SQLSQL AvanAvanççadoado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
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
SQLSQL AvanAvanççadoado DisparadoresDisparadores (TRIGGERS)(TRIGGERS) Uso: Operações em cascata Alteração e
SQLSQL AvanAvanççadoado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
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.
SQLSQL AvanAvanççadoado DisparadoresDisparadores (TRIGGERS)(TRIGGERS) Considerações: Podem conter ROLLBACK
SQLSQL AvanAvanççadoado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
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 é executado
Restrições e INSTEAD OF são executados antes do evento
Disparadores podem afetar várias linhas de dados
@@ROWCOUNT
SQLSQL AvanAvanççadoado DisparadoresDisparadores (TRIGGERS)(TRIGGERS) Criação (CREATE TRIGGER) CREATE TRIGGER nome
SQLSQL AvanAvanççadoado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
Criação (CREATE TRIGGER)
CREATE TRIGGER nome ON tabela
{FOR | AFTER | INSTEAD OF | }
{INSERT | UPDATE | DELETE}
AS
IF UPDATE(coluna)
Instruções
SQLSQL AvanAvanççadoado DisparadoresDisparadores (TRIGGERS)(TRIGGERS) Alterando uma trigger: Usar o comando ALTER
SQLSQL AvanAvanççadoado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
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 triggers
ALTER TABLE tabela {ENABLE |
DISABLE} TRIGGER {ALL | nome da
trigger [,
]}
SQLSQL AvanAvanççadoado DisparadoresDisparadores (TRIGGERS)(TRIGGERS) Funcionamento INSTEAD OF Pode ser associado a
SQLSQL AvanAvanççadoado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
Funcionamento INSTEAD OF
Pode 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ção
Exemplo das páginas 123—124
SQLSQL AvanAvanççadoado DisparadoresDisparadores (TRIGGERS)(TRIGGERS) Criação (CREATE TRIGGER): FOR e AFTER são
SQLSQL AvanAvanççadoado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
Criação (CREATE TRIGGER):
FOR e AFTER são executados após as ações
INSERT, UPDATE ou DELETE
INSTEAD OF, pelo contrário, cancela a
operação e desvia para execução do código
disparador
do
Conferir em casa as instruções que não
podem estar presentes nas triggers (página
114)
Fazer exemplo das páginas 115—116.
SQLSQL AvanAvanççadoado DisparadoresDisparadores (TRIGGERS)(TRIGGERS) Funcionamento de trigger Acesso aos dados
SQLSQL AvanAvanççadoado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
Funcionamento de trigger
Acesso aos dados temporários e log para tomada de
decisões
Insert: tabela inserted
Delete: 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 caso
Exemplo da página 122.
SQLSQL AvanAvanççadoado DisparadoresDisparadores (TRIGGERS)(TRIGGERS) Disparadores aninhados: Quando um disparador é
SQLSQL AvanAvanççadoado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
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 aninhados
sp_configure habilita / desabilita
aninhamento de triggers
sp_configure (‘nested triggers’, 0)
Aninhamento cíclio não é permitido / executado
Atenção para aninhamento com dados
complexos
SQLSQL AvanAvanççadoado DisparadoresDisparadores (TRIGGERS)(TRIGGERS) Ativando recursividade Recursividade é
SQLSQL AvanAvanççadoado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
Ativando recursividade
Recursividade é 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)
SQLSQL AvanAvanççadoado ÍÍndicesndices Uso Melhorar o desempenho de consultas, agilizando (indexando) o acesso a
SQLSQL AvanAvanççadoado
ÍÍndicesndices
Uso
Melhorar o desempenho de consultas,
agilizando (indexando) o acesso a dados
Criação de índices
CREATE INDEX
Remoção de índices
DROP INDEX
SQLSQL AvanAvanççadoado ÍÍndicesndices Índices agrupamento: CLUSTERED Exemplo da página 139, mostra índices
SQLSQL AvanAvanççadoado
ÍÍndicesndices
Índices agrupamento:
CLUSTERED
Exemplo da página 139, mostra índices
duplicados
Sem agrupamento:
NONCLUSTERED
SQLSQL AvanAvanççadoado DisparadoresDisparadores (TRIGGERS)(TRIGGERS) Exercícios: Páginas 131—132 Criar uma
SQLSQL AvanAvanççadoado
DisparadoresDisparadores (TRIGGERS)(TRIGGERS)
Exercícios:
Páginas 131—132
Criar 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 soundex
Procurar na tabela PessoaSoundex os registro com códigos
equivalentes, mas retornar os dados equivalentes na tabela Pessoa
SQLSQL AvanAvanççadoado ÍÍndicesndices Índices automáticos: PRIMARY KEY e UNIQUE Armazenados na tabela
SQLSQL AvanAvanççadoado
ÍÍndicesndices
Índices automáticos:
PRIMARY KEY e UNIQUE
Armazenados na tabela sysindexes
Um í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 recriados
Sintaxe e exemplo na página 135
SQLSQL AvanAvanççadoado ÍÍndicesndices Índices compostos: União mais de um campo Por exemplo, não permitir
SQLSQL AvanAvanççadoado
ÍÍndicesndices
Índices compostos:
União mais de um campo
Por exemplo, não permitir duplicidade de registros com
valores de outras tabelas associadas
Digamos 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)