Visão geral do
SQL Server
Visão geral
 O que é o SQL Server?
 Integração do SQL Server
 Bases de dados do SQL Server
 Segurança do SQL Server
 Trabalhando com o SQL Server
 O que é o SQL Server?
 Introdução ao SQL Server
 Componentes cliente-servidor
 Processo de comunicação cliente-servidor
 Serviços do SQL Server
Introdução ao SQL Server
Sistema de gestão de bases
de dados relacionais
SQL Server
Cliente
Resultados
Aplicação cliente
OLAP
OLTP
Consulta
Componentes cliente-servidor
Aplicação cliente
Net-Library do cliente
Cliente
SQL Server
Servidor
Base de
dados local
API de bases de dados
(OLE DB, ODBC,
DB-Library)
Processador
Memória
Mecanismo
relacional
Mecanismo de
armazenamento
Open Data Services
Net-Libraries
do servidor
Aplicação cliente
Net-Library
do cliente
Cliente
Base de
dados local
API de base
de dados
(OLE DB, ODBC,
DB-Library)
Memória
Processo de comunicação cliente-servidor
Conjunto de
resultados
1
2
Consulta
SQL Server
Mecanismo
relacional
Mecanismo de
armazenamento
Servidor
ODS
Net-Libraries
do servidor
Consulta Conjunto de
resultados
3
4
5
Processador
Serviços do SQL Server
Microsoft Distributed
Transaction
Coordinator
Serviço
MSSQLServer
Serviço
SQLServerAgent
Microsoft Search
Servidor
 Gestão de dados
 Processamento de
transacções e pesquisas
 Integridade dos dados
 Trabalhos
 Alertas
 Operadores
 Catálogos de texto
 Índices de texto
 Gestão de
transacções distribuídas
 Integração do SQL Server
 Integrando o SQL Server com sistemas operativos
 Integrando o SQL Server com o Windows 2000
 Integrando o SQL Server com outras aplicações de
servidor da Microsoft
Integrando o SQL Server com sistemas operativos
Navegadores
Windows 2000 Windows 98
Cliente
Servidor
Windows 2000 Windows NT
Windows Me,
98 e 95
Outro
fabricante
Windows NT
Internet
Internet
Windows Me Windows CE
Integrando o SQL Server com o Windows 2000
 Active Directory
 Segurança
 Suporte a vários processadores
 Microsoft Event Viewer
 Component Services do Windows 2000
 System Monitor do Windows 2000
 Microsoft Internet Information Services
 Windows Clustering
Integrando o SQL Server com outras aplicações
de servidor da Microsoft
Host IBM
Microsoft Windows 2000 Server
com soluções de aumento de
desempenho (SA) para o
Internet Storefront
Microsoft Host
Integration Server 2000
Dados e
aplicações
Microsoft Systems
Management Server
Microsoft
Exchange
Server
SQL Server
Internet
Internet
 Bases de dados do SQL Server
 Tipos de bases de dados
 Objectos de bases de dados
 Fazendo referência aos objectos do SQL Server
 Tabelas do sistema
 Recuperação de metadados
Tipos de bases de dados
Bases de dados de sistema
Bases de dados de utilizador
master
master
model
model tempdb
tempdb msdb
msdb
pubs
pubs Northwind
Northwind User1
User1
distribution
distribution
10191
10192
10202
Labrie
Labrie
Martin
Angela
Eva
Jose
x19891
x19433
x21467
SP
FR
FR
EmpNum LastName FirstName Extension
CtryCode LastMod
HRKarlD
HRKarlD
HRAmyL
Índice agrupado
Anderson
Anderson
Barr
...
Objectos de base de dados
integer longstring varchar(20) char(6)
char(2) longstring
Trigger
EmployeePhoneView
SELECT lastname, firstname, extension
FROM employee
Procedimento
armazenado
UpdatePhone
PK FK
Check
x#####
Fazendo referência aos objectos do SQL Server
 Nomes totalmente qualificados
servidor.base_de_dados.proprietário.objeto
 Nomes especificados parcialmente
 O servidor padrão é a ocorrência actual no servidor local
 A base de dados padrão é a base de dados actual
 O proprietário padrão é o nome do utilizador contido na
base de dados
CREATE TABLE Northwind.dbo.OrderHistory
.
.
.
Tabelas do sistema
 As tabelas do sistema armazenam informações
(metadados) sobre o sistema e objectos de
base de dados
 O catálogo da base de dados armazena metadados
sobre uma base de dados específica
 O catálogo do sistema armazena metadados sobre o
sistema inteiro e todos as outras bases de dados
Recuperação de metadados
 Procedimentos armazenados do sistema
 Funções do sistema e dos metadados
 Views do esquema de informações
EXEC sp_help Employees
SELECT USER_NAME(10)
SELECT * FROM INFORMATION_SCHEMA.TABLES
 Segurança do SQL Server
 Autenticação de login
 Contas de utilizador e cargos do base de dados
 Tipos de cargos
 Validação de permissões
Autenticação de login
AUTENTICAÇÃO
O SQL Server
verifica a conexão
confiável
O SQL Server
verifica o nome
e a senha
OU
SQL
Server
Utilizador ou grupo
do Windows 2000 Windows 2000
Conta de login do
SQL Server
Contas de utilizador e cargos da base de dados
O SQL Server atribui
logins a contas de
utilizadores e cargos
Utilizador da
base de dados
Cargo de
base de dados
Utilizador ou grupo
do Windows 2000
Conta de login
do SQL Server
O SQL Server
verifica a
conexão confiável
O SQL Server
verifica o nome
e a senha
SQL
Server
Windows
2000
OU
Tipos de cargos
 Cargos fixos de servidor
 Grupos de privilégios administrativos no nível
do servidor
 Cargos fixos de base de dados
 Grupos de privilégios administrativos no nível da
base de dados
 Cargos de base de dados definidos pelo utilizador
 Representam o trabalho executado por um grupo
de funcionários de sua organização
O SQL Server
verifica as
permissões
Validação de permissões
Permissões OK;
o comando é
executado
Permissões não OK;
retorno de Erro
2 3
SELECT * FROM Members
O utilizador da base
de dados executa
o comando
1
 Trabalhando com o SQL Server
 Administrando uma base de dados do SQL Server
 Implementando uma base de dados do SQL Server
 Seleccionando uma arquitectura de aplicação para
o SQL Server
 Criando aplicações com APIs de base de dados
Administrando uma base de dados do SQL Server
 Tarefas administrativas comuns
 SQL Server Enterprise Manager
 Assistentes e ferramentas de administração
do SQL Server
 Ferramentas de gestão do prompt de
comando do SQL Server
 Help e Books Online do SQL Server
Implementando uma base de dados do SQL Server
 Criando a base de dados
 Criando a base de dados e seus objectos
 Testando e ajustando a aplicação e a base de dados
 Planeando a implementação
Internet
N camadas
Cliente
Inteligente
(2 camadas)
Servidor
Inteligente
(2 camadas)
Seleccionando uma arquitectura de aplicação para o
SQL Server
Apresentação
Negócios
Dados
Cliente do
navegador
Apresentação
Negócios
Dados
Apresentação
Negócios
Dados
Negócios
Dados
Apresentação
Criando aplicações com APIs de base de dados
Interfaces
de objectos
de dados
Application
Programming
Interfaces
ADO
OLE DB
Outras fontes
de dados
Bases de
dados
relacionais
Laboratório A: Visão geral do SQL Server
Revisão
 O que é o SQL Server?
 Integração do SQL Server
 Bases de dados do SQL Server
 Segurança do SQL Server
 Trabalhando com o SQL Server
Visão geral da
programação do
SQL Server
Visão geral
 Criando a arquitectura de aplicações empresariais
 Ferramentas de programação do SQL Server
 Linguagem de programação Transact-SQL
 Elementos do Transact-SQL
 Outros elementos de linguagem
 Maneiras de executar as instruções Transact-SQL
 Criando a arquitetura de aplicativos empresariais
 Identificando camadas lógicas
 Criando camadas físicas
 Acedendo a dados
Identificando camadas lógicas
Camada de
apresentação
de dados
Aplicações
personalizadas
do Windows
Navegadores da
Web
Camada lógica
de aplicação
Componentes
personalizados
Aplicações e serviços
integrados
Regras comerciais
Regras de dados
Camada de
serviços
de dados
Lógica de acesso
a dados
Armazenamento
de dados
Criando camadas físicas
Serviços de dados
Apresentação de dados
Serviços de dados
Lógica de aplicação
Apresentação de dados
IIS Componentes
Modelo de duas camadas
Modelo de várias camadas
Lógica de aplicativo
Acedendo a dados
Aplicações e componentes Navegador
IIS
ActiveX Data Objects
Consumidores
de dados
Fornecedor
de dados
Access Excel
Cliente
personalizado
Fornecedores de dados OLE DB (serviços)
Cursores
Processadores
de consulta
Serviços
comerciais
Fornecedores de dados OLE DB (dados)
ODBC Exchange
Active
Directory
Jet
SQL Server Excel
Outros fornecedores
OLE DB
Ferramentas de programação do SQL Server
 SQL Query Analyzer
 Efectua a sintaxe de codificação por cores
automaticamente
 Várias janelas de consulta
 Visualizações personalizáveis de conjuntos de
resultados
 Planos gráficos de execução
 Executa partes de scripts
 Utilitário osql
 Utilitário de linha de comando
Linguagem de programação Transact-SQL
 Implementação do padrão ISO ANSI-SQL no SQL Server
 Pode ser executada em qualquer produto compatível
com nível de entrada
 Contém funcionalidade exclusiva adicional
 Elementos do Transact-SQL
 Instruções de Data Control Language
 Instruções de Data Definition Language
 Instruções de Data Manipulation Language
 Nomes de objectos do SQL Server
 Orientações de nomeação
Instruções de Data Control Language
 Definem ou alteram permissões
 GRANT
 DENY
 REVOKE
 Por omissão, somente os participantes do cargo
sysadmin, dbcreator, db_owner ou db_securityadmin
podem executar
Instruções de Data Definition Language
 Definem os objectos da base de dados
 CREATE tipo_de_objeto nome_do_objeto
 ALTER tipo_de_objeto nome_do_objeto
 DROP tipo_de_objeto nome_do_objeto
Instruções de Data Manipulation Language
 Operam com os dados contidos na base de dados
 SELECT
 INSERT
 UPDATE
 DELETE
Nomes de objectos do SQL Server
 Identificadores padrão
 O primeiro carácter deve ser um carácter alfabético
 Outros caracteres podem incluir letras, números ou
símbolos
 Os nomes de identificadores que começam com um
símbolo têm utilizações especiais
 Identificadores delimitados
 Use quando os nomes contiverem espaços
incorporados
 Use quando palavras reservadas forem partes de
nomes
 Delimite-os por parêntesis rectos ([ ]) ou
aspas duplas (" ")
Orientações de nomeação
 Quando possível, usar nomes significativos
 Manter nomes curtos
 Usar convenções de nomeação simples e claras
 Escolher um identificador que diferencie tipos de
objecto
 Views
 Procedimentos armazenados
 Manter a exclusividade dos nomes de objectos e
utilizadores
 Outros elementos de linguagem
 Variáveis locais
 Operadores
 Funções
 Exemplos de funções
 Elementos de linguagem de controle de fluxo
 Comentários
Variáveis locais
 Definidas pelo utilizador com a instrução DECLARE
 Recebem valores através de uma instrução SET ou
SELECT
USE Northwind
DECLARE @vLastName char(20),
@vFirstName varchar(11)
SET @vLastName = 'Dodsworth'
SELECT @vFirstName = FirstName
FROM Northwind..Employees
WHERE LastName = @vLastName
PRINT @vFirstName + ' ' + @vLastName
GO
Operadores
 Tipos de operadores
 Aritmético
 Comparação
 Concatenação de sequências de caracteres
 Lógico
 Níveis de precedência dos operadores
Funções
 Funções agregadas
 Funções escalares
 Funções de conjunto de registros
SELECT *
FROM OPENQUERY
(OracleSvr, 'SELECT ENAME, EMPNO FROM SCOTT.EMP')
SELECT AVG (UnitPrice) FROM Products
SELECT DB_NAME() AS 'database'
Exemplos de funções
SELECT 'ANSI:' AS Region,
CONVERT(varchar(30), GETDATE(), 102) AS Style
UNION
SELECT 'European:', CONVERT(varchar(30), GETDATE(), 113)
UNION
SELECT 'Japanese:', CONVERT(varchar(30), GETDATE(), 111)
Resultado
ANSI:
European:
Japanese:
Style
1
1
2000.03.22
22 Mar 2000 14:20:00:010
2000/03/22
Region
Elementos de linguagem de controle de fluxo
 Nível de instrução
 Blocos BEGIN…END
 Blocos IF…ELSE
 Construções com WHILE
 Nível de registro
 Expressão CASE
IF USER_NAME() <> 'dbo'
BEGIN
RAISERROR('Must be sysadmin
to Perform Operation',
10, 1)
RETURN
END
ELSE
DBCC CHECKDB(Northwind)
Comentários
 Comentários em linha
 Comentários em bloco
SELECT ProductName
,(UnitsInStock + UnitsOnOrder) AS Max -- Calcula o inventário
, SupplierID
FROM Products
/*
** Este código recupera todos os registros da tabela products
** e exibe o preço unitário, o preço unitário com aumento
** de 10% e o nome do produto.
*/
SELECT UnitPrice, (UnitPrice * 1.1), ProductName
FROM Products
 Maneiras de executar as instruções Transact-SQL
 Construindo instruções de forma dinâmica
 Usando lotes (batches)
 Usando scripts
 Usando transacções
 Usando a Extensible Markup Language
Construindo instruções de forma dinâmica
 Use EXECUTE com literais e variáveis de sequências de
caracteres
 Use quando for necessário atribuir o valor da variável
em tempo de execução
 As variáveis e tabelas temporárias permanecerão
somente durante a execução
DECLARE @dbname varchar(30), @tablename varchar(30)
SET @dbname = 'Northwind'
SET @tablename = 'Products'
EXECUTE
('USE' + @dbname + 'SELECT * FROM' + @tablename)
Usando lotes
 Uma ou mais instruções Transact-SQL
submetidas em conjunto
 Definir um lote com a instrução GO
 Como o SQL Server processa lotes
 Instruções que você não pode combinar em um lote
 CREATE PROCEDURE
 CREATE VIEW
 CREATE TRIGGER
 CREATE RULE
 CREATE DEFAULT
Usando scripts
 Contêm instruções gravadas
 Podem ser escritos em qualquer editor de texto
 Grave usando a extensão de nome de arquivo .sql
 São executados no SQL Query Analyzer ou no
utilitário osql
 Use para a recriação de objectos de bases de dados
ou para executar instruções várias vezes
Usando transações
 Processadas como um lote
 Integridade de dados garantida
 Alterações na base de dados são aplicadas juntas ou
desfeitas
BEGIN TRANSACTION
UPDATE savings SET balance = (amount - 100)
WHERE custid = 78910
… <Rollback transaction if error>
UPDATE checking SET balance = (amount + 100)
WHERE custid = 78910
… <Rollback transaction if error>
COMMIT TRANSACTION
Usando a Extensible Markup Language
 Permitindo que um navegador cliente formate dados
 Especificando a opção FOR XML AUTO
 Especificando a opção FOR XML RAW
 Identificando limitações na utilização da cláusula
FOR XML
Práticas recomendadas
Use a sintaxe do ANSI SQL
Use a sintaxe do ANSI SQL
Mantenha a lógica comercial no servidor como procedimentos
armazenados
Mantenha a lógica comercial no servidor como procedimentos
armazenados
Salve as instruções como scripts e faça um comentário
completo delas
Salve as instruções como scripts e faça um comentário
completo delas
Formate as instruções Transact-SQL de modo que os
outros utilizadores as consigam ler
Formate as instruções Transact-SQL de modo que os
outros utilizadores as consigam ler
Escolha uma convenção de nomeação adequada
Escolha uma convenção de nomeação adequada
Laboratório A: Visão geral do Transact-SQL
Revisão
 Criando a arquitectura de aplicações empresariais
 Ferramentas de programação do SQL Server
 Linguagem de programação Transact-SQL
 Elementos do Transact-SQL
 Outros elementos de linguagem
 Maneiras de executar as instruções Transact-SQL
Introdução ao
Transact-SQL
Visão geral
 Linguagem de programação Transact-SQL
 Tipos de instruções Transact-SQL
 Elementos de sintaxe do Transact-SQL
Linguagem de programação Transact-SQL
 Implementa o padrão SQL-92 em nível de acesso
publicado pelo ANSI e pela ISO
 Pode ser executada em qualquer produto compatível
com nível de acesso
 Contém funcionalidade exclusiva adicional
 Tipos de instruções Transact-SQL
 Instruções de DDL
 Instruções de DCL
 Instruções de DML
Instruções de DDL
 Definem os objectos da base de dados
 CREATE nome_do_objeto
 ALTER nome_do_objeto
 DROP nome_do_objeto
 Devem ter as permissões apropriadas
USE northwind
CREATE TABLE customer
(cust_id int, company varchar(40),
contact varchar(30), phone char(12) )
GO
Instruções de DCL
 Definem ou alteram permissões
 GRANT
 DENY
 REVOKE
 Devem ter as permissões apropriadas
USE northwind
GRANT SELECT ON products TO public
GO
Instruções de DML
 Alteram dados ou recuperam informações
 SELECT
 INSERT
 UPDATE
 DELETE
 Devem ter as permissões apropriadas
USE northwind
SELECT categoryid, productname, productid, unitprice
FROM products
GO
 Elementos de sintaxe do Transact-SQL
 Directivas em lotes
 Comentários
 Identificadores
 Tipos de dados
 Variáveis
 Funções do sistema
 Operadores
 Expressões
 Elementos de linguagem
de controle de fluxo
 Palavras-chave
reservadas
Directivas em lotes
 GO
 Define os lotes de instruções Transact-SQL para
ferramentas e utilitários
 Não é uma instrução Transact-SQL real
 EXEC
 Executa uma função definida pelo utilizador,
um procedimento do sistema, um procedimento
armazenado definido pelo utilizador ou um procedimento
armazenado estendido
 Controla a execução de uma sequência de caracteres
num lote do Transact-SQL
Comentários
 Comentários em linha
 Comentários em bloco
USE northwind
SELECT productname
, (unitsinstock - unitsonorder) -- Calcula o inventário
, supplierid
FROM products
GO
/*
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
Exemplo 3
Exemplo 1
 Identificadores
 Identificadores padrão
 O primeiro carácter deve ser um carácter alfabético
 Outros caracteres podem incluir letras, numerais
ou símbolos
 Os nomes de identificadores que começam com um
símbolo têm utilizações especiais
 Identificadores delimitados
 Use quando os nomes contiverem espaços incorporados
 Use quando palavras reservadas forem partes
de nomes
 Delimite-os por parêntesis rectos ([ ]) ou aspas duplas (" ")
Directrizes de nomeação de identificadores
 Mantenha os nomes curtos
 Quando possível, empregue nomes significativos
 Use convenções de nomeação simples e fáceis
 Use um identificador que diferencie tipos de objecto
 Views
 Procedimentos armazenados
 Mantenha a exclusividade dos nomes de objectos
e utilizadores
 Tabela Sales e cargo sales
Tipos de dados
 Numbers
 Dates
 Characters
 Binary
 Unique Identifiers
 SQL Variants
 Image e Text
 Tables
 Cursors
 Tipos de dados definidos
pelo utilizador
Variáveis
 Definidas pelo utilizador com a instrução DECLARE
precedida de um símbolo @
 Recebem valores através de uma instrução SET
ou SELECT precedida de um símbolo @
 Têm âmbito local
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
 Funções do sistema
 Funções agregadas
 Funções escalares
 Funções de definição de registros
SELECT *
FROM OPENQUERY
(OracleSvr, 'SELECT name, id FROM owner.titles')
USE northwind
SELECT AVG (unitprice) AS AvgPrice
FROM products
GO
USE northwind
SELECT DB_NAME() AS 'database‘
GO
Exemplos de funções do sistema
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
Resultado
Style
ANSI:
Japanese:
European:
1998.11.20
11/20/98
20 Nov 1998 16:44:12:857
Exemplo 1
Operadores
 Tipos de operadores
 Aritmético
 Comparação
 Concatenação de sequências de caracteres
 Lógico
 Níveis de precedência dos operadores
Expressões
 Combinação de símbolos e operadores
 Avaliação como um único valor escalar
 Resultado de tipo de dados dependentes dos
elementos na expressão
USE northwind
SELECT OrderID, ProductID
,(UnitPrice * Quantity) as ExtendedAmount
FROM [Order Details]
WHERE (UnitPrice * Quantity) > 10000
GO
Elementos de linguagem de controle de fluxo
 Nível de instrução
 Blocos BEGIN … END
 Blocos IF … ELSE
 Construções com WHILE
 Nível de registro
 Expressão CASE
DECLARE @n tinyint
SET @n = 5
IF (@n BETWEEN 4 and 6)
BEGIN
WHILE (@n > 0)
BEGIN
SELECT @n AS 'Number'
,CASE
WHEN (@n % 2) = 1
THEN 'EVEN'
ELSE 'ODD'
END AS 'Type'
SET @n = @n - 1
END
END
ELSE
PRINT 'SEM ANÁLISE'
GO
Exemplo 2
Palavras-chave reservadas
 Nomes de identificadores que têm significado especial
 Palavras-chave do Transact-SQL
 Palavras-chave do ANSI SQL-92
 Palavras-chave reservadas do ODBC
 Não use palavras-chave reservadas para nomes
de identificadores
Laboratório A: Usando o Books Online do
SQL Server
Revisão
 Linguagem de programação Transact-SQL
 Tipos de instruções Transact-SQL
 Elementos de sintaxe do Transact-SQL
Introdução ao
Transact-SQL
Visão geral
 Linguagem de programação Transact-SQL
 Tipos de instruções Transact-SQL
 Elementos de sintaxe do Transact-SQL
Linguagem de programação Transact-SQL
 Implementa o padrão SQL-92 em nível de acesso
publicado pelo ANSI e pela ISO
 Pode ser executada em qualquer produto compatível
com nível de acesso
 Contém funcionalidade exclusiva adicional
 Tipos de instruções Transact-SQL
 Instruções de DDL
 Instruções de DCL
 Instruções de DML
Instruções de DDL
 Definem os objectos da base de dados
 CREATE nome_do_objeto
 ALTER nome_do_objeto
 DROP nome_do_objeto
 Devem ter as permissões apropriadas
USE northwind
CREATE TABLE customer
(cust_id int, company varchar(40),
contact varchar(30), phone char(12) )
GO
Instruções de DCL
 Definem ou alteram permissões
 GRANT
 DENY
 REVOKE
 Devem ter as permissões apropriadas
USE northwind
GRANT SELECT ON products TO public
GO
Instruções de DML
 Alteram dados ou recuperam informações
 SELECT
 INSERT
 UPDATE
 DELETE
 Devem ter as permissões apropriadas
USE northwind
SELECT categoryid, productname, productid, unitprice
FROM products
GO
 Elementos de sintaxe do Transact-SQL
 Directivas em lotes
 Comentários
 Identificadores
 Tipos de dados
 Variáveis
 Funções do sistema
 Operadores
 Expressões
 Elementos de linguagem
de controle de fluxo
 Palavras-chave
reservadas
Directivas em lotes
 GO
 Define os lotes de instruções Transact-SQL para
ferramentas e utilitários
 Não é uma instrução Transact-SQL real
 EXEC
 Executa uma função definida pelo utilizador,
um procedimento do sistema, um procedimento
armazenado definido pelo utilizador ou um procedimento
armazenado estendido
 Controla a execução de uma sequência de caracteres
num lote do Transact-SQL
Comentários
 Comentários em linha
 Comentários em bloco
USE northwind
SELECT productname
, (unitsinstock - unitsonorder) -- Calcula o inventário
, supplierid
FROM products
GO
/*
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
Exemplo 3
Exemplo 1
 Identificadores
 Identificadores padrão
 O primeiro carácter deve ser um carácter alfabético
 Outros caracteres podem incluir letras, numerais
ou símbolos
 Os nomes de identificadores que começam com um
símbolo têm utilizações especiais
 Identificadores delimitados
 Use quando os nomes contiverem espaços incorporados
 Use quando palavras reservadas forem partes
de nomes
 Delimite-os por parêntesis rectos ([ ]) ou aspas duplas (" ")
Directrizes de nomeação de identificadores
 Mantenha os nomes curtos
 Quando possível, empregue nomes significativos
 Use convenções de nomeação simples e fáceis
 Use um identificador que diferencie tipos de objecto
 Views
 Procedimentos armazenados
 Mantenha a exclusividade dos nomes de objectos
e utilizadores
 Tabela Sales e cargo sales
Tipos de dados
 Numbers
 Dates
 Characters
 Binary
 Unique Identifiers
 SQL Variants
 Image e Text
 Tables
 Cursors
 Tipos de dados definidos
pelo utilizador
Variáveis
 Definidas pelo utilizador com a instrução DECLARE
precedida de um símbolo @
 Recebem valores através de uma instrução SET
ou SELECT precedida de um símbolo @
 Têm âmbito local
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
 Funções do sistema
 Funções agregadas
 Funções escalares
 Funções de definição de registros
SELECT *
FROM OPENQUERY
(OracleSvr, 'SELECT name, id FROM owner.titles')
USE northwind
SELECT AVG (unitprice) AS AvgPrice
FROM products
GO
USE northwind
SELECT DB_NAME() AS 'database‘
GO
Exemplos de funções do sistema
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
Resultado
Style
ANSI:
Japanese:
European:
1998.11.20
11/20/98
20 Nov 1998 16:44:12:857
Exemplo 1
Operadores
 Tipos de operadores
 Aritmético
 Comparação
 Concatenação de sequências de caracteres
 Lógico
 Níveis de precedência dos operadores
Expressões
 Combinação de símbolos e operadores
 Avaliação como um único valor escalar
 Resultado de tipo de dados dependentes dos
elementos na expressão
USE northwind
SELECT OrderID, ProductID
,(UnitPrice * Quantity) as ExtendedAmount
FROM [Order Details]
WHERE (UnitPrice * Quantity) > 10000
GO
Elementos de linguagem de controle de fluxo
 Nível de instrução
 Blocos BEGIN … END
 Blocos IF … ELSE
 Construções com WHILE
 Nível de registro
 Expressão CASE
DECLARE @n tinyint
SET @n = 5
IF (@n BETWEEN 4 and 6)
BEGIN
WHILE (@n > 0)
BEGIN
SELECT @n AS 'Number'
,CASE
WHEN (@n % 2) = 1
THEN 'EVEN'
ELSE 'ODD'
END AS 'Type'
SET @n = @n - 1
END
END
ELSE
PRINT 'SEM ANÁLISE'
GO
Exemplo 2
Palavras-chave reservadas
 Nomes de identificadores que têm significado especial
 Palavras-chave do Transact-SQL
 Palavras-chave do ANSI SQL-92
 Palavras-chave reservadas do ODBC
 Não use palavras-chave reservadas para nomes
de identificadores
Laboratório A: Usando o Books Online do
SQL Server
Revisão
 Linguagem de programação Transact-SQL
 Tipos de instruções Transact-SQL
 Elementos de sintaxe do Transact-SQL
Agregação de dados
Visão geral
 Listando os primeiros n valores com TOP n
 Usando funções agregadas
 Noções básicas sobre a cláusula GROUP BY
 Gerando valores agregados em conjuntos
de resultados
 Usando as cláusulas COMPUTE e COMPUTE BY
Listando os primeiros n valores com TOP n
 Lista apenas os n primeiros registros de um conjunto
de resultados
 Especifica o intervalo de valores na cláusula ORDER BY
 Retorna correspondências se WITH TIES for usada
USE northwind
SELECT TOP 5 orderid, productid, quantity
FROM [order details]
ORDER BY quantity DESC
GO
USE northwind
SELECT TOP 5 WITH TIES orderid, productid, quantity
FROM [order details]
ORDER BY quantity DESC
GO
Exemplo 1
Exemplo 2
 Usando funções agregadas
Funções agregadas Descrição
AVG Média de valores em uma expressão numérica
COUNT Número de valores em uma expressão
COUNT (*) Número de registros selecionados
MAX Maior valor da expressão
MIN Menor valor da expressão
SUM Valores totais em uma expressão numérica
STDEV Desvio padrão de todos os valores
STDEVP Desvio padrão da população
VAR Variância estatística de todos os valores
VARP
Variância estatística de todos os valores da
população
Usando funções agregadas com valores nulos
 A maioria das funções agregadas ignora valores nulos
 A função COUNT (*) conta todos os registos com
valores nulos
USE northwind
SELECT COUNT (*)
FROM employees
GO
USE northwind
SELECT COUNT(reportsto)
FROM employees
GO
Exemplo 1
Exemplo 2
 Noções básicas sobre a cláusula GROUP BY
 Usando a cláusula GROUP BY
 Usando a cláusula GROUP BY com a cláusula HAVING
Usando a cláusula GROUP BY
USE northwind
SELECT productid, orderid
,quantity
FROM orderhist
GO
USE northwind
SELECT productid
,SUM(quantity) AS total_quantity
FROM orderhist
GROUP BY productid
GO
productid orderid quantity
1 1 5
1 1 10
2 1 10
2 2 25
3 1 15
3 2 30
productid total_quantity
1 15
2 35
3 45
productid total_quantity
2 35
Apenas os
registos que
satisfazem às
condições da
cláusula WHERE
serão agrupados
USE northwind
SELECT productid
,SUM(quantity) AS total_quantity
FROM orderhist
WHERE productid = 2
GROUP BY productid
GO
Usando a cláusula GROUP BY com a cláusula
HAVING
USE northwind
SELECT productid, orderid
,quantity
FROM orderhist
GO
USE northwind
SELECT productid, SUM(quantity)
AS total_quantity
FROM orderhist
GROUP BY productid
HAVING SUM(quantity)>=30
GO
productid total_quantity
2 35
3 45
productid orderid quantity
1 1 5
1 1 10
2 1 10
2 2 25
3 1 15
3 2 30
 Gerando valores agregados em conjuntos
de resultados
 Usando a cláusula GROUP BY com o operador ROLLUP
 Usando a cláusula GROUP BY com o operador CUBE
 Usando a função GROUPING
Usando a cláusula GROUP BY com o operador ROLLUP
USE northwind
SELECT productid, orderid, SUM(quantity) AS total_quantity
FROM orderhist
GROUP BY productid, orderid
WITH ROLLUP
ORDER BY productid, orderid
GO
Descrição
productid orderid total_quantity
NULL NULL 95
1 NULL 15
1 1 5
1 2 10
2 NULL 35
2 1 10
2 2 25
3 NULL 45
3 1 15
3 2 30
Total geral
Resume apenas os registros de productid 1
Valores de detalhe de productid 1, orderid 1
Valores de detalhe de productid 1, orderid 2
Resume apenas os registros de productid 2
Valores de detalhe de productid 2, orderid 1
Resume apenas os registros de productid 3
Valores de detalhe de productid 3, orderid 1
Valores de detalhe de productid 3, orderid 2
USE northwind
SELECT productid, orderid, SUM(quantity) AS total_quantity
FROM orderhist
GROUP BY productid, orderid
WITH CUBE
ORDER BY productid, orderid
GO
Usando a cláusula GROUP BY com o operador CUBE
O operador CUBE
produz dois
valores de
resumo a mais
que o operador
ROLLUP
Descrição
productid orderid total_quantity
NULL NULL 95
NULL 1 30
NULL 2 65
1 NULL 15
1 1 5
1 2 10
2 NULL 35
2 1 10
2 2 25
3 NULL 45
3 1 15
3 2 30
Total geral
Resume todos os registros de orderid 1
Resume todos os registros de orderid 2
Resume apenas os registros de productid 1
Valores de detalhe de productid 1, orderid 1
Valores de detalhe de productid 1, orderid 2
Resume apenas os registros de productid 2
Valores de detalhe de productid 2, orderid 1
Valores de detalhe de productid 2, orderid 2
Resume apenas os registros de productid 3
Valores de detalhe de productid 3, orderid 1
Valores de detalhe de productid 3, orderid 2
1 representa os valores de resumo
na coluna anterior
0 representa os valores de detalhe na
na coluna anterior
Usando a função GROUPING
USE northwind
SELECT productid, GROUPING (productid)
,orderid, GROUPING (orderid)
,SUM(quantity) AS total_quantity
FROM orderhist
GROUP BY productid, orderid
WITH CUBE
ORDER BY productid, orderid
GO productid
NULL
NULL
NULL
1
1
1
2
2
2
3
3
3
1
1
1
0
0
0
0
0
0
0
0
0
orderid
NULL
1
2
NULL
1
2
NULL
1
2
NULL
1
2
1
0
0
1
0
0
1
0
0
1
0
0
total_quantity
95
30
65
15
5
10
35
10
25
45
15
30
Usando as cláusulas COMPUTE e COMPUTE BY
COMPUTE BY
COMPUTE
USE northwind
SELECT productid, orderid, quantity
FROM orderhist
ORDER BY productid, orderid
COMPUTE SUM(quantity) BY productid
COMPUTE SUM(quantity)
GO
USE northwind
SELECT productid, orderid
,quantity
FROM orderhist
ORDER BY productid, orderid
COMPUTE SUM(quantity)
GO
productid orderid quantity
1 1 5
1 2 10
2 1 10
2 2 25
3 1 15
3 2 30
sum 95
productid orderid quantity
1 1 5
1 2 10
sum 15
2 1 10
2 2 25
sum 35
3 1 15
3 2 30
sum 45
sum 95
Práticas recomendadas
Use a cláusula COMPUTE ou COMPUTE BY para testar
as suas aplicacões
Use a cláusula COMPUTE ou COMPUTE BY para testar
as suas aplicacões
Indexe colunas frequentemente agregadas
Indexe colunas frequentemente agregadas
Evite usar funções agregadas com colunas que
contêm valores nulos
Evite usar funções agregadas com colunas que
contêm valores nulos
Use a cláusula ORDER BY para garantir a classificação do
conjunto de resultados
Use a cláusula ORDER BY para garantir a classificação do
conjunto de resultados
Use o operador ROLLUP sempre que possível
Use o operador ROLLUP sempre que possível
Práticas recomendadas
Indexe colunas frequentemente agregadas
Indexe colunas frequentemente agregadas
Evite usar funções agregadas com colunas que
contêm valores nulos
Evite usar funções agregadas com colunas que
contêm valores nulos
Use a cláusula ORDER BY para garantir a classificação do
conjunto de resultados
Use a cláusula ORDER BY para garantir a classificação do
conjunto de resultados
Use o operador ROLLUP sempre que possível
Use o operador ROLLUP sempre que possível
Use a cláusula COMPUTE ou COMPUTE BY para testar
as suas aplicacões
Use a cláusula COMPUTE ou COMPUTE BY para testar
as suas aplicacões
Laboratório A: Agregação de dados
Revisão
 Listando os primeiros n valores com TOP n
 Usando funções agregadas
 Noções básicas sobre a cláusula GROUP BY
 Gerando valores agregados em conjuntos
de resultados
 Usando as cláusulas COMPUTE e COMPUTE BY
Associação de tabelas
Visão geral
 Usando aliases para nomes de tabelas
 Combinando dados de várias tabelas
 Combinando vários conjuntos de resultados
Usando aliases para nomes de tabelas
 Exemplo 1 (sem nome de alias)
 Exemplo 2 (com nome de alias)
USE joindb
SELECT buyer_name, s.buyer_id, qty
FROM buyers AS b
INNER JOIN sales AS s
ON b.buyer_id = s.buyer_id
GO
USE joindb
SELECT buyer_name, sales.buyer_id, qty
FROM buyers
INNER JOIN sales
ON buyers.buyer_id = sales.buyer_id
GO
 Combinando dados de várias tabelas
 Introdução às associações
 Usando associações internas
 Usando associações externas
 Usando associações cruzadas
 Associando mais de duas tabelas
 Associando uma tabela a si mesma
Introdução às associações
 Seleccionar colunas específicas a partir de várias tabelas
 A palavra-chave JOIN especifica quais tabelas serão
associadas e como associá-las
 A palavra-chave ON especifica as colunas que as tabelas
têm em comum
 Consultar duas ou mais tabelas para produzir um conjunto
de resultados
 Usar chaves primárias e externas como condições
de associação
 Usar colunas comuns às tabelas especificadas para
associar tabelas
USE joindb
SELECT buyer_name, sales.buyer_id, qty
FROM buyers
INNER JOIN sales
ON buyers.buyer_id = sales.buyer_id
GO
buyer_name
Adam Barr
Sean Chai
Eva Corets
Erin O’Melia
buyer_id
1
2
3
4
Usando associações internas
sales
buyer_id prod_id qty
1
1
4
3
2
3
1
5
15
5
37
11
4 2 1003
buyers
Resultado
buyer_name
Adam Barr
Adam Barr
Erin O’Melia
Eva Corets
buyer_id qty
1
1
4
3
15
5
37
11
Erin O’Melia 4 1003
Exemplo 1
USE joindb
SELECT buyer_name, sales.buyer_id, qty
FROM buyers
LEFT OUTER JOIN sales
ON buyers.buyer_id = sales.buyer_id
GO
buyer_id prod_id qty
1
1
4
3
2
3
1
5
15
5
37
11
4 2 1003
buyer_name
Adam Barr
Sean Chai
Eva Corets
Erin O’Melia
buyer_id
1
2
3
4
Usando associações externas
sales
buyers
Resultado
buyer_name
Adam Barr
Adam Barr
Erin O’Melia
Eva Corets
buyer_id qty
1
1
4
3
15
5
37
11
Erin O’Melia 4 1003
Sean Chai NULL NULL
Exemplo 1
Usando associações cruzadas
Resultado
USE joindb
SELECT buyer_name, qty
FROM buyers
CROSS JOIN sales
GO
buyer_name
Adam Barr
Adam Barr
Adam Barr
Adam Barr
qty
15
5
37
11
Adam Barr 1003
Sean Chai 15
Sean Chai 5
Sean Chai 37
Sean Chai 11
Sean Chai 1003
Eva Corets 15
... ...
sales
buyer_id prod_id qty
1
1
4
3
2
3
1
5
15
5
37
11
4 2 1003
buyers
buyer_id
1
2
3
4
buyer_name
Adam Barr
Sean Chai
Eva Corets
Erin O’Melia
Exemplo 1
USE joindb
SELECT buyer_name, prod_name, qty
FROM buyers
INNER JOIN sales
ON buyers.buyer_id = sales.buyer_id
INNER JOIN produce
ON sales.prod_id = produce.prod_id
GO
produce
buyers sales
Resultado
Associando mais de duas tabelas
prod_id prod_name
1
2
3
4
Apples
Pears
Oranges
Bananas
5 Peaches
buyer_id
1
2
3
4
buyer_name
Adam Barr
Sean Chai
Eva Corets
Erin O’Melia
buyer_id
1
1
3
4
prod_id
2
3
1
5
2 2
qty
15
5
37
11
1003
Exemplo 1
buyer_name
Erin O’Melia
Adam Barr
Erin O’Melia
Adam Barr
Eva Corets
prod_name
Apples
Pears
Pears
Oranges
Peaches
qty
37
15
1003
5
11
USE joindb
SELECT a.buyer_id AS buyer1, a.prod_id
,b.buyer_id AS buyer2
FROM sales AS a
INNER JOIN sales AS b
ON a.prod_id = b.prod_id
WHERE a.buyer_id > b.buyer_id
GO
Associando uma tabela a si mesma
sales b
buyer_id prod_id qty
1
1
4
3
2
3
1
5
15
5
37
11
4 2 1003
sales a
buyer_id prod_id qty
1
1
4
3
2
3
1
5
15
5
37
11
4 2 1003
Resultado
buyer1
4
prod_id buyer2
2 1
Exemplo 3
Combinando vários conjuntos de resultados
 Usar o operador UNION para criar um único conjunto
de resultados de várias consultas
 As consultas precisam de:
 Tipos de dados semelhantes
 Número de colunas idêntico
 Ordem de colunas idêntica na lista de selecções
USE northwind
SELECT (firstname + ' ' + lastname) AS name
,city, postalcode
FROM employees
UNION
SELECT companyname, city, postalcode
FROM customers
GO
Práticas recomendadas
Associe tabelas em chaves primárias e externas
Associe tabelas em chaves primárias e externas
Usar como referência todas as colunas de uma chave primária
composta na cláusula ON quando uma chave composta
relacionar tabelas
Usar como referência todas as colunas de uma chave primária
composta na cláusula ON quando uma chave composta
relacionar tabelas
Limitar o número de tabelas numa associação
Limitar o número de tabelas numa associação
Laboratório A: Consultando em várias tabelas
Revisão
 Usando aliases para nomes de tabelas
 Combinando dados de várias tabelas
 Combinando vários conjuntos de resultados
Subconsultas
Visão geral
 Introdução às subconsultas
 Usando uma subconsulta como uma tabela derivada
 Usando uma subconsulta como uma expressão
 Usando uma subconsulta para correlacionar dados
 Usando as cláusulas EXISTS e NOT EXISTS
Introdução às subconsultas
 Porque usar subconsultas?
 Para dividir uma consulta complexa numa sequência de
etapas lógicas
 Para responder a uma consulta quando ela se baseia
nos resultados de outra consulta
 Porque usar associações em vez de subconsultas?
 O SQL Server executa associações de forma mais
rápida que as subconsultas
 Como usar subconsultas?
Usando uma subconsulta como uma tabela derivada
 É um conjunto de registos dentro da consulta que
funciona como uma tabela
 Toma o lugar de uma tabela na cláusula FROM
 É optimizada com o resto da consulta
USE northwind
SELECT T.orderid, T.customerid
FROM ( SELECT orderid, customerid
FROM orders ) AS T
GO
Usando uma subconsulta como uma expressão
 É avaliada e tratada como uma expressão
 É executada uma vez para toda a instrução
USE pubs
SELECT title, price
,( SELECT AVG(price) FROM titles) AS average
,price-(SELECT AVG(price) FROM titles) AS difference
FROM titles
WHERE type='popular_comp'
GO
 Usando uma subconsulta para
correlacionar dados
 Avaliando uma subconsulta correlacionada
 Imitando uma cláusula JOIN
 Imitando uma cláusula HAVING
Voltar para etapa 1
Avaliando uma subconsulta correlacionada
USE Northwind
SELECT orderid, customerid
FROM orders AS or1
WHERE 20 < (SELECT quantity
FROM [order details] AS od
WHERE or1.orderid = od.orderid
AND od.productid = 23)
GO
A consulta interna usa os
valores passados pela
consulta externa
A consulta interna retorna um
valor à consulta externa
O processo se repete para o
próximo registro da consulta
externa
Exemplo 1
A consulta externa passa um
valor de coluna à consulta
interna
Imitando uma cláusula JOIN
 Subconsultas correlacionadas podem produzir os
mesmos resultados de uma cláusula JOIN
 Associações permitem que o optimizador de consultas
determine como correlacionar os dados de forma
mais eficiente
USE pubs
SELECT DISTINCT t1.type
FROM titles AS t1
WHERE t1.type IN
(SELECT t2.type
FROM titles AS t2
WHERE t1.pub_id <> t2.pub_id)
GO
Exemplo 1
USE pubs
SELECT t1.type, t1.title, t1.price
FROM titles AS t1
INNER JOIN titles AS t2
ON t1.type = t2.type
GROUP BY t1.type, t1.title, t1.price
HAVING t1.price > AVG(t2.price)
GO
Imitando uma cláusula HAVING
 Subconsulta com o mesmo resultado de uma cláusula
HAVING
 Usando uma cláusula HAVING sem uma subconsulta
USE pubs
SELECT t1.type, t1.title, t1.price
FROM titles AS t1
WHERE t1.price > ( SELECT AVG(t2.price)
FROM titles AS t2
WHERE t1.type = t2.type )
GO
Exemplo 1
Exemplo 2
Usando as cláusulas EXISTS e NOT EXISTS
 Usar com subconsultas correlacionadas
 Determinar se há dados numa lista de valores
 Processo do SQL Server
 A consulta externa testa a existência dos registos
 A subconsulta retorna um valor TRUE ou FALSE
 A subconsulta não produz quaisquer dados
USE northwind
SELECT lastname, employeeid
FROM employees AS e
WHERE EXISTS (SELECT * FROM orders AS o
WHERE e.employeeid = o.employeeid
AND o.orderdate = '9/5/1997')
GO
Exemplo 1
Práticas recomendadas
Use subconsultas para dividir uma consulta complexa
Use subconsultas para dividir uma consulta complexa
Use aliases de nomes de tabelas em subconsultas correlacionadas
Use aliases de nomes de tabelas em subconsultas correlacionadas
Use a instrução INSERT…SELECT para adicionar registos de
outras origens à tabela existente
Use a instrução INSERT…SELECT para adicionar registos de
outras origens à tabela existente
Use o operador EXISTS em vez do operador IN
Use o operador EXISTS em vez do operador IN
Laboratório A: Trabalhando com subconsultas
Revisão
 Introdução às subconsultas
 Usando uma subconsulta como uma tabela derivada
 Usando uma subconsulta como uma expressão
 Usando uma subconsulta para correlacionar dados
 Usando as cláusulas EXISTS e NOT EXISTS
Actualização de dados
Visão geral
 Usando transacções
 Inserindo dados
 Excluindo dados
 Actualizando dados
 Considerações sobre o desempenho
Visão geral
 Inserindo dados
 Excluindo dados
 Actualizando dados
 Considerações sobre o desempenho
Usando transações
 Iniciando transacções
 Explícitas
 Autoconfirmar
 Implícitas
 Finalizando transacções
 Instrução COMMIT
 Instrução ROLLBACK
BEGIN TRANSACTION
UPDATE savings
. . .
UPDATE checking
. . .
COMMIT TRANSACTION
 Inserindo dados
 Inserindo um registo de dados por valores
 Usando a instrução INSERT…SELECT
 Criando uma tabela usando a instrução SELECT INTO
 Inserindo dados parciais
 Inserindo dados usando padrões de coluna
Inserindo um registo de dados por valores
 As restrições de destino devem ser obedecidas, caso
contrário, a transacção INSERT falhará
 Use a lista_de_colunas para especificar as colunas que
armazenarão cada valor de entrada
 Especifique os dados que serão inseridos, através da
cláusula VALUES
USE northwind
INSERT customers
(customerid, companyname, contactname, contacttitle
,address, city, region, postalcode, country, phone
,fax)
VALUES ('PECOF', 'Pecos Coffee Company', 'Michael Dunn'
,'Owner', '1900 Oak Street', 'Vancouver', 'BC'
,'V3F 2K1', 'Canada', '(604) 555-3392'
,'(604) 555-7293')
GO
USE northwind
INSERT customers
SELECT substring(firstname, 1, 3)
+ substring (lastname, 1, 2)
,lastname, firstname, title, address, city
,region, postalcode, country, homephone, NULL
FROM employees
GO
Usando a instrução INSERT…SELECT
 Todos os registos que atendem à instrução SELECT
são inseridos
 Deve certificar-se da existência da tabela que recebe os
novos registros no banco de dados
 Deve certificar-se de que as colunas da tabela que
recebe os novos valores tenham tipos de dados
compatíveis
 Deve determinar se existe um valor padrão ou se
é permitido um valor nulo
Criando uma tabela usando a instrução SELECT INTO
 Usar a instrução SELECT INTO para criar uma tabela e
inserir registos nessa tabela numa única operação
 Criar uma tabela temporária local ou global
 Criar aliases de colunas ou especificar os nomes de
colunas da nova tabela na lista de selecções
USE northwind
SELECT productname AS products
,unitprice AS price
,(unitprice * 1.1) AS tax
INTO #pricetable
FROM products
GO
Inserindo dados parciais
USE northwind
INSERT shippers (companyname)
VALUES ('Fitch & Mather')
GO
Adicionando novos dados
USE northwind
SELECT *
FROM shippers
WHERE companyname = 'Fitch & Mather'
GO
Verificando novos dados
shipperid
37
companyname
Fitch & Mather
phone
Null
Permite valores nulos
Exemplo 1
Exemplo 2
Inserindo dados usando padrões de coluna
 Palavra-chave DEFAULT
 Insere valores padrão para colunas especificadas
 As colunas devem ter um valor padrão ou permitir
valores nulos
 Palavra-chave DEFAULT VALUES
 Insere valores padrão para todas as colunas
 As colunas devem ter um valor padrão ou permitir
valores nulos
USE northwind
INSERT shippers (companyname, phone)
VALUES ('Kenya Coffee Co.', DEFAULT)
GO
 Excluindo dados
 Usando a instrução DELETE
 Usando a instrução TRUNCATE TABLE
 Excluindo registos com base noutras tabelas
Usando a instrução DELETE
 A instrução DELETE remove um ou mais registos
numa tabela a menos que se use uma cláusula WHERE
USE northwind
DELETE orders
WHERE DATEDIFF(MONTH, shippeddate, GETDATE()) >= 6
GO
USE northwind
TRUNCATE TABLE orders
GO
Usando a instrução TRUNCATE TABLE
 A instrução TRUNCATE TABLE exclui todos os registos
numa tabela
 O SQL Server mantém a estrutura da tabela e os
objectos associados
Excluindo registos com base noutras tabelas
 Usando uma cláusula FROM adicional
 A primeira cláusula FROM indica a tabela da qual
os registos serão excluídos
 A segunda cláusula FROM pode introduzir uma
associação e actuar como critério de restrição para
a instrução DELETE
USE northwind
DELETE FROM [order details]
FROM orders AS o
INNER JOIN [order details] AS od
ON o.orderid = od.orderid
WHERE orderdate = ‘4/14/1998’
GO
Excluindo registos com base noutras tabelas
 Especificando condições na cláusula WHERE
 As subconsultas determinam os registos a
serem excluídos
USE northwind
DELETE FROM [order details]
WHERE orderid IN (
SELECT orderid
FROM orders
WHERE orderdate = ‘4/14/1998’
)
GO
 Actualizando dados
 Actualizando registos com base nos dados da tabela
 Actualizado registos com base noutras tabelas
USE northwind
UPDATE products
SET unitprice = (unitprice * 1.1)
GO
Actualizando registos com base nos dados da tabela
 Especifique os registros que serão actualizados
com cláusula WHERE
 Especifique os novos valores com a cláusula SET
 Verifique se os valores inseridos têm tipos de dados
compatíveis com os tipos de dados definidos para
as colunas
 O SQL Server não actualiza os registos que violam
qualquer restrição de integridade
Actualizando registos com base noutras tabelas
 Como a instrução UPDATE funciona
 Nunca actualiza o mesmo registo duas vezes
 Requer prefixos de tabela em nomes de coluna
ambíguos
Actualizando registos com base noutras tabelas
 Especificando registos para actualização usando
associações
 Usa a cláusula FROM
USE northwind
UPDATE products
SET unitprice = unitprice + 2
FROM products
INNER JOIN suppliers
ON products.supplierid = suppliers.supplierid
WHERE suppliers.country = ‘USA’
GO
Actualizando registos com base noutras tabelas
 Especificando registos para actualização usando
subconsultas
 Correlaciona a subconsulta com a tabela actualizada
USE northwind
UPDATE products
SET unitprice = unitprice + 2
FROM products
WHERE supplierid IN (
SELECT supplierid
FROM suppliers
WHERE country = ‘USA’
)
GO
Considerações sobre o desempenho
 Todas as modificações de dados ocorrem em uma
transacção
 Pode ocorrer a alocação de página de dados
 A modificação de colunas de dados indexadas causa
sobrecarga
 A colocação de índices em colunas pode auxiliar nos
critérios de pesquisa e melhorar o desempenho
Práticas recomendadas
Escreva sempre uma instrução SELECT que não modifique
os dados antes de os modificar verdadeiramente
Escreva sempre uma instrução SELECT que não modifique
os dados antes de os modificar verdadeiramente
Facilite a leitura dos conjuntos de resultados, alterando os
nomes de coluna ou usando literais
Facilite a leitura dos conjuntos de resultados, alterando os
nomes de coluna ou usando literais
Inclua sempre uma cláusula WHERE com as instruções
DELETE e UPDATE
Inclua sempre uma cláusula WHERE com as instruções
DELETE e UPDATE
Laboratório A: Modificando dados
Revisão
 Usando transações
 Inserindo dados
 Excluindo dados
 Atualizando dados
 Considerações sobre o desempenho
Criação de tipos de
dados e tabelas
Visão geral
 Criando tipos de dados
 Criando tabelas
 Gerando valores de colunas
 Gerando scripts
 Criando tipos de dados
 Tipos de dados fornecidos pelo sistema
 Criando e eliminando tipos de dados definidos pelo
utilizador
 Directrizes para especificar tipos de dados
Tipos de dados fornecidos pelo sistema
 Numérico
 Inteiro
 Numérico exacto
 Numérico aproximado
 Monetário
 Data e hora
 Carácter e carácter Unicode
 Binário
 Outros
Criando e eliminando tipos de dados definidos pelo
utilizador
Eliminando
Criando
EXEC sp_addtype city, 'nvarchar(15)', NULL
EXEC sp_addtype region, 'nvarchar(15)', NULL
EXEC sp_addtype country, 'nvarchar(15)', NULL
EXEC sp_droptype city
Directrizes para especificar tipos de dados
 Se o comprimento da coluna variar, use um dos tipos de
dados variáveis
 Use tinyint de forma apropriada
 Para tipos de dados numéricos, use decimal
 Se o armazenamento for maior que 8000 bytes, use text
ou image
 Use o tipo de dado money para unidade monetária
 Não use os tipos de dados aproximados float e real
como chaves primárias
 Criando tabelas
 Como o SQL Server organiza dados em registos
 Como o SQL Server organiza os tipos de dados text,
ntext e image
 Criando e eliminando uma tabela
 Adicionando e eliminando uma coluna
Como o SQL Server organiza dados em registos
Cabeçalho
Dados de
tamanho fixo
BN BV
Dados de
tamanho variável
Bloco
nulo
Bloco
variável
4 bytes
Dados
Como o SQL Server organiza os tipos de dados text,
ntext e image
Registo de dados
Apontador
de texto
Estrutura raiz
Nó intermediário Nó intermediário
bloco 1 bloco 2 bloco 1 bloco 2
DROP TABLE dbo.Categories
 Criando uma tabela
 Eliminando uma tabela
Criando e eliminando uma tabela
Nome da coluna Tipo de dados
NULL ou
NOT NULL
CREATE TABLE dbo.Categories
(CategoryID
CategoryName
Description
Picture
es nvarchar(15)
int IDENTITY
(1,1)
dbo.Categories nvarchar(15)
ntext
image
NOT NULL,
NOT NULL,
NULL,
NULL)
Adicionando e eliminando uma coluna
ALTER TABLE CategoriesNew
ADD Commission money null
ADICIONA
R
ALTER TABLE CategoriesNew
DROP COLUMN Comission
ELIMINAR
Customer_name Sales_amount Sales_date Customer ID Commission
 Gerando valores de colunas
 Usando a propriedade Identity
 Usando a função NEWID e o tipo de dados
uniqueidentifier
Usando a propriedade Identity
 Requisitos para utilização da propriedade Identity
 Somente uma coluna de identidade é permitida por
tabela
 Use com o tipo de dados integer, numeric ou decimal
 Recuperando informações sobre a propriedade Identity
 Use IDENT_SEED e IDENT_INCR para informações
sobre definição
 Use @@identity para determinar o valor mais recente
 Gerindo a propriedade Identity
Usando a função NEWID e o tipo de dados
uniqueidentifier
 Esses recursos são usados em conjunto
 Use valores globalmente exclusivos
 Use com a restrição DEFAULT
CREATE TABLE Customer
(CustID uniqueidentifier NOT NULL DEFAULT NEWID(),
CustName char(30) NOT NULL)
Gerando scripts
 Gerar esquema como um script Transact-SQL
 Manter um script de backup
 Criar ou actualizar um script de desenvolvimento de
banco de dados
 Criar um ambiente de teste ou desenvolvimento
 Treinar novos funcionários
 O que gerar
 Uma base de dados inteira num único ficheiro de script
 Um esquema somente de tabelas
 Um esquema de tabelas e índices
Práticas recomendadas
Especifique sempre as características das colunas
em CREATE TABLE
Especifique sempre as características das colunas
em CREATE TABLE
Gere um script para recriar a base de dados e os seus objectos
Gere um script para recriar a base de dados e os seus objectos
Especifique tipos de dados apropriados e tamanhos para
os tipos de dados
Especifique tipos de dados apropriados e tamanhos para
os tipos de dados
Laboratório A: Criando tipos de dados e tabelas
Revisão
 Criando tipos de dados
 Criando tabelas
 Gerando valores de colunas
 Gerando scripts
Implementação da
integridade de dados
Visão geral
 Tipos de integridade de dados
 Impondo a integridade de dados
 Definindo restrições
 Tipos de restrições
 Desactivando restrições
 Usando padrões e regras
 Decidindo que método de imposição usar
Tipos de integridade de dados
Integridade de domínio
(colunas)
Integridade de entidade
(registos)
Integridade referencial
(entre tabelas)
Impondo a integridade de dados
 Integridade de dados declarativa
 Critérios estabelecidos em definições de objecto
 O SQL Server impõe automaticamente
 Implemente a integridade declarativa usando restrições,
padrões e regras
 Integridade de dados procedimental
 Critérios definidos em script
 O script impõe
 Implemente a integridade procedimental usando triggers
e procedimentos armazenados
 Definindo restrições
 Determinando o tipo de restrição que será usado
 Criando restrições
 Considerações sobre o uso de restrições
Determinando o tipo de restrição que será usado
Tipo de integridade Tipo de restrição
Domínio
DEFAULT
CHECK
REFERENTIAL
Entidade
PRIMARY KEY
UNIQUE
Referencial
FOREIGN KEY
CHECK
Criando restrições
 Use CREATE TABLE ou ALTER TABLE
 É possível adicionar restrições a uma tabela com dados
existentes
 É possível colocar restrições numa única coluna ou em
várias colunas
 Única coluna, chamada de restrição em nível de coluna
 Várias colunas, chamada de restrição em nível de tabela
Considerações sobre o uso de restrições
 Podem ser alteradas sem recriar uma tabela
 Exigem verificação de erros em aplicações e
transacções
 Verificam dados existentes
 Tipos de restrições
 Restrições DEFAULT
 Restrições CHECK
 Restrições PRIMARY KEY
 Restrições UNIQUE
 Restrições FOREIGN KEY
 Integridade referencial em cascata
Restrições DEFAULT
 Aplicam-se apenas a instruções INSERT
 Apenas uma restrição DEFAULT por coluna
 Não podem ser usadas com a propriedade IDENTITY
ou o tipo de dados rowversion
 Permitem alguns valores fornecidos pelo sistema
USE Northwind
GO
ALTER TABLE dbo.Customers
ADD
CONSTRAINT DF_contactname DEFAULT 'UNKNOWN'
FOR ContactName
GO
Restrições CHECK
 São usadas com as instruções INSERT e UPDATE
 Podem fazer referência a outras colunas na mesma
tabela
 Não podem:
 Ser usadas com o tipo de dados rowversion
 Conter subconsultas
USE Northwind
GO
ALTER TABLE dbo.Employees
ADD
CONSTRAINT CK_birthdate
CHECK (BirthDate > '01-01-1900' AND BirthDate <
getdate())
GO
Restrições PRIMARY KEY
 Apenas uma restrição PRIMARY KEY por tabela
 Os valores devem ser exclusivos
 Não são permitidos valores nulos
 Cria um índice exclusivo nas colunas especificadas
USE Northwind
GO
ALTER TABLE dbo.Customers
ADD
CONSTRAINT PK_Customers
PRIMARY KEY NONCLUSTERED (CustomerID)
GO
Restrições UNIQUE
 Permitem um valor nulo
 Permitem várias restrições UNIQUE numa tabela
 Definidas com uma ou mais colunas
 Impostas com um índice exclusivo
USE Northwind
GO
ALTER TABLE dbo.Suppliers
ADD
CONSTRAINT U_CompanyName
UNIQUE NONCLUSTERED (CompanyName)
GO
Restrições FOREIGN KEY
 Devem fazer referência a uma restrição PRIMARY KEY
ou UNIQUE
 Fornecem uma integridade referencial de uma ou várias
colunas
 Não criam índices automaticamente
 Os utilizadores devem ter as permissões SELECT ou
REFERENCES em tabelas referenciadas
 Usam apenas uma cláusula REFERENCES na mesma
tabela
USE Northwind
GO
ALTER TABLE dbo.Orders
ADD CONSTRAINT FK_Orders_Customers
FOREIGN KEY (CustomerID)
REFERENCES dbo.Customers(CustomerID)
GO
Integridade referencial em cascata
EM CASCATA
SEM ACÇÃO
Customers
INSERT new
CustomerID
CustomerID (PK)
1
Orders
CustomerID (FK)
UPDATE old
CustomerID to new
CustomerID
2
Customers
CustomerID (PK)
UPDATE CustomerID
Orders
CustomerID (FK)
1
EM CASCATA
Customers
DELETE old
CustomerID
CustomerID (PK)
3
 Desactivando restrições
 Desactivando a verificação de restrições nos dados
existentes
 Desactivando a verificação de restrições ao carregar
novos dados
Desactivando a verificação de restrições nos dados
existentes
 Só é possível desactivar as restrições CHECK e
FOREIGN KEY
 Use a opção WITH NOCHECK quando adicionar uma
nova restrição
 Use a opção WITH NOCHECK se dados existentes não
forem alterados
 É possível alterar dados existentes antes de adicionar
restrições
USE Northwind
GO
ALTER TABLE dbo.Employees
WITH NOCHECK
ADD CONSTRAINT FK_Employees_Employees
FOREIGN KEY (ReportsTo)
REFERENCES dbo.Employees(EmployeeID)
GO
Desactivando a verificação de restrições ao carregar
novos dados
 Só é possível desactivar as restrições CHECK e
FOREIGN KEY
 Use quando:
 Os dados obedecem às restrições
 O carregamento de novos dados não obedecem às
restrições
USE Northwind
GO
ALTER TABLE dbo.Employees
NOCHECK
CONSTRAINT FK_Employees_Employees
GO
Usando padrões e regras
 Como os objectos independentes, eles:
 São definidos uma vez
 Podem ser ligados a uma ou mais colunas
ou aos tipos de dados definidos pelo usuário
USE Northwind
GO
CREATE DEFAULT phone_no_default
AS '(000)000-0000'
GO
EXEC sp_bindefault phone_no_default,
'Customers.Phone'
USE Northwind
GO
CREATE RULE regioncode_rule
AS @regioncode IN ('IA', 'IL', 'KS', 'MO')
GO
EXEC sp_bindrule regioncode_rule, 'Customers.Region'
Decidindo que método de imposição usar
Componente
da integridade
de dados
Restrições
Padrões e regras
Triggers
Funcionalidade
Média
Baixa
Alta
Sobrecarga
Baixa
Baixa
Média-alta
Antes ou depois
da modificação
Antes
Antes
Depois
Tipos de dados,
Nulos/Não nulos
Baixa Baixa Antes
Práticas recomendadas
Use a integridade referencial em cascata em vez de triggers
Use a integridade referencial em cascata em vez de triggers
Use restrições, pois estão em conformidade com o padrão ANSI
Use restrições, pois estão em conformidade com o padrão ANSI
Laboratório A: Implementando a integridade de
dados
Revisão
 Tipos de integridade de dados
 Impondo a integridade de dados
 Definindo restrições
 Tipos de restrições
 Desativando restrições
 Usando padrões e regras
 Decidindo que método de imposição usar
Introdução aos objectos
de programação
Visão geral
 Exibindo o texto de um objecto de programação
 Introdução às views
 Vantagens das views
 Criando views
 Introdução aos procedimentos armazenados
 Introdução aos triggers
 Introdução às funções definidas pelo utilizador
Exibindo o texto de um objecto de programação
 EXEC sp_helptext [ @objname = ] ‘nome’
 Nem todo o objecto de programação possui texto
associado
USE library
EXEC sp_helptext 'dbo.OverdueView'
GO
Introdução às views
TitleView
title author
Last of the Mohicans
The Village Watch-Tower
Poems
James Fenimore Cooper
Kate Douglas Wiggin
Wilfred Owen
View do utilizador
USE library
GO
CREATE VIEW dbo.TitleView
AS
SELECT title, author
FROM title
GO
title
title_no title author synopsis
1
2
3
Last of the Mohicans
The Village Watch-Tower
Poems
James Fenimore Cooper
Kate Douglas Wiggin
Wilfred Owen
~~~
~~~
~~~
Vantagens das views
 Enfatizar os dados para os utilizadores
 Enfatizar somente dados importantes ou apropriados
 Limitar o acesso a dados confidenciais
 Mascarar a complexidade da base de dados
 Ocultar a complexidade da estrutura da base de dados
 Simplificar consultas complexas, incluindo consultas
distribuídas a dados heterogéneos
 Simplificar a gestão de permissões dos utilizadores
 Organizar dados a serem exportados para outras
aplicações
 Criando views
 Definindo views
 Restrições sobre a criação de views
 Exemplo: exibindo informações de várias tabelas
Definindo views
USE library
GO
CREATE VIEW dbo.UnpaidFinesView (Member, TotalUnpaidFines)
AS
SELECT member_no, (sum(fine_assessed-fine_paid))
FROM loanhist
GROUP BY member_no
HAVING SUM(fine_assessed-fine_paid) > 0
GO
USE library
SELECT *
FROM UnpaidFinesView
GO
Exemplo 1: Criando uma view
Exemplo 2: Consultando uma view
Restrições sobre a criação de views
 Não podem fazer referência a mais de 1024 colunas
 Não é possível incluir a cláusula COMPUTE ou
COMPUTE BY
 Não podem incluir as cláusulas ORDER BY, a menos
que sejam usadas com a cláusula TOP na instrução
SELECT
 Não podem incluir a palavra-chave INTO
 Não podem fazer referência a tabelas temporárias
 Não podem ser combinadas com outras instruções
Transact-SQL num único lote
lastname
Thomas
Funk
firstname
Gary
Frank
Birth_Date
92.01.16
84.01.18
member_no
12
13
adult_no
11
6
birth_date
1992-01-16 00:00:00.000
1984-01-18 00:00:00.000
Exemplo: exibindo informações de várias tabelas
member juvenile
BirthdayView
USE library
GO
CREATE VIEW dbo.birthdayview
(lastname, firstname, birth_date)
AS
SELECT lastname, firstname
,CONVERT(char(8), birth_date, 2)
FROM member
INNER JOIN juvenile
ON member.member_no = juvenile.member_no
GO
member_no
11
12
13
14
lastname
Thomas
Thomas
Funk
Rudd
firstname
Gary
Clair
Frank
Clair
middleinitial
~~~
~~~
~~~
~~~
photograph
~~~
~~~
~~~
~~~
SP - Stored Procedures
 Definindo procedimentos armazenados
 Vantagens do uso de procedimentos armazenados
 Introdução aos procedimentos armazenados
Definindo procedimentos armazenados
 Um procedimento armazenado é uma colecção definida
de instruções Transact-SQL
 Um procedimento armazenado encapsula tarefas
repetitivas
 Os procedimentos armazenados podem:
 Conter instruções que executam operações
 Aceitar parâmetros de entrada
 Retornar um valor de status para indicar um êxito
ou uma falha
 Retornar vários parâmetros de saída
Vantagens do uso de procedimentos armazenados
 Partilhar a lógica da aplicação
 Proteger detalhes das tabelas da base de dados
 Fornecer mecanismos de segurança
 Melhorar o desempenho
 Reduzir o tráfego de rede
Introdução aos triggers
 Um trigger é um tipo especial de procedimento
armazenado
 Um trigger é:
 Associado a uma tabela
 Chamado automaticamente
 Não é chamado directamente
 Tratado como parte da transacção que o accionou
 Introdução às funções definidas pelo utilizador
UDF - User Defined Functions
 O que é uma função definida pelo utilizador?
 Criando uma função definida pelo utilizador
O que é uma função definida pelo utilizador?
 Funções escalares
 Similares a uma função interna
 Retornam um valor de dados único do tipo definido por uma
série de instruções
 Funções com valores de tabela de várias instruções
 Semelhante a um procedimento armazenado
 Mencionada como se fosse uma view
 Funções com valores de tabela em linha
 Retorna uma tabela que é resultado de uma única instrução
SELECT
 Semelhante a uma view com parâmetros
 Criando uma função definida pelo utilizador
 Restrições quanto ao uso de funções definidas pelo
utilizador
Criando uma função definida pelo utilizador
USE northwind
GO
CREATE FUNCTION fn_NewRegion ( @myinput nvarchar(30) )
RETURNS nvarchar(30)
BEGIN
IF @myinput IS NULL
SET @myinput = 'Not Applicable‘
RETURN @myinput
END
GO
Práticas recomendadas
Verifique as definições de objecto exibindo o texto com o
procedimento armazenado do sistema EXEC sp_helptext
Verifique as definições de objecto exibindo o texto com o
procedimento armazenado do sistema EXEC sp_helptext
Use as views para capturar e reutilizar consultas
Use as views para capturar e reutilizar consultas
Use procedimentos armazenados para encapsular procedimentos
complexos
Use procedimentos armazenados para encapsular procedimentos
complexos
Use funções definidas pelo utilizador para encapsular expressões
Use funções definidas pelo utilizador para encapsular expressões
Laboratório A: Trabalhando com views
Revisão
 Exibindo o texto de um objeto de programação
 Introdução às views
 Vantagens das views
 Criando views
 Introdução a procedimentos armazenados
 Introdução a disparadores
 Introdução a funções definidas pelo usuário
Implementação
de views
Visão geral
 Introdução às views
 Vantagens das views
 Definindo views
 Modificando dados através de views
 Optimizando o desempenho com o uso de views
Introdução às views
EmployeeView
Lastname Firstname
Davolio
Fuller
Leverling
Nancy
Andrew
Janet
Employees
EmployeeID LastName Firstname Title
1
2
3
Davolio
Fuller
Leverling
Nancy
Andrew
Janet
~~~
~~~
~~~
View de utilizador
USE Northwind
GO
CREATE VIEW dbo.EmployeeView
AS
SELECT LastName, Firstname
FROM Employees
Vantagens das views
 Focalizar os dados para os utilizadores
 Focalizar somente em dados importantes ou
apropriados
 Limitar o acesso a dados confidenciais
 Mascarar a complexidade da base de dados
 Ocultar estruturas complexas da base de dados
 Simplificar consultas complexas, incluindo consultas
distribuídas para dados heterogéneos
 Simplificar a gestão de permissões dos utilizadores
 Melhorar o desempenho
 Organizar dados para serem exportados para outras
aplicações
 Definindo views
 Criando views
 Exemplo: View de tabelas associadas
 Alterando e eliminando views
 Localizando informações sobre definições de views
 Ocultando definições de views
Criando views
 Criando uma view
 Restrições às definições de views
 Não pode incluir a instrução ORDER BY
 Não pode incluir a palavra-chave INTO
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
Exemplo: View de tabelas associadas
OrderID
10663
10827
10427
10451
10515
CustomerID
BONAP
BONAP
PICCO
QUICK
QUICK
~~~
~~~
~~~
~~~
~~~
q
RequiredDate
1997-09-24
1998-01-26
1997-02-24
1997-03-05
1997-05-07
pp
ShippedDate
1997-10-03
1998-02-06
1997-03-03
1997-03-12
1997-05-23
Orders Customers
ShipStatusView
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
CustomerID
BONAP
PICCO
QUICK
p y
CompanyName
Bon app'
Piccolo und mehr
QUICK-Stop
ContactName
Laurence Lebihan
Georg Pipps
Horst Kloss
OrderID
10264
10271
10280
1996-08-21
1996-08-29
1996-09-11
pp
ShippedDate
1996-08-23
1996-08-30
1996-09-12
ContactName
Maria Larsson
Art Braunschweiger
Christina Berglund
Alterando e eliminando views
 Alterando views
 Mantém permissões atribuídas
 Faz com que as novas opções e instrução SELECT
substituam a definição existente
 Eliminando views
USE Northwind
GO
ALTER VIEW dbo.EmployeeView
AS
SELECT LastName, FirstName, Extension
FROM Employees
DROP VIEW dbo.ShipStatusView
Localizando informações sobre definições de views
 Localizando definições de views
 Não disponível se a view foi criada com
a opção WITH ENCRYPTION
 Localizando dependências de views
 Lista objectos dos quais a view depende
 Lista objectos que dependem de uma view
Localizando definições de views
 Nomes de views
INFORMATION_SCHEMA.TABLES ou sysobjects
(objectos do sistema)
 Nomes de objetos base
INFORMATION_SCHEMA.VIEW_TABLE_USAGE ou sysdepends
(dependências do sistema)
 Definição de views
INFORMATION_SCHEMA.VIEWS ou syscomments
(comentários do sistema)
 Colunas que estão definidas numa view
INFORMATION_SCHEMA.VIEW_COLUMN_USAGE ou syscolumns
(colunas do sistema)
 sp_helptext nome_do objecto
Localizando dependências de views
 sp_depends nome_do_objecto
Ocultando definições de views
 Usar a opção WITH ENCRYPTION
 Não excluir entradas da tabela syscomments
USE Northwind
GO
CREATE VIEW dbo.[Order Subtotals View]
WITH ENCRYPTION
AS
SELECT OrderID,
Sum(CONVERT(money,(UnitPrice*Quantity*(1-Discount)/100))*100)
AS Subtotal
FROM [Order Details]
GROUP BY OrderID
Modificando dados através de views
 Não podem afectar mais de uma tabela subjacente
 Não podem ser feitas em certas colunas
 Poderão ocasionar erros se afectarem colunas às
quais a view não faz referência
 Serão verificadas se a opção WITH CHECK OPTION
tiver sido especificada na definição da view
 Optimizando o desempenho com o uso de views
 Considerações sobre o desempenho
 Usando views indexadas
Considerações sobre o desempenho
USE Northwind
GO
CREATE VIEW dbo.TopSalesView
AS
SELECT *
FROM dbo.TotalPurchaseView
WHERE Subtotal > 50000
GO
TotalPurchaseView
1 ~ ~ ~ ~
2 ~ ~ ~ ~
3 ~ ~ ~ ~
4 ~ ~ ~ ~
5 ~ ~ ~ ~
6 ~ ~ ~ ~
Customers
Customers
1 ~ ~ ~ n
2 ~ ~ ~ n
3 ~ ~ ~ y
4 ~ ~ ~ y
5 ~ ~ ~ n
6 ~ ~ ~ y
Orders
Orders
1 ~ ~ ~ n
2 ~ ~ ~ n
3 ~ ~ ~ y
4 ~ ~ ~ y
5 ~ ~ ~ n
6 ~ ~ ~ y
Order Details
Order Details
1 ~ ~ ~ ~
2 ~ ~ ~ ~
3 ~ ~ ~ ~
4 ~ ~ ~ ~
5 ~ ~ ~ ~
6 ~ ~ ~ ~
SELECT *
FROM dbo.TopSalesView
WHERE CompanyName = 'Ernst Handel'
TopSalesView
~ ~ ~
~ ~ ~
~ ~ ~
Usando views indexadas
 Views indexadas armazenam conjuntos de resultados
na base de dados
 Criando uma view indexada
 Directrizes para a criação de views indexadas
Crie views indexadas quando:
 A melhoria de desempenho compensa o maior custo
de manutenção
 Os dados subjacentes não são actualizados com
frequência
 As consultas executam uma quantidade significativa de
associações e agregações
 Restrições à criação de views indexadas
Práticas recomendadas
Especifique dbo como o proprietário quando criar views
Especifique dbo como o proprietário quando criar views
Verifique as dependências dos objectos antes de os eliminar
Verifique as dependências dos objectos antes de os eliminar
Avalie cuidadosamente se deve criar views baseadas
em views
Avalie cuidadosamente se deve criar views baseadas
em views
Nunca exclua entradas da tabela do sistema syscomments
Nunca exclua entradas da tabela do sistema syscomments
Deve desenvolver uma convenção de nomeação consistente
Deve desenvolver uma convenção de nomeação consistente
Implementação de
procedimentos
armazenados
 Introdução aos procedimentos armazenados
 Criando, executando e modificando procedimentos
armazenados
 Usando parâmetros em procedimentos armazenados
 Tratando mensagens de erro
 Considerações sobre o desempenho
Visão geral
 Definindo procedimentos armazenados
 Processamento inicial de procedimentos armazenados
 Processamento subsequente de procedimentos
armazenados
 Vantagens dos procedimentos armazenados
 Introdução a procedimentos armazenados
Definindo procedimentos armazenados
 Colecções nomeadas de instruções Transact-SQL
 Encapsulamento de tarefas repetitivas
 Cinco tipos (sistema, local, temporário, remoto e
estendido)
 Aceitam parâmetros de entrada e retornam valores
 Retornam um valor de status para indicar um êxito ou
uma falha
Processamento inicial de procedimentos
armazenados
Entradas nas tabelas
sysobjects e syscomments
Plano compilado colocado
na cache de procedimentos
Compilação
Optimização
Criação
Execução
(primeira vez ou
recompilação)
Análise
Processamento subsequente de procedimentos
armazenados
Plano de consulta Contexto de
execução
Conexão 1
8082
Conexão 2
Conexão 3
24
1003
Plano de execução recuperado
O plano não utilizado é removido
SELECT *
FROM
dbo.member
WHERE
member_no = ?
Vantagens dos procedimentos armazenados
 Partilham a lógica da aplicação
 Protegem os detalhes das tabelas da base de dados
 Fornecem mecanismos de segurança
 Melhoram o desempenho
 Reduzem o tráfego de rede
 Criando, executando e modificando
procedimentos armazenados
 Criando procedimentos armazenados
 Directrizes para a criação de procedimentos
armazenados
 Executando procedimentos armazenados
 Alterando e eliminando procedimentos armazenados
Criando procedimentos armazenados
 Criados na base de dados actual com a instrução
CREATE PROCEDURE

 Podem ser encadeados até 32 níveis
 Use sp_help para exibir informações
USE Northwind
GO
CREATE PROC dbo.OverdueOrders
AS
SELECT *
FROM dbo.Orders
WHERE RequiredDate < GETDATE() AND ShippedDate IS Null
GO
Directrizes para a criação de procedimentos
armazenados
 Utilizador dbo deve ser proprietário de todos os
procedimentos armazenados
 Um procedimento armazenado para uma única tarefa
 Crie, teste e depure
 Evite usar o prefixo sp_ ao atribuir nomes a
procedimentos armazenados
 Todos os procedimentos armazenados devem assumir
as mesmas configurações de conexão
 Minimize o uso de procedimentos armazenados
temporários
 Use sp_executesql em vez de EXECUTE
 Nunca exclua entradas directamente da tabela do
syscomments
Executando procedimentos armazenados
 Executando um procedimento armazenado
isoladamente
 Executando um procedimento armazenado em uma
instrução INSERT
EXEC OverdueOrders
INSERT INTO Customers
EXEC EmployeeCustomer
Alterando e eliminando procedimentos armazenados
 Alterando procedimentos armazenados
 Inclua quaisquer opções em ALTER PROCEDURE
 Não afecta os procedimentos armazenados encadeados

 Eliminando procedimentos armazenados
 Execute o procedimento armazenado sp_depends para
determinar se os objectos dependem do procedimento
USE Northwind
GO
ALTER PROC dbo.OverdueOrders
AS
SELECT CONVERT(char(8), RequiredDate, 1) RequiredDate,
CONVERT(char(8), OrderDate, 1) OrderDate,
OrderID, CustomerID, EmployeeID
FROM Orders
WHERE RequiredDate < GETDATE() AND ShippedDate IS Null
ORDER BY RequiredDate
GO
 Usando parâmetros nos procedimentos
armazenados
 Usando parâmetros de entrada
 Executando procedimentos armazenados com
parâmetros de entrada
 Retornando valores com parâmetros de saída
Usando parâmetros de entrada
 Valide todos os valores de parâmetros de entrada
primeiro
 Forneça valores padrão apropriados e inclua
verificações NULL
CREATE PROCEDURE dbo.[Year to Year Sales]
@BeginningDate DateTime, @EndingDate DateTime
AS
IF @BeginningDate IS NULL OR @EndingDate IS NULL
BEGIN
RAISERROR('NULL values are not allowed', 14, 1)
RETURN
END
SELECT O.ShippedDate,
O.OrderID,
OS.Subtotal,
DATENAME(yy,ShippedDate) AS Year
FROM ORDERS O INNER JOIN [Order Subtotals] OS
ON O.OrderID = OS.OrderID
WHERE O.ShippedDate BETWEEN @BeginningDate AND @EndingDate
GO
Executando procedimentos armazenados com
parâmetros de entrada
 Passando valores por nome de parâmetro
 Passando valores por posição
EXEC AddCustomer 'ALFKI2', 'Alfreds
Futterkiste', 'Maria Anders', 'Sales
Representative', 'Obere Str. 57', 'Berlin',
NULL, '12209', 'Germany', '030-0074321'
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'
Retornando valores com parâmetros de saída
CREATE PROCEDURE dbo.MathTutor
@m1 smallint,
@m2 smallint,
@result smallint OUTPUT
AS
SET @result = @m1* @m2
GO
DECLARE @answer smallint
EXECUTE MathTutor 5,6, @answer OUTPUT
SELECT 'The result is:', @answer
The result is: 30
Resultados do
Resultados do
procedimento
armazenado
Executando o
Executando o
procedimento
armazenado
Criando o
Criando o
procedimento
armazenado
Tratando mensagens de erro
 A instrução RETURN sai da consulta ou do
procedimento de modo não condicional
 sp_addmessage cria mensagens de erro personalizadas
 @@error contém o número do erro da última
instrução executada
 Instrução RAISERROR
 Retorna uma mensagem de erro do sistema ou
definida pelo usuário
 Define um sinalizador do sistema para registrar um erro
Demonstração: Tratando mensagens de erro
Considerações sobre o desempenho
 System Monitor do Windows 2000
 Objecto: SQL Server: Cache Manager
 Objecto: SQL Statistics
 SQL Profiler
 Permite monitorar eventos
 É possível testar cada instrução do procedimento
armazenado
Práticas recomendadas
Crie cada procedimento armazenado para realizar uma
única tarefa
Crie cada procedimento armazenado para realizar uma
única tarefa
Valide os dados antes de iniciar as transacções.
Valide os dados antes de iniciar as transacções.
Verifique os parâmetros de entrada
Verifique os parâmetros de entrada
Use as mesmas configurações de conexão para todos os
procedimentos armazenados
Use as mesmas configurações de conexão para todos os
procedimentos armazenados
Para ocultar o texto de procedimentos armazenados,
use a opção WITH ENCRYPTION
Para ocultar o texto de procedimentos armazenados,
use a opção WITH ENCRYPTION
Implementação de
funções definidas pelo
utilizador
Visão geral
 O que é uma função definida pelo utilizador?
 Estabelecendo funções definidas pelo utilizador
 Exemplos de funções definidas pelo utilizador
O que é uma função definida pelo utilizador?
 Funções escalares
 Semelhantes a funções internas
 Funções com valor de tabela e várias instruções
 Conteúdo semelhante a um procedimento armazenado
 Referenciadas como uma view
 Funções com valor de tabela in-line
 Semelhante a uma view com parâmetros
 Retorna uma tabela como o resultado de uma única
instrução SELECT
 Estabelecendo funções definidas pelo utilizador
 Criando uma função definida pelo utilizador
 Criando uma função com vinculação de esquemas
 Definindo permissões para funções definidas pelo
utilizador
 Alterando e descartando funções definidas pelo
utilizador
 Criando uma função
 Restrições às funções
Criando uma função definida pelo utilizador
USE Northwind
GO
CREATE FUNCTION fn_NewRegion
(@myinput nvarchar(30))
RETURNS nvarchar(30)
BEGIN
IF @myinput IS NULL
SET @myinput = 'Not Applicable'
RETURN @myinput
END
Criando uma função com vinculação de esquemas
 As funções definidas pelo utilizador e views às quais a
função faz referência também são vinculadas a
esquema
 Os objectos não são referenciados com um nome de
duas partes
 A função e os objectos pertencem à mesma base
de dados
 Ter a permissão REFERENCE em objectos necessários
Definindo permissões para funções definidas pelo
utilizador
 Permissão CREATE FUNCTION necessária
 Permissão EXECUTE necessária
 Permissão REFERENCE necessária em tabelas, views
ou funções às quais ela faz referência
 O proprietário da tabela também deve ser proprietário
da função para usá-la na instrução CREATE TABLE ou
ALTER TABLE
Alterando e eliminando funções definidas pelo
utilizador
 Alterando funções
 Mantém permissões atribuídas
 Faz com que a nova definição de função substitua a
definição existente
 Eliminando funções
ALTER FUNCTION dbo.fn_NewRegion
<Novo conteúdo de função>
DROP FUNCTION dbo.fn_NewRegion
 Exemplos de funções definidas pelo utilizador
 Usando uma função escalar definida pelo utilizador
 Exemplo de uma função escalar definida pelo utilizador
 Usando uma função com valor de tabela e várias
instruções
 Exemplo de função com valor de tabela e várias
instruções
 Usando uma função com valor de tabela in-line
 Exemplo de uma função com valor de tabela in-line
Usando uma função escalar definida pelo utilizador
 A cláusula RETURNS especifica o tipo de dados
 A função é definida em um bloco BEGIN...END
 O tipo de retorno poderá ser qualquer tipo de dado,
excepto text, ntext, image, cursor ou timestamp
 Criando a função
 Chamando a função
Exemplo de uma função escalar definida pelo
utilizador
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
SELECT dbo.fn_DateFormat(GETDATE(), ':')
Usando uma função com valor de tabela e várias
instruções
 BEGIN e END delimitam o corpo da função
 A cláusula RETURNS especifica table como o tipo de
dados
 A cláusula RETURNS define o nome e o formato da
tabela
Exemplo de função com valor de tabela e várias
instruções
 Criando a função
 Chamando a função
USE Northwind
GO
CREATE FUNCTION fn_Employees (@length nvarchar(9))
RETURNS @fn_Employees table
(EmployeeID int PRIMARY KEY NOT NULL,
[Employee Name] nvarchar(61) NOT NULL)
AS
BEGIN
IF @length = 'ShortName'
INSERT @fn_Employees SELECT EmployeeID, LastName
FROM Employees
ELSE IF @length = 'LongName'
INSERT @fn_Employees SELECT EmployeeID,
(FirstName + ' ' + LastName) FROM Employees
RETURN
END
SELECT * FROM dbo.fn_Employees('LongName')
Ou
SELECT * FROM dbo.fn_Employees('ShortName')
Usando uma função com valor de tabela in-line
 O conteúdo da função é uma instrução SELECT
 Não use BEGIN e END
 RETURN especifica table como o tipo de dados
 O formato é definido pelo conjunto de resultados
Exemplo de uma função com valor de tabela in-line
 Criando a função
 Chamando a função usando um parâmetro
USE Northwind
GO
CREATE FUNCTION fn_CustomerNamesInRegion
( @RegionParameter nvarchar(30) )
RETURNS table
AS
RETURN (
SELECT CustomerID, CompanyName
FROM Northwind.dbo.Customers
WHERE Region = @RegionParameter
)
SELECT * FROM fn_CustomerNamesInRegion(N'WA')
Práticas recomendadas
Use funções de várias instruções em vez de
procedimentos armazenados que retornam tabelas
Use funções de várias instruções em vez de
procedimentos armazenados que retornam tabelas
Use funções in-line para filtrar views indexadas
Use funções in-line para filtrar views indexadas
Use funções escalares complexas em conjuntos de
resultados pequenos
Use funções escalares complexas em conjuntos de
resultados pequenos
Use funções in-line para criar views usando parâmetros
Use funções in-line para criar views usando parâmetros
Implementação de
triggers
Visão geral
 Introdução aos triggers
 Definindo triggers
 Como funcionam os triggers
 Exemplos de triggers
 Considerações sobre o desempenho
 Introdução aos triggers
 O que são triggers?
 Utilizações de triggers
 Considerações sobre o uso de triggers
O que são triggers?
 Associados a uma tabela
 Chamados automaticamente
 Não podem ser chamados directamente
 São parte de uma transacção
Utilizações de triggers
 Alterações em cascata em tabelas relacionadas duma
base de dados
 Impor uma integridade de dados mais complexa do que
uma restrição CHECK
 Definir mensagens de erro personalizadas
 Manter dados desnormalizados
 Comparar os estados anteriores e posteriores dos
dados que estão a ser modificados
Considerações sobre o uso de triggers
 Os triggers são reactivos; as restrições são
pró-activas
 As restrições são verificadas primeiro
 As tabelas podem conter vários triggers para
uma acção
 Os proprietários das tabelas podem designar o primeiro
e o último trigger a ser accionado
 Os proprietários das tabelas devem ter permissão para
executar todas as instruções definidas pelo trigger
 Os proprietários das tabelas não podem criar triggers
AFTER em views ou tabelas temporárias
 Definindo triggers
 Criando triggers
 Alterando e eliminando triggers
Criando triggers
 Requer permissões apropriadas
 Não pode conter certas instruções
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
Alterando e eliminando triggers
 Alterando um trigger
 Altera a definição sem eliminar o trigger
 Desactivando ou activando um trigger

 Eliminando um trigger
USE Northwind
GO
ALTER TRIGGER Empl_Delete ON Employees
FOR DELETE
AS
IF (SELECT COUNT(*) FROM Deleted) > 6
BEGIN
RAISERROR(
'You cannot delete more than six employees at a time.', 16, 1)
ROLLBACK TRANSACTION
END
 Como funcionam os triggers
 Como funciona um trigger INSERT
 Como funciona um trigger DELETE
 Como funciona um trigger UPDATE
 Como funciona um trigger INSTEAD OF
 Como funcionam os triggers encadeados
 Triggers recursivos
Como funciona um trigger INSERT
Instrução INSERT para uma tabela com um trigger
INSERT definido
INSERT [Order Details] VALUES
(10525, 2, 19.00, 5, 0.2)
Order Details
OrderID
10522
10523
10524
ProductID
10
41
7
UnitPrice
31.00
9.65
30.00
Quantity
7
9
24
Discount
0.2
0.15
0.0
Instrução INSERT registada
inserted
10525 2 19.00 5 0.2
5
19.00
2 0.2
10525
As acções de TRIGGER são executadas
Order Details
OrderID
10522
10523
10524
ProductID
10
41
7
UnitPrice
31.00
9.65
30.00
Quantity
7
9
24
Discount
0.2
0.15
0.0
5
19.00
2 0.2
10523
Trigger Code:
USE Northwind
CREATE TRIGGER OrdDet_Insert
ON [Order Details]
FOR INSERT
AS
UPDATE P SET
UnitsInStock = (P.UnitsInStock – I.Quantity)
FROM Products AS P INNER JOIN Inserted AS I
ON P.ProductID = I.ProductID
Produtos
ProductID UnitsInStock … …
1
2
3
4
15
10
65
20
2 15
UPDATE P SET
UnitsInStock = (P.UnitsInStock – I.Quantity)
FROM Products AS P INNER JOIN Inserted AS I
ON P.ProductID = I.ProductID
Instrução INSERT para uma tabela com um
trigger INSERT definido
Instrução INSERT registada
Acções de trigger executadas
1
2
3
Como funciona um trigger DELETE
Instrução DELETE para uma tabela com um trigger
DELETE definido
Deleted
4 Dairy Products Cheeses 0x15…
Instrução DELETE registada
Categories
CategoryID
1
2
3
CategoryName
Beverages
Condiments
Confections
Description
Soft drinks, coffees…
Sweet and savory …
Desserts, candies, …
Picture
0x15…
0x15…
0x15…
0x15…
Cheeses
Dairy Products
4
DELETE Categories
WHERE
CategoryID = 4
USE Northwind
CREATE TRIGGER Category_Delete
ON Categories
FOR DELETE
AS
UPDATE P SET Discontinued = 1
FROM Products AS P INNER JOIN deleted AS d
ON P.CategoryID = d.CategoryID
Acções do trigger executadas
Products
ProductID Discontinued … …
1
2
3
4
0
0
0
0
2 1
UPDATE P SET Discontinued = 1
FROM Products AS P INNER JOIN deleted AS d
ON P.CategoryID = d.CategoryID
Instrução DELETE para uma tabela
com um trigger DELETE definido
Instrução DELETE registada
Acções do trigger executadas
1
2
3
Como funciona um trigger UPDATE
Instrução UPDATE para uma tabela com um trigger UPDATE
definido
UPDATE Employees
SET EmployeeID = 17
WHERE EmployeeID = 2
Instrução UPDATE registada como INSERT e instruções DELETE
inserted
17 Fuller Andrew Vice Pres. ~~~
deleted
2 Fuller Andrew Vice Pres. ~~~
Employees
EmployeeID LastName FirstName
FirstName Title HireDate
1
2
3
4
Davolio
Barr
Leverling
Peacock et
Nancy
Andrew
Janet
Margaret
.
.
.
Sales Rep.
R
Sales Rep.
Sales Rep.
~~~
~~~
~~~
~~~
2 Fuller Andrew Vice Pres. ~~~
As acções de TRIGGER são executadas
USE Northwind
GO
CREATE TRIGGER Employee_Update
ON Employees
FOR UPDATE
AS
IF UPDATE (EmployeeID)
BEGIN TRANSACTION
RAISERROR ('Transaction cannot be processed.
***** Employee ID number cannot be modified.', 10, 1)
ROLLBACK TRANSACTION
AS
IF UPDATE (EmployeeID)
BEGIN TRANSACTION
RAISERROR ('Transaction cannot be processed.
***** Employee ID number cannot be modified.', 10, 1)
ROLLBACK TRANSACTION
Transaction cannot be processed.
***** Member number cannot be modified
Employees
EmployeeID LastName FirstName
FirstName Title HireDate
1
2
3
4
Davolio
Barr
Leverling
Peacock et
Nancy
Andrew
Janet
Margaret
.
.
.
Sales Rep.
R
Sales Rep.
Sales Rep.
~~~
~~~
~~~
~~~
2 Fuller Andrew Vice Pres. ~~~
Instrução UPDATE para uma tabela com um
trigger UPDATE definido
Instrução UPDATE registada com
instruções INSERT e DELETE
Acções do trigger executadas
1
2
3
Como funciona um trigger INSTEAD OF
Crie uma view que combine duas ou mais tabelas
CREATE VIEW
Customers AS
SELECT *
FROM CustomersMex
UNION
SELECT *
FROM CustomersGer
CustomersMex
CustomerID CompanyName
CompanyName Country Phone …
ANATR
ANTON
CENTC
Ana Trujill…
Antonio M…
Centro Co…
Mexico
Mexico
Mexico
(5) 555-4729
(5) 555-3932
(5) 555-3392
~~~
~~~
~~~
CustomersGer
CustomerID CompanyName
CompanyName Country Phone …
ALFKI
BLAUS
DRACD
Alfreds Fu…
Blauer Se…
Drachenb…
Germany
Germany
Germany
030-0074321
0621-08460
0241-039123
~~~
~~~
~~~
O trigger INSTEAD
OF direcciona a
actualização para
a tabela base
Customers
CustomerID CompanyName
CompanyName Country Phone …
ALFKI
ANATR
ANTON
Alfreds Fu…
Ana Trujill…
Antonio M…
Germany
Mexico
Mexico
030-0074321
(5) 555-4729
(5) 555-3932
~~~
~~~
~~~
A inserção original
na view
Customers não
ocorre
UPDATE é feito
para a view
ALFKI Alfreds Fu… Germany 030-0074321 ~~~
ALFKI Alfreds Fu… Germany 030-0074321 ~~~
O trigger INSTEAD OF pode estar numa tabela
ou view
A acção que inicia o trigger NÃO ocorre
Permite actualizações em views não actualizáveis
anteriormente
1
2
3
Como funcionam os triggers encadeados
UnitsInStock + UnitsOnOrder
é < ReorderLevel para ProductID 2
OrDe_Update
Colocar uma ordem faz com
que o trigger OrDe_Update
seja executado
Executa uma instrução
UPDATE na tabela Products
InStock_Update
Products
ProductID UnitsInStock … …
1
3
4
15
10
65
20
O trigger InStock_Update é
executado
Envia mensagem
Order_Details
OrderID
10522
10523
10524
ProductID
10
41
7
UnitPrice
31.00
9.65
30.00
Quantity
7
9
24
Discount
0.2
0.15
0.0
10525 19.00
2 0.2
5
2 15
Triggers recursivos
 Activando um trigger de modo recursivo
 Tipos de triggers recursivos
 Recursividade directa ocorre quando um trigger acciona
e executa uma acção que faz com que o mesmo trigger
seja accionado novamente
 Recursividade indirecta ocorre quando um trigger
acciona e executa uma acção que faz com que um
trigger noutra tabela seja accionado
 Determinando se triggers recursivos devem ou não ser
usados
 Exemplos de triggers
 Impondo a integridade dos dados
 Impondo regras de negócios
Impondo a integridade dos dados
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
Products
ProductID UnitsInStock … …
1
3
4
15
10
65
20
2 15 Actualizado
BackOrders
ProductID UnitsOnOrder …
1
12
3
15
10
65
2 15
O trigger
O trigger
exclui o registro
Products
ProductID UnitsInStock … …
1
3
4
15
10
65
20
Impondo regras de negócios
Os produtos com pedidos importantes não podem ser excluídos
A instrução DELETE é
executada na tabela Product
O código do trigger
verifica a tabela Order Details
Order Details
OrderID
10522
10523
10524
10525
ProductID
10
2
41
7
UnitPrice
31.00
19.00
9.65
30.00
Quantity
7
9
24
Discount
0.2
0.15
0.0
9
A transacção
é revertida
Products
ProductID UnitsInStock … …
1
2
3
4
15
10
65
20
2 0
IF (Select Count (*)
FROM [Order Details] INNER JOIN deleted
ON [Order Details].ProductID = Deleted.ProductID
) > 0
ROLLBACK TRANSACTION
'Transaction cannot be processed'
'This product has order history.'
Considerações sobre o desempenho
 Os triggers funcionam com rapidez, pois as tabelas
Inserted e Deleted encontram-se na cache
 O tempo de execução é determinado pelo:
 Número de tabelas referenciadas
 Número de registos afectados
 As acções contidas nos triggers consistem numa parte
implícita de uma transacção
Práticas recomendadas
Mantenha as instruções da definição do trigger o mais
simples possível
Mantenha as instruções da definição do trigger o mais
simples possível
Minimize o uso de instruções ROLLBACK nos triggers
Minimize o uso de instruções ROLLBACK nos triggers
Use triggers somente quando necessário
Use triggers somente quando necessário
Inclua instruções de verificação de fim da recursividade nas
definições de triggers recursivos
Inclua instruções de verificação de fim da recursividade nas
definições de triggers recursivos

SGBD é a sigla para Sistema Gerenciador de Banco de Dados, um conjunto de programas que permitem gerir bases de dados. O SGBD é uma ferramenta fundamental para a gestão de dados de empresas e organizações

  • 1.
  • 2.
    Visão geral  Oque é o SQL Server?  Integração do SQL Server  Bases de dados do SQL Server  Segurança do SQL Server  Trabalhando com o SQL Server
  • 3.
     O queé o SQL Server?  Introdução ao SQL Server  Componentes cliente-servidor  Processo de comunicação cliente-servidor  Serviços do SQL Server
  • 4.
    Introdução ao SQLServer Sistema de gestão de bases de dados relacionais SQL Server Cliente Resultados Aplicação cliente OLAP OLTP Consulta
  • 5.
    Componentes cliente-servidor Aplicação cliente Net-Librarydo cliente Cliente SQL Server Servidor Base de dados local API de bases de dados (OLE DB, ODBC, DB-Library) Processador Memória Mecanismo relacional Mecanismo de armazenamento Open Data Services Net-Libraries do servidor
  • 6.
    Aplicação cliente Net-Library do cliente Cliente Basede dados local API de base de dados (OLE DB, ODBC, DB-Library) Memória Processo de comunicação cliente-servidor Conjunto de resultados 1 2 Consulta SQL Server Mecanismo relacional Mecanismo de armazenamento Servidor ODS Net-Libraries do servidor Consulta Conjunto de resultados 3 4 5 Processador
  • 7.
    Serviços do SQLServer Microsoft Distributed Transaction Coordinator Serviço MSSQLServer Serviço SQLServerAgent Microsoft Search Servidor  Gestão de dados  Processamento de transacções e pesquisas  Integridade dos dados  Trabalhos  Alertas  Operadores  Catálogos de texto  Índices de texto  Gestão de transacções distribuídas
  • 8.
     Integração doSQL Server  Integrando o SQL Server com sistemas operativos  Integrando o SQL Server com o Windows 2000  Integrando o SQL Server com outras aplicações de servidor da Microsoft
  • 9.
    Integrando o SQLServer com sistemas operativos Navegadores Windows 2000 Windows 98 Cliente Servidor Windows 2000 Windows NT Windows Me, 98 e 95 Outro fabricante Windows NT Internet Internet Windows Me Windows CE
  • 10.
    Integrando o SQLServer com o Windows 2000  Active Directory  Segurança  Suporte a vários processadores  Microsoft Event Viewer  Component Services do Windows 2000  System Monitor do Windows 2000  Microsoft Internet Information Services  Windows Clustering
  • 11.
    Integrando o SQLServer com outras aplicações de servidor da Microsoft Host IBM Microsoft Windows 2000 Server com soluções de aumento de desempenho (SA) para o Internet Storefront Microsoft Host Integration Server 2000 Dados e aplicações Microsoft Systems Management Server Microsoft Exchange Server SQL Server Internet Internet
  • 12.
     Bases dedados do SQL Server  Tipos de bases de dados  Objectos de bases de dados  Fazendo referência aos objectos do SQL Server  Tabelas do sistema  Recuperação de metadados
  • 13.
    Tipos de basesde dados Bases de dados de sistema Bases de dados de utilizador master master model model tempdb tempdb msdb msdb pubs pubs Northwind Northwind User1 User1 distribution distribution
  • 14.
    10191 10192 10202 Labrie Labrie Martin Angela Eva Jose x19891 x19433 x21467 SP FR FR EmpNum LastName FirstNameExtension CtryCode LastMod HRKarlD HRKarlD HRAmyL Índice agrupado Anderson Anderson Barr ... Objectos de base de dados integer longstring varchar(20) char(6) char(2) longstring Trigger EmployeePhoneView SELECT lastname, firstname, extension FROM employee Procedimento armazenado UpdatePhone PK FK Check x#####
  • 15.
    Fazendo referência aosobjectos do SQL Server  Nomes totalmente qualificados servidor.base_de_dados.proprietário.objeto  Nomes especificados parcialmente  O servidor padrão é a ocorrência actual no servidor local  A base de dados padrão é a base de dados actual  O proprietário padrão é o nome do utilizador contido na base de dados CREATE TABLE Northwind.dbo.OrderHistory . . .
  • 16.
    Tabelas do sistema As tabelas do sistema armazenam informações (metadados) sobre o sistema e objectos de base de dados  O catálogo da base de dados armazena metadados sobre uma base de dados específica  O catálogo do sistema armazena metadados sobre o sistema inteiro e todos as outras bases de dados
  • 17.
    Recuperação de metadados Procedimentos armazenados do sistema  Funções do sistema e dos metadados  Views do esquema de informações EXEC sp_help Employees SELECT USER_NAME(10) SELECT * FROM INFORMATION_SCHEMA.TABLES
  • 18.
     Segurança doSQL Server  Autenticação de login  Contas de utilizador e cargos do base de dados  Tipos de cargos  Validação de permissões
  • 19.
    Autenticação de login AUTENTICAÇÃO OSQL Server verifica a conexão confiável O SQL Server verifica o nome e a senha OU SQL Server Utilizador ou grupo do Windows 2000 Windows 2000 Conta de login do SQL Server
  • 20.
    Contas de utilizadore cargos da base de dados O SQL Server atribui logins a contas de utilizadores e cargos Utilizador da base de dados Cargo de base de dados Utilizador ou grupo do Windows 2000 Conta de login do SQL Server O SQL Server verifica a conexão confiável O SQL Server verifica o nome e a senha SQL Server Windows 2000 OU
  • 21.
    Tipos de cargos Cargos fixos de servidor  Grupos de privilégios administrativos no nível do servidor  Cargos fixos de base de dados  Grupos de privilégios administrativos no nível da base de dados  Cargos de base de dados definidos pelo utilizador  Representam o trabalho executado por um grupo de funcionários de sua organização
  • 22.
    O SQL Server verificaas permissões Validação de permissões Permissões OK; o comando é executado Permissões não OK; retorno de Erro 2 3 SELECT * FROM Members O utilizador da base de dados executa o comando 1
  • 23.
     Trabalhando como SQL Server  Administrando uma base de dados do SQL Server  Implementando uma base de dados do SQL Server  Seleccionando uma arquitectura de aplicação para o SQL Server  Criando aplicações com APIs de base de dados
  • 24.
    Administrando uma basede dados do SQL Server  Tarefas administrativas comuns  SQL Server Enterprise Manager  Assistentes e ferramentas de administração do SQL Server  Ferramentas de gestão do prompt de comando do SQL Server  Help e Books Online do SQL Server
  • 25.
    Implementando uma basede dados do SQL Server  Criando a base de dados  Criando a base de dados e seus objectos  Testando e ajustando a aplicação e a base de dados  Planeando a implementação
  • 26.
    Internet N camadas Cliente Inteligente (2 camadas) Servidor Inteligente (2camadas) Seleccionando uma arquitectura de aplicação para o SQL Server Apresentação Negócios Dados Cliente do navegador Apresentação Negócios Dados Apresentação Negócios Dados Negócios Dados Apresentação
  • 27.
    Criando aplicações comAPIs de base de dados Interfaces de objectos de dados Application Programming Interfaces ADO OLE DB Outras fontes de dados Bases de dados relacionais
  • 28.
    Laboratório A: Visãogeral do SQL Server
  • 29.
    Revisão  O queé o SQL Server?  Integração do SQL Server  Bases de dados do SQL Server  Segurança do SQL Server  Trabalhando com o SQL Server
  • 30.
  • 31.
    Visão geral  Criandoa arquitectura de aplicações empresariais  Ferramentas de programação do SQL Server  Linguagem de programação Transact-SQL  Elementos do Transact-SQL  Outros elementos de linguagem  Maneiras de executar as instruções Transact-SQL
  • 32.
     Criando aarquitetura de aplicativos empresariais  Identificando camadas lógicas  Criando camadas físicas  Acedendo a dados
  • 33.
    Identificando camadas lógicas Camadade apresentação de dados Aplicações personalizadas do Windows Navegadores da Web Camada lógica de aplicação Componentes personalizados Aplicações e serviços integrados Regras comerciais Regras de dados Camada de serviços de dados Lógica de acesso a dados Armazenamento de dados
  • 34.
    Criando camadas físicas Serviçosde dados Apresentação de dados Serviços de dados Lógica de aplicação Apresentação de dados IIS Componentes Modelo de duas camadas Modelo de várias camadas Lógica de aplicativo
  • 35.
    Acedendo a dados Aplicaçõese componentes Navegador IIS ActiveX Data Objects Consumidores de dados Fornecedor de dados Access Excel Cliente personalizado Fornecedores de dados OLE DB (serviços) Cursores Processadores de consulta Serviços comerciais Fornecedores de dados OLE DB (dados) ODBC Exchange Active Directory Jet SQL Server Excel Outros fornecedores OLE DB
  • 36.
    Ferramentas de programaçãodo SQL Server  SQL Query Analyzer  Efectua a sintaxe de codificação por cores automaticamente  Várias janelas de consulta  Visualizações personalizáveis de conjuntos de resultados  Planos gráficos de execução  Executa partes de scripts  Utilitário osql  Utilitário de linha de comando
  • 37.
    Linguagem de programaçãoTransact-SQL  Implementação do padrão ISO ANSI-SQL no SQL Server  Pode ser executada em qualquer produto compatível com nível de entrada  Contém funcionalidade exclusiva adicional
  • 38.
     Elementos doTransact-SQL  Instruções de Data Control Language  Instruções de Data Definition Language  Instruções de Data Manipulation Language  Nomes de objectos do SQL Server  Orientações de nomeação
  • 39.
    Instruções de DataControl Language  Definem ou alteram permissões  GRANT  DENY  REVOKE  Por omissão, somente os participantes do cargo sysadmin, dbcreator, db_owner ou db_securityadmin podem executar
  • 40.
    Instruções de DataDefinition Language  Definem os objectos da base de dados  CREATE tipo_de_objeto nome_do_objeto  ALTER tipo_de_objeto nome_do_objeto  DROP tipo_de_objeto nome_do_objeto
  • 41.
    Instruções de DataManipulation Language  Operam com os dados contidos na base de dados  SELECT  INSERT  UPDATE  DELETE
  • 42.
    Nomes de objectosdo SQL Server  Identificadores padrão  O primeiro carácter deve ser um carácter alfabético  Outros caracteres podem incluir letras, números ou símbolos  Os nomes de identificadores que começam com um símbolo têm utilizações especiais  Identificadores delimitados  Use quando os nomes contiverem espaços incorporados  Use quando palavras reservadas forem partes de nomes  Delimite-os por parêntesis rectos ([ ]) ou aspas duplas (" ")
  • 43.
    Orientações de nomeação Quando possível, usar nomes significativos  Manter nomes curtos  Usar convenções de nomeação simples e claras  Escolher um identificador que diferencie tipos de objecto  Views  Procedimentos armazenados  Manter a exclusividade dos nomes de objectos e utilizadores
  • 44.
     Outros elementosde linguagem  Variáveis locais  Operadores  Funções  Exemplos de funções  Elementos de linguagem de controle de fluxo  Comentários
  • 45.
    Variáveis locais  Definidaspelo utilizador com a instrução DECLARE  Recebem valores através de uma instrução SET ou SELECT USE Northwind DECLARE @vLastName char(20), @vFirstName varchar(11) SET @vLastName = 'Dodsworth' SELECT @vFirstName = FirstName FROM Northwind..Employees WHERE LastName = @vLastName PRINT @vFirstName + ' ' + @vLastName GO
  • 46.
    Operadores  Tipos deoperadores  Aritmético  Comparação  Concatenação de sequências de caracteres  Lógico  Níveis de precedência dos operadores
  • 47.
    Funções  Funções agregadas Funções escalares  Funções de conjunto de registros SELECT * FROM OPENQUERY (OracleSvr, 'SELECT ENAME, EMPNO FROM SCOTT.EMP') SELECT AVG (UnitPrice) FROM Products SELECT DB_NAME() AS 'database'
  • 48.
    Exemplos de funções SELECT'ANSI:' AS Region, CONVERT(varchar(30), GETDATE(), 102) AS Style UNION SELECT 'European:', CONVERT(varchar(30), GETDATE(), 113) UNION SELECT 'Japanese:', CONVERT(varchar(30), GETDATE(), 111) Resultado ANSI: European: Japanese: Style 1 1 2000.03.22 22 Mar 2000 14:20:00:010 2000/03/22 Region
  • 49.
    Elementos de linguagemde controle de fluxo  Nível de instrução  Blocos BEGIN…END  Blocos IF…ELSE  Construções com WHILE  Nível de registro  Expressão CASE IF USER_NAME() <> 'dbo' BEGIN RAISERROR('Must be sysadmin to Perform Operation', 10, 1) RETURN END ELSE DBCC CHECKDB(Northwind)
  • 50.
    Comentários  Comentários emlinha  Comentários em bloco SELECT ProductName ,(UnitsInStock + UnitsOnOrder) AS Max -- Calcula o inventário , SupplierID FROM Products /* ** Este código recupera todos os registros da tabela products ** e exibe o preço unitário, o preço unitário com aumento ** de 10% e o nome do produto. */ SELECT UnitPrice, (UnitPrice * 1.1), ProductName FROM Products
  • 51.
     Maneiras deexecutar as instruções Transact-SQL  Construindo instruções de forma dinâmica  Usando lotes (batches)  Usando scripts  Usando transacções  Usando a Extensible Markup Language
  • 52.
    Construindo instruções deforma dinâmica  Use EXECUTE com literais e variáveis de sequências de caracteres  Use quando for necessário atribuir o valor da variável em tempo de execução  As variáveis e tabelas temporárias permanecerão somente durante a execução DECLARE @dbname varchar(30), @tablename varchar(30) SET @dbname = 'Northwind' SET @tablename = 'Products' EXECUTE ('USE' + @dbname + 'SELECT * FROM' + @tablename)
  • 53.
    Usando lotes  Umaou mais instruções Transact-SQL submetidas em conjunto  Definir um lote com a instrução GO  Como o SQL Server processa lotes  Instruções que você não pode combinar em um lote  CREATE PROCEDURE  CREATE VIEW  CREATE TRIGGER  CREATE RULE  CREATE DEFAULT
  • 54.
    Usando scripts  Contêminstruções gravadas  Podem ser escritos em qualquer editor de texto  Grave usando a extensão de nome de arquivo .sql  São executados no SQL Query Analyzer ou no utilitário osql  Use para a recriação de objectos de bases de dados ou para executar instruções várias vezes
  • 55.
    Usando transações  Processadascomo um lote  Integridade de dados garantida  Alterações na base de dados são aplicadas juntas ou desfeitas BEGIN TRANSACTION UPDATE savings SET balance = (amount - 100) WHERE custid = 78910 … <Rollback transaction if error> UPDATE checking SET balance = (amount + 100) WHERE custid = 78910 … <Rollback transaction if error> COMMIT TRANSACTION
  • 56.
    Usando a ExtensibleMarkup Language  Permitindo que um navegador cliente formate dados  Especificando a opção FOR XML AUTO  Especificando a opção FOR XML RAW  Identificando limitações na utilização da cláusula FOR XML
  • 57.
    Práticas recomendadas Use asintaxe do ANSI SQL Use a sintaxe do ANSI SQL Mantenha a lógica comercial no servidor como procedimentos armazenados Mantenha a lógica comercial no servidor como procedimentos armazenados Salve as instruções como scripts e faça um comentário completo delas Salve as instruções como scripts e faça um comentário completo delas Formate as instruções Transact-SQL de modo que os outros utilizadores as consigam ler Formate as instruções Transact-SQL de modo que os outros utilizadores as consigam ler Escolha uma convenção de nomeação adequada Escolha uma convenção de nomeação adequada
  • 58.
    Laboratório A: Visãogeral do Transact-SQL
  • 59.
    Revisão  Criando aarquitectura de aplicações empresariais  Ferramentas de programação do SQL Server  Linguagem de programação Transact-SQL  Elementos do Transact-SQL  Outros elementos de linguagem  Maneiras de executar as instruções Transact-SQL
  • 60.
  • 61.
    Visão geral  Linguagemde programação Transact-SQL  Tipos de instruções Transact-SQL  Elementos de sintaxe do Transact-SQL
  • 62.
    Linguagem de programaçãoTransact-SQL  Implementa o padrão SQL-92 em nível de acesso publicado pelo ANSI e pela ISO  Pode ser executada em qualquer produto compatível com nível de acesso  Contém funcionalidade exclusiva adicional
  • 63.
     Tipos deinstruções Transact-SQL  Instruções de DDL  Instruções de DCL  Instruções de DML
  • 64.
    Instruções de DDL Definem os objectos da base de dados  CREATE nome_do_objeto  ALTER nome_do_objeto  DROP nome_do_objeto  Devem ter as permissões apropriadas USE northwind CREATE TABLE customer (cust_id int, company varchar(40), contact varchar(30), phone char(12) ) GO
  • 65.
    Instruções de DCL Definem ou alteram permissões  GRANT  DENY  REVOKE  Devem ter as permissões apropriadas USE northwind GRANT SELECT ON products TO public GO
  • 66.
    Instruções de DML Alteram dados ou recuperam informações  SELECT  INSERT  UPDATE  DELETE  Devem ter as permissões apropriadas USE northwind SELECT categoryid, productname, productid, unitprice FROM products GO
  • 67.
     Elementos desintaxe do Transact-SQL  Directivas em lotes  Comentários  Identificadores  Tipos de dados  Variáveis  Funções do sistema  Operadores  Expressões  Elementos de linguagem de controle de fluxo  Palavras-chave reservadas
  • 68.
    Directivas em lotes GO  Define os lotes de instruções Transact-SQL para ferramentas e utilitários  Não é uma instrução Transact-SQL real  EXEC  Executa uma função definida pelo utilizador, um procedimento do sistema, um procedimento armazenado definido pelo utilizador ou um procedimento armazenado estendido  Controla a execução de uma sequência de caracteres num lote do Transact-SQL
  • 69.
    Comentários  Comentários emlinha  Comentários em bloco USE northwind SELECT productname , (unitsinstock - unitsonorder) -- Calcula o inventário , supplierid FROM products GO /* 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 Exemplo 3 Exemplo 1
  • 70.
     Identificadores  Identificadorespadrão  O primeiro carácter deve ser um carácter alfabético  Outros caracteres podem incluir letras, numerais ou símbolos  Os nomes de identificadores que começam com um símbolo têm utilizações especiais  Identificadores delimitados  Use quando os nomes contiverem espaços incorporados  Use quando palavras reservadas forem partes de nomes  Delimite-os por parêntesis rectos ([ ]) ou aspas duplas (" ")
  • 71.
    Directrizes de nomeaçãode identificadores  Mantenha os nomes curtos  Quando possível, empregue nomes significativos  Use convenções de nomeação simples e fáceis  Use um identificador que diferencie tipos de objecto  Views  Procedimentos armazenados  Mantenha a exclusividade dos nomes de objectos e utilizadores  Tabela Sales e cargo sales
  • 72.
    Tipos de dados Numbers  Dates  Characters  Binary  Unique Identifiers  SQL Variants  Image e Text  Tables  Cursors  Tipos de dados definidos pelo utilizador
  • 73.
    Variáveis  Definidas peloutilizador com a instrução DECLARE precedida de um símbolo @  Recebem valores através de uma instrução SET ou SELECT precedida de um símbolo @  Têm âmbito local 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
  • 74.
     Funções dosistema  Funções agregadas  Funções escalares  Funções de definição de registros SELECT * FROM OPENQUERY (OracleSvr, 'SELECT name, id FROM owner.titles') USE northwind SELECT AVG (unitprice) AS AvgPrice FROM products GO USE northwind SELECT DB_NAME() AS 'database‘ GO
  • 75.
    Exemplos de funçõesdo sistema 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 Resultado Style ANSI: Japanese: European: 1998.11.20 11/20/98 20 Nov 1998 16:44:12:857 Exemplo 1
  • 76.
    Operadores  Tipos deoperadores  Aritmético  Comparação  Concatenação de sequências de caracteres  Lógico  Níveis de precedência dos operadores
  • 77.
    Expressões  Combinação desímbolos e operadores  Avaliação como um único valor escalar  Resultado de tipo de dados dependentes dos elementos na expressão USE northwind SELECT OrderID, ProductID ,(UnitPrice * Quantity) as ExtendedAmount FROM [Order Details] WHERE (UnitPrice * Quantity) > 10000 GO
  • 78.
    Elementos de linguagemde controle de fluxo  Nível de instrução  Blocos BEGIN … END  Blocos IF … ELSE  Construções com WHILE  Nível de registro  Expressão CASE DECLARE @n tinyint SET @n = 5 IF (@n BETWEEN 4 and 6) BEGIN WHILE (@n > 0) BEGIN SELECT @n AS 'Number' ,CASE WHEN (@n % 2) = 1 THEN 'EVEN' ELSE 'ODD' END AS 'Type' SET @n = @n - 1 END END ELSE PRINT 'SEM ANÁLISE' GO Exemplo 2
  • 79.
    Palavras-chave reservadas  Nomesde identificadores que têm significado especial  Palavras-chave do Transact-SQL  Palavras-chave do ANSI SQL-92  Palavras-chave reservadas do ODBC  Não use palavras-chave reservadas para nomes de identificadores
  • 80.
    Laboratório A: Usandoo Books Online do SQL Server
  • 81.
    Revisão  Linguagem deprogramação Transact-SQL  Tipos de instruções Transact-SQL  Elementos de sintaxe do Transact-SQL
  • 82.
  • 83.
    Visão geral  Linguagemde programação Transact-SQL  Tipos de instruções Transact-SQL  Elementos de sintaxe do Transact-SQL
  • 84.
    Linguagem de programaçãoTransact-SQL  Implementa o padrão SQL-92 em nível de acesso publicado pelo ANSI e pela ISO  Pode ser executada em qualquer produto compatível com nível de acesso  Contém funcionalidade exclusiva adicional
  • 85.
     Tipos deinstruções Transact-SQL  Instruções de DDL  Instruções de DCL  Instruções de DML
  • 86.
    Instruções de DDL Definem os objectos da base de dados  CREATE nome_do_objeto  ALTER nome_do_objeto  DROP nome_do_objeto  Devem ter as permissões apropriadas USE northwind CREATE TABLE customer (cust_id int, company varchar(40), contact varchar(30), phone char(12) ) GO
  • 87.
    Instruções de DCL Definem ou alteram permissões  GRANT  DENY  REVOKE  Devem ter as permissões apropriadas USE northwind GRANT SELECT ON products TO public GO
  • 88.
    Instruções de DML Alteram dados ou recuperam informações  SELECT  INSERT  UPDATE  DELETE  Devem ter as permissões apropriadas USE northwind SELECT categoryid, productname, productid, unitprice FROM products GO
  • 89.
     Elementos desintaxe do Transact-SQL  Directivas em lotes  Comentários  Identificadores  Tipos de dados  Variáveis  Funções do sistema  Operadores  Expressões  Elementos de linguagem de controle de fluxo  Palavras-chave reservadas
  • 90.
    Directivas em lotes GO  Define os lotes de instruções Transact-SQL para ferramentas e utilitários  Não é uma instrução Transact-SQL real  EXEC  Executa uma função definida pelo utilizador, um procedimento do sistema, um procedimento armazenado definido pelo utilizador ou um procedimento armazenado estendido  Controla a execução de uma sequência de caracteres num lote do Transact-SQL
  • 91.
    Comentários  Comentários emlinha  Comentários em bloco USE northwind SELECT productname , (unitsinstock - unitsonorder) -- Calcula o inventário , supplierid FROM products GO /* 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 Exemplo 3 Exemplo 1
  • 92.
     Identificadores  Identificadorespadrão  O primeiro carácter deve ser um carácter alfabético  Outros caracteres podem incluir letras, numerais ou símbolos  Os nomes de identificadores que começam com um símbolo têm utilizações especiais  Identificadores delimitados  Use quando os nomes contiverem espaços incorporados  Use quando palavras reservadas forem partes de nomes  Delimite-os por parêntesis rectos ([ ]) ou aspas duplas (" ")
  • 93.
    Directrizes de nomeaçãode identificadores  Mantenha os nomes curtos  Quando possível, empregue nomes significativos  Use convenções de nomeação simples e fáceis  Use um identificador que diferencie tipos de objecto  Views  Procedimentos armazenados  Mantenha a exclusividade dos nomes de objectos e utilizadores  Tabela Sales e cargo sales
  • 94.
    Tipos de dados Numbers  Dates  Characters  Binary  Unique Identifiers  SQL Variants  Image e Text  Tables  Cursors  Tipos de dados definidos pelo utilizador
  • 95.
    Variáveis  Definidas peloutilizador com a instrução DECLARE precedida de um símbolo @  Recebem valores através de uma instrução SET ou SELECT precedida de um símbolo @  Têm âmbito local 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
  • 96.
     Funções dosistema  Funções agregadas  Funções escalares  Funções de definição de registros SELECT * FROM OPENQUERY (OracleSvr, 'SELECT name, id FROM owner.titles') USE northwind SELECT AVG (unitprice) AS AvgPrice FROM products GO USE northwind SELECT DB_NAME() AS 'database‘ GO
  • 97.
    Exemplos de funçõesdo sistema 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 Resultado Style ANSI: Japanese: European: 1998.11.20 11/20/98 20 Nov 1998 16:44:12:857 Exemplo 1
  • 98.
    Operadores  Tipos deoperadores  Aritmético  Comparação  Concatenação de sequências de caracteres  Lógico  Níveis de precedência dos operadores
  • 99.
    Expressões  Combinação desímbolos e operadores  Avaliação como um único valor escalar  Resultado de tipo de dados dependentes dos elementos na expressão USE northwind SELECT OrderID, ProductID ,(UnitPrice * Quantity) as ExtendedAmount FROM [Order Details] WHERE (UnitPrice * Quantity) > 10000 GO
  • 100.
    Elementos de linguagemde controle de fluxo  Nível de instrução  Blocos BEGIN … END  Blocos IF … ELSE  Construções com WHILE  Nível de registro  Expressão CASE DECLARE @n tinyint SET @n = 5 IF (@n BETWEEN 4 and 6) BEGIN WHILE (@n > 0) BEGIN SELECT @n AS 'Number' ,CASE WHEN (@n % 2) = 1 THEN 'EVEN' ELSE 'ODD' END AS 'Type' SET @n = @n - 1 END END ELSE PRINT 'SEM ANÁLISE' GO Exemplo 2
  • 101.
    Palavras-chave reservadas  Nomesde identificadores que têm significado especial  Palavras-chave do Transact-SQL  Palavras-chave do ANSI SQL-92  Palavras-chave reservadas do ODBC  Não use palavras-chave reservadas para nomes de identificadores
  • 102.
    Laboratório A: Usandoo Books Online do SQL Server
  • 103.
    Revisão  Linguagem deprogramação Transact-SQL  Tipos de instruções Transact-SQL  Elementos de sintaxe do Transact-SQL
  • 104.
  • 105.
    Visão geral  Listandoos primeiros n valores com TOP n  Usando funções agregadas  Noções básicas sobre a cláusula GROUP BY  Gerando valores agregados em conjuntos de resultados  Usando as cláusulas COMPUTE e COMPUTE BY
  • 106.
    Listando os primeirosn valores com TOP n  Lista apenas os n primeiros registros de um conjunto de resultados  Especifica o intervalo de valores na cláusula ORDER BY  Retorna correspondências se WITH TIES for usada USE northwind SELECT TOP 5 orderid, productid, quantity FROM [order details] ORDER BY quantity DESC GO USE northwind SELECT TOP 5 WITH TIES orderid, productid, quantity FROM [order details] ORDER BY quantity DESC GO Exemplo 1 Exemplo 2
  • 107.
     Usando funçõesagregadas Funções agregadas Descrição AVG Média de valores em uma expressão numérica COUNT Número de valores em uma expressão COUNT (*) Número de registros selecionados MAX Maior valor da expressão MIN Menor valor da expressão SUM Valores totais em uma expressão numérica STDEV Desvio padrão de todos os valores STDEVP Desvio padrão da população VAR Variância estatística de todos os valores VARP Variância estatística de todos os valores da população
  • 108.
    Usando funções agregadascom valores nulos  A maioria das funções agregadas ignora valores nulos  A função COUNT (*) conta todos os registos com valores nulos USE northwind SELECT COUNT (*) FROM employees GO USE northwind SELECT COUNT(reportsto) FROM employees GO Exemplo 1 Exemplo 2
  • 109.
     Noções básicassobre a cláusula GROUP BY  Usando a cláusula GROUP BY  Usando a cláusula GROUP BY com a cláusula HAVING
  • 110.
    Usando a cláusulaGROUP BY USE northwind SELECT productid, orderid ,quantity FROM orderhist GO USE northwind SELECT productid ,SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid GO productid orderid quantity 1 1 5 1 1 10 2 1 10 2 2 25 3 1 15 3 2 30 productid total_quantity 1 15 2 35 3 45 productid total_quantity 2 35 Apenas os registos que satisfazem às condições da cláusula WHERE serão agrupados USE northwind SELECT productid ,SUM(quantity) AS total_quantity FROM orderhist WHERE productid = 2 GROUP BY productid GO
  • 111.
    Usando a cláusulaGROUP BY com a cláusula HAVING USE northwind SELECT productid, orderid ,quantity FROM orderhist GO USE northwind SELECT productid, SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid HAVING SUM(quantity)>=30 GO productid total_quantity 2 35 3 45 productid orderid quantity 1 1 5 1 1 10 2 1 10 2 2 25 3 1 15 3 2 30
  • 112.
     Gerando valoresagregados em conjuntos de resultados  Usando a cláusula GROUP BY com o operador ROLLUP  Usando a cláusula GROUP BY com o operador CUBE  Usando a função GROUPING
  • 113.
    Usando a cláusulaGROUP BY com o operador ROLLUP USE northwind SELECT productid, orderid, SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid, orderid WITH ROLLUP ORDER BY productid, orderid GO Descrição productid orderid total_quantity NULL NULL 95 1 NULL 15 1 1 5 1 2 10 2 NULL 35 2 1 10 2 2 25 3 NULL 45 3 1 15 3 2 30 Total geral Resume apenas os registros de productid 1 Valores de detalhe de productid 1, orderid 1 Valores de detalhe de productid 1, orderid 2 Resume apenas os registros de productid 2 Valores de detalhe de productid 2, orderid 1 Resume apenas os registros de productid 3 Valores de detalhe de productid 3, orderid 1 Valores de detalhe de productid 3, orderid 2
  • 114.
    USE northwind SELECT productid,orderid, SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid, orderid WITH CUBE ORDER BY productid, orderid GO Usando a cláusula GROUP BY com o operador CUBE O operador CUBE produz dois valores de resumo a mais que o operador ROLLUP Descrição productid orderid total_quantity NULL NULL 95 NULL 1 30 NULL 2 65 1 NULL 15 1 1 5 1 2 10 2 NULL 35 2 1 10 2 2 25 3 NULL 45 3 1 15 3 2 30 Total geral Resume todos os registros de orderid 1 Resume todos os registros de orderid 2 Resume apenas os registros de productid 1 Valores de detalhe de productid 1, orderid 1 Valores de detalhe de productid 1, orderid 2 Resume apenas os registros de productid 2 Valores de detalhe de productid 2, orderid 1 Valores de detalhe de productid 2, orderid 2 Resume apenas os registros de productid 3 Valores de detalhe de productid 3, orderid 1 Valores de detalhe de productid 3, orderid 2
  • 115.
    1 representa osvalores de resumo na coluna anterior 0 representa os valores de detalhe na na coluna anterior Usando a função GROUPING USE northwind SELECT productid, GROUPING (productid) ,orderid, GROUPING (orderid) ,SUM(quantity) AS total_quantity FROM orderhist GROUP BY productid, orderid WITH CUBE ORDER BY productid, orderid GO productid NULL NULL NULL 1 1 1 2 2 2 3 3 3 1 1 1 0 0 0 0 0 0 0 0 0 orderid NULL 1 2 NULL 1 2 NULL 1 2 NULL 1 2 1 0 0 1 0 0 1 0 0 1 0 0 total_quantity 95 30 65 15 5 10 35 10 25 45 15 30
  • 116.
    Usando as cláusulasCOMPUTE e COMPUTE BY COMPUTE BY COMPUTE USE northwind SELECT productid, orderid, quantity FROM orderhist ORDER BY productid, orderid COMPUTE SUM(quantity) BY productid COMPUTE SUM(quantity) GO USE northwind SELECT productid, orderid ,quantity FROM orderhist ORDER BY productid, orderid COMPUTE SUM(quantity) GO productid orderid quantity 1 1 5 1 2 10 2 1 10 2 2 25 3 1 15 3 2 30 sum 95 productid orderid quantity 1 1 5 1 2 10 sum 15 2 1 10 2 2 25 sum 35 3 1 15 3 2 30 sum 45 sum 95
  • 117.
    Práticas recomendadas Use acláusula COMPUTE ou COMPUTE BY para testar as suas aplicacões Use a cláusula COMPUTE ou COMPUTE BY para testar as suas aplicacões Indexe colunas frequentemente agregadas Indexe colunas frequentemente agregadas Evite usar funções agregadas com colunas que contêm valores nulos Evite usar funções agregadas com colunas que contêm valores nulos Use a cláusula ORDER BY para garantir a classificação do conjunto de resultados Use a cláusula ORDER BY para garantir a classificação do conjunto de resultados Use o operador ROLLUP sempre que possível Use o operador ROLLUP sempre que possível
  • 118.
    Práticas recomendadas Indexe colunasfrequentemente agregadas Indexe colunas frequentemente agregadas Evite usar funções agregadas com colunas que contêm valores nulos Evite usar funções agregadas com colunas que contêm valores nulos Use a cláusula ORDER BY para garantir a classificação do conjunto de resultados Use a cláusula ORDER BY para garantir a classificação do conjunto de resultados Use o operador ROLLUP sempre que possível Use o operador ROLLUP sempre que possível Use a cláusula COMPUTE ou COMPUTE BY para testar as suas aplicacões Use a cláusula COMPUTE ou COMPUTE BY para testar as suas aplicacões
  • 119.
  • 120.
    Revisão  Listando osprimeiros n valores com TOP n  Usando funções agregadas  Noções básicas sobre a cláusula GROUP BY  Gerando valores agregados em conjuntos de resultados  Usando as cláusulas COMPUTE e COMPUTE BY
  • 121.
  • 122.
    Visão geral  Usandoaliases para nomes de tabelas  Combinando dados de várias tabelas  Combinando vários conjuntos de resultados
  • 123.
    Usando aliases paranomes de tabelas  Exemplo 1 (sem nome de alias)  Exemplo 2 (com nome de alias) USE joindb SELECT buyer_name, s.buyer_id, qty FROM buyers AS b INNER JOIN sales AS s ON b.buyer_id = s.buyer_id GO USE joindb SELECT buyer_name, sales.buyer_id, qty FROM buyers INNER JOIN sales ON buyers.buyer_id = sales.buyer_id GO
  • 124.
     Combinando dadosde várias tabelas  Introdução às associações  Usando associações internas  Usando associações externas  Usando associações cruzadas  Associando mais de duas tabelas  Associando uma tabela a si mesma
  • 125.
    Introdução às associações Seleccionar colunas específicas a partir de várias tabelas  A palavra-chave JOIN especifica quais tabelas serão associadas e como associá-las  A palavra-chave ON especifica as colunas que as tabelas têm em comum  Consultar duas ou mais tabelas para produzir um conjunto de resultados  Usar chaves primárias e externas como condições de associação  Usar colunas comuns às tabelas especificadas para associar tabelas
  • 126.
    USE joindb SELECT buyer_name,sales.buyer_id, qty FROM buyers INNER JOIN sales ON buyers.buyer_id = sales.buyer_id GO buyer_name Adam Barr Sean Chai Eva Corets Erin O’Melia buyer_id 1 2 3 4 Usando associações internas sales buyer_id prod_id qty 1 1 4 3 2 3 1 5 15 5 37 11 4 2 1003 buyers Resultado buyer_name Adam Barr Adam Barr Erin O’Melia Eva Corets buyer_id qty 1 1 4 3 15 5 37 11 Erin O’Melia 4 1003 Exemplo 1
  • 127.
    USE joindb SELECT buyer_name,sales.buyer_id, qty FROM buyers LEFT OUTER JOIN sales ON buyers.buyer_id = sales.buyer_id GO buyer_id prod_id qty 1 1 4 3 2 3 1 5 15 5 37 11 4 2 1003 buyer_name Adam Barr Sean Chai Eva Corets Erin O’Melia buyer_id 1 2 3 4 Usando associações externas sales buyers Resultado buyer_name Adam Barr Adam Barr Erin O’Melia Eva Corets buyer_id qty 1 1 4 3 15 5 37 11 Erin O’Melia 4 1003 Sean Chai NULL NULL Exemplo 1
  • 128.
    Usando associações cruzadas Resultado USEjoindb SELECT buyer_name, qty FROM buyers CROSS JOIN sales GO buyer_name Adam Barr Adam Barr Adam Barr Adam Barr qty 15 5 37 11 Adam Barr 1003 Sean Chai 15 Sean Chai 5 Sean Chai 37 Sean Chai 11 Sean Chai 1003 Eva Corets 15 ... ... sales buyer_id prod_id qty 1 1 4 3 2 3 1 5 15 5 37 11 4 2 1003 buyers buyer_id 1 2 3 4 buyer_name Adam Barr Sean Chai Eva Corets Erin O’Melia Exemplo 1
  • 129.
    USE joindb SELECT buyer_name,prod_name, qty FROM buyers INNER JOIN sales ON buyers.buyer_id = sales.buyer_id INNER JOIN produce ON sales.prod_id = produce.prod_id GO produce buyers sales Resultado Associando mais de duas tabelas prod_id prod_name 1 2 3 4 Apples Pears Oranges Bananas 5 Peaches buyer_id 1 2 3 4 buyer_name Adam Barr Sean Chai Eva Corets Erin O’Melia buyer_id 1 1 3 4 prod_id 2 3 1 5 2 2 qty 15 5 37 11 1003 Exemplo 1 buyer_name Erin O’Melia Adam Barr Erin O’Melia Adam Barr Eva Corets prod_name Apples Pears Pears Oranges Peaches qty 37 15 1003 5 11
  • 130.
    USE joindb SELECT a.buyer_idAS buyer1, a.prod_id ,b.buyer_id AS buyer2 FROM sales AS a INNER JOIN sales AS b ON a.prod_id = b.prod_id WHERE a.buyer_id > b.buyer_id GO Associando uma tabela a si mesma sales b buyer_id prod_id qty 1 1 4 3 2 3 1 5 15 5 37 11 4 2 1003 sales a buyer_id prod_id qty 1 1 4 3 2 3 1 5 15 5 37 11 4 2 1003 Resultado buyer1 4 prod_id buyer2 2 1 Exemplo 3
  • 131.
    Combinando vários conjuntosde resultados  Usar o operador UNION para criar um único conjunto de resultados de várias consultas  As consultas precisam de:  Tipos de dados semelhantes  Número de colunas idêntico  Ordem de colunas idêntica na lista de selecções USE northwind SELECT (firstname + ' ' + lastname) AS name ,city, postalcode FROM employees UNION SELECT companyname, city, postalcode FROM customers GO
  • 132.
    Práticas recomendadas Associe tabelasem chaves primárias e externas Associe tabelas em chaves primárias e externas Usar como referência todas as colunas de uma chave primária composta na cláusula ON quando uma chave composta relacionar tabelas Usar como referência todas as colunas de uma chave primária composta na cláusula ON quando uma chave composta relacionar tabelas Limitar o número de tabelas numa associação Limitar o número de tabelas numa associação
  • 133.
    Laboratório A: Consultandoem várias tabelas
  • 134.
    Revisão  Usando aliasespara nomes de tabelas  Combinando dados de várias tabelas  Combinando vários conjuntos de resultados
  • 135.
  • 136.
    Visão geral  Introduçãoàs subconsultas  Usando uma subconsulta como uma tabela derivada  Usando uma subconsulta como uma expressão  Usando uma subconsulta para correlacionar dados  Usando as cláusulas EXISTS e NOT EXISTS
  • 137.
    Introdução às subconsultas Porque usar subconsultas?  Para dividir uma consulta complexa numa sequência de etapas lógicas  Para responder a uma consulta quando ela se baseia nos resultados de outra consulta  Porque usar associações em vez de subconsultas?  O SQL Server executa associações de forma mais rápida que as subconsultas  Como usar subconsultas?
  • 138.
    Usando uma subconsultacomo uma tabela derivada  É um conjunto de registos dentro da consulta que funciona como uma tabela  Toma o lugar de uma tabela na cláusula FROM  É optimizada com o resto da consulta USE northwind SELECT T.orderid, T.customerid FROM ( SELECT orderid, customerid FROM orders ) AS T GO
  • 139.
    Usando uma subconsultacomo uma expressão  É avaliada e tratada como uma expressão  É executada uma vez para toda a instrução USE pubs SELECT title, price ,( SELECT AVG(price) FROM titles) AS average ,price-(SELECT AVG(price) FROM titles) AS difference FROM titles WHERE type='popular_comp' GO
  • 140.
     Usando umasubconsulta para correlacionar dados  Avaliando uma subconsulta correlacionada  Imitando uma cláusula JOIN  Imitando uma cláusula HAVING
  • 141.
    Voltar para etapa1 Avaliando uma subconsulta correlacionada USE Northwind SELECT orderid, customerid FROM orders AS or1 WHERE 20 < (SELECT quantity FROM [order details] AS od WHERE or1.orderid = od.orderid AND od.productid = 23) GO A consulta interna usa os valores passados pela consulta externa A consulta interna retorna um valor à consulta externa O processo se repete para o próximo registro da consulta externa Exemplo 1 A consulta externa passa um valor de coluna à consulta interna
  • 142.
    Imitando uma cláusulaJOIN  Subconsultas correlacionadas podem produzir os mesmos resultados de uma cláusula JOIN  Associações permitem que o optimizador de consultas determine como correlacionar os dados de forma mais eficiente USE pubs SELECT DISTINCT t1.type FROM titles AS t1 WHERE t1.type IN (SELECT t2.type FROM titles AS t2 WHERE t1.pub_id <> t2.pub_id) GO Exemplo 1
  • 143.
    USE pubs SELECT t1.type,t1.title, t1.price FROM titles AS t1 INNER JOIN titles AS t2 ON t1.type = t2.type GROUP BY t1.type, t1.title, t1.price HAVING t1.price > AVG(t2.price) GO Imitando uma cláusula HAVING  Subconsulta com o mesmo resultado de uma cláusula HAVING  Usando uma cláusula HAVING sem uma subconsulta USE pubs SELECT t1.type, t1.title, t1.price FROM titles AS t1 WHERE t1.price > ( SELECT AVG(t2.price) FROM titles AS t2 WHERE t1.type = t2.type ) GO Exemplo 1 Exemplo 2
  • 144.
    Usando as cláusulasEXISTS e NOT EXISTS  Usar com subconsultas correlacionadas  Determinar se há dados numa lista de valores  Processo do SQL Server  A consulta externa testa a existência dos registos  A subconsulta retorna um valor TRUE ou FALSE  A subconsulta não produz quaisquer dados USE northwind SELECT lastname, employeeid FROM employees AS e WHERE EXISTS (SELECT * FROM orders AS o WHERE e.employeeid = o.employeeid AND o.orderdate = '9/5/1997') GO Exemplo 1
  • 145.
    Práticas recomendadas Use subconsultaspara dividir uma consulta complexa Use subconsultas para dividir uma consulta complexa Use aliases de nomes de tabelas em subconsultas correlacionadas Use aliases de nomes de tabelas em subconsultas correlacionadas Use a instrução INSERT…SELECT para adicionar registos de outras origens à tabela existente Use a instrução INSERT…SELECT para adicionar registos de outras origens à tabela existente Use o operador EXISTS em vez do operador IN Use o operador EXISTS em vez do operador IN
  • 146.
  • 147.
    Revisão  Introdução àssubconsultas  Usando uma subconsulta como uma tabela derivada  Usando uma subconsulta como uma expressão  Usando uma subconsulta para correlacionar dados  Usando as cláusulas EXISTS e NOT EXISTS
  • 148.
  • 149.
    Visão geral  Usandotransacções  Inserindo dados  Excluindo dados  Actualizando dados  Considerações sobre o desempenho
  • 150.
    Visão geral  Inserindodados  Excluindo dados  Actualizando dados  Considerações sobre o desempenho
  • 151.
    Usando transações  Iniciandotransacções  Explícitas  Autoconfirmar  Implícitas  Finalizando transacções  Instrução COMMIT  Instrução ROLLBACK BEGIN TRANSACTION UPDATE savings . . . UPDATE checking . . . COMMIT TRANSACTION
  • 152.
     Inserindo dados Inserindo um registo de dados por valores  Usando a instrução INSERT…SELECT  Criando uma tabela usando a instrução SELECT INTO  Inserindo dados parciais  Inserindo dados usando padrões de coluna
  • 153.
    Inserindo um registode dados por valores  As restrições de destino devem ser obedecidas, caso contrário, a transacção INSERT falhará  Use a lista_de_colunas para especificar as colunas que armazenarão cada valor de entrada  Especifique os dados que serão inseridos, através da cláusula VALUES USE northwind INSERT customers (customerid, companyname, contactname, contacttitle ,address, city, region, postalcode, country, phone ,fax) VALUES ('PECOF', 'Pecos Coffee Company', 'Michael Dunn' ,'Owner', '1900 Oak Street', 'Vancouver', 'BC' ,'V3F 2K1', 'Canada', '(604) 555-3392' ,'(604) 555-7293') GO
  • 154.
    USE northwind INSERT customers SELECTsubstring(firstname, 1, 3) + substring (lastname, 1, 2) ,lastname, firstname, title, address, city ,region, postalcode, country, homephone, NULL FROM employees GO Usando a instrução INSERT…SELECT  Todos os registos que atendem à instrução SELECT são inseridos  Deve certificar-se da existência da tabela que recebe os novos registros no banco de dados  Deve certificar-se de que as colunas da tabela que recebe os novos valores tenham tipos de dados compatíveis  Deve determinar se existe um valor padrão ou se é permitido um valor nulo
  • 155.
    Criando uma tabelausando a instrução SELECT INTO  Usar a instrução SELECT INTO para criar uma tabela e inserir registos nessa tabela numa única operação  Criar uma tabela temporária local ou global  Criar aliases de colunas ou especificar os nomes de colunas da nova tabela na lista de selecções USE northwind SELECT productname AS products ,unitprice AS price ,(unitprice * 1.1) AS tax INTO #pricetable FROM products GO
  • 156.
    Inserindo dados parciais USEnorthwind INSERT shippers (companyname) VALUES ('Fitch & Mather') GO Adicionando novos dados USE northwind SELECT * FROM shippers WHERE companyname = 'Fitch & Mather' GO Verificando novos dados shipperid 37 companyname Fitch & Mather phone Null Permite valores nulos Exemplo 1 Exemplo 2
  • 157.
    Inserindo dados usandopadrões de coluna  Palavra-chave DEFAULT  Insere valores padrão para colunas especificadas  As colunas devem ter um valor padrão ou permitir valores nulos  Palavra-chave DEFAULT VALUES  Insere valores padrão para todas as colunas  As colunas devem ter um valor padrão ou permitir valores nulos USE northwind INSERT shippers (companyname, phone) VALUES ('Kenya Coffee Co.', DEFAULT) GO
  • 158.
     Excluindo dados Usando a instrução DELETE  Usando a instrução TRUNCATE TABLE  Excluindo registos com base noutras tabelas
  • 159.
    Usando a instruçãoDELETE  A instrução DELETE remove um ou mais registos numa tabela a menos que se use uma cláusula WHERE USE northwind DELETE orders WHERE DATEDIFF(MONTH, shippeddate, GETDATE()) >= 6 GO
  • 160.
    USE northwind TRUNCATE TABLEorders GO Usando a instrução TRUNCATE TABLE  A instrução TRUNCATE TABLE exclui todos os registos numa tabela  O SQL Server mantém a estrutura da tabela e os objectos associados
  • 161.
    Excluindo registos combase noutras tabelas  Usando uma cláusula FROM adicional  A primeira cláusula FROM indica a tabela da qual os registos serão excluídos  A segunda cláusula FROM pode introduzir uma associação e actuar como critério de restrição para a instrução DELETE USE northwind DELETE FROM [order details] FROM orders AS o INNER JOIN [order details] AS od ON o.orderid = od.orderid WHERE orderdate = ‘4/14/1998’ GO
  • 162.
    Excluindo registos combase noutras tabelas  Especificando condições na cláusula WHERE  As subconsultas determinam os registos a serem excluídos USE northwind DELETE FROM [order details] WHERE orderid IN ( SELECT orderid FROM orders WHERE orderdate = ‘4/14/1998’ ) GO
  • 163.
     Actualizando dados Actualizando registos com base nos dados da tabela  Actualizado registos com base noutras tabelas
  • 164.
    USE northwind UPDATE products SETunitprice = (unitprice * 1.1) GO Actualizando registos com base nos dados da tabela  Especifique os registros que serão actualizados com cláusula WHERE  Especifique os novos valores com a cláusula SET  Verifique se os valores inseridos têm tipos de dados compatíveis com os tipos de dados definidos para as colunas  O SQL Server não actualiza os registos que violam qualquer restrição de integridade
  • 165.
    Actualizando registos combase noutras tabelas  Como a instrução UPDATE funciona  Nunca actualiza o mesmo registo duas vezes  Requer prefixos de tabela em nomes de coluna ambíguos
  • 166.
    Actualizando registos combase noutras tabelas  Especificando registos para actualização usando associações  Usa a cláusula FROM USE northwind UPDATE products SET unitprice = unitprice + 2 FROM products INNER JOIN suppliers ON products.supplierid = suppliers.supplierid WHERE suppliers.country = ‘USA’ GO
  • 167.
    Actualizando registos combase noutras tabelas  Especificando registos para actualização usando subconsultas  Correlaciona a subconsulta com a tabela actualizada USE northwind UPDATE products SET unitprice = unitprice + 2 FROM products WHERE supplierid IN ( SELECT supplierid FROM suppliers WHERE country = ‘USA’ ) GO
  • 168.
    Considerações sobre odesempenho  Todas as modificações de dados ocorrem em uma transacção  Pode ocorrer a alocação de página de dados  A modificação de colunas de dados indexadas causa sobrecarga  A colocação de índices em colunas pode auxiliar nos critérios de pesquisa e melhorar o desempenho
  • 169.
    Práticas recomendadas Escreva sempreuma instrução SELECT que não modifique os dados antes de os modificar verdadeiramente Escreva sempre uma instrução SELECT que não modifique os dados antes de os modificar verdadeiramente Facilite a leitura dos conjuntos de resultados, alterando os nomes de coluna ou usando literais Facilite a leitura dos conjuntos de resultados, alterando os nomes de coluna ou usando literais Inclua sempre uma cláusula WHERE com as instruções DELETE e UPDATE Inclua sempre uma cláusula WHERE com as instruções DELETE e UPDATE
  • 170.
  • 171.
    Revisão  Usando transações Inserindo dados  Excluindo dados  Atualizando dados  Considerações sobre o desempenho
  • 172.
    Criação de tiposde dados e tabelas
  • 173.
    Visão geral  Criandotipos de dados  Criando tabelas  Gerando valores de colunas  Gerando scripts
  • 174.
     Criando tiposde dados  Tipos de dados fornecidos pelo sistema  Criando e eliminando tipos de dados definidos pelo utilizador  Directrizes para especificar tipos de dados
  • 175.
    Tipos de dadosfornecidos pelo sistema  Numérico  Inteiro  Numérico exacto  Numérico aproximado  Monetário  Data e hora  Carácter e carácter Unicode  Binário  Outros
  • 176.
    Criando e eliminandotipos de dados definidos pelo utilizador Eliminando Criando EXEC sp_addtype city, 'nvarchar(15)', NULL EXEC sp_addtype region, 'nvarchar(15)', NULL EXEC sp_addtype country, 'nvarchar(15)', NULL EXEC sp_droptype city
  • 177.
    Directrizes para especificartipos de dados  Se o comprimento da coluna variar, use um dos tipos de dados variáveis  Use tinyint de forma apropriada  Para tipos de dados numéricos, use decimal  Se o armazenamento for maior que 8000 bytes, use text ou image  Use o tipo de dado money para unidade monetária  Não use os tipos de dados aproximados float e real como chaves primárias
  • 178.
     Criando tabelas Como o SQL Server organiza dados em registos  Como o SQL Server organiza os tipos de dados text, ntext e image  Criando e eliminando uma tabela  Adicionando e eliminando uma coluna
  • 179.
    Como o SQLServer organiza dados em registos Cabeçalho Dados de tamanho fixo BN BV Dados de tamanho variável Bloco nulo Bloco variável 4 bytes Dados
  • 180.
    Como o SQLServer organiza os tipos de dados text, ntext e image Registo de dados Apontador de texto Estrutura raiz Nó intermediário Nó intermediário bloco 1 bloco 2 bloco 1 bloco 2
  • 181.
    DROP TABLE dbo.Categories Criando uma tabela  Eliminando uma tabela Criando e eliminando uma tabela Nome da coluna Tipo de dados NULL ou NOT NULL CREATE TABLE dbo.Categories (CategoryID CategoryName Description Picture es nvarchar(15) int IDENTITY (1,1) dbo.Categories nvarchar(15) ntext image NOT NULL, NOT NULL, NULL, NULL)
  • 182.
    Adicionando e eliminandouma coluna ALTER TABLE CategoriesNew ADD Commission money null ADICIONA R ALTER TABLE CategoriesNew DROP COLUMN Comission ELIMINAR Customer_name Sales_amount Sales_date Customer ID Commission
  • 183.
     Gerando valoresde colunas  Usando a propriedade Identity  Usando a função NEWID e o tipo de dados uniqueidentifier
  • 184.
    Usando a propriedadeIdentity  Requisitos para utilização da propriedade Identity  Somente uma coluna de identidade é permitida por tabela  Use com o tipo de dados integer, numeric ou decimal  Recuperando informações sobre a propriedade Identity  Use IDENT_SEED e IDENT_INCR para informações sobre definição  Use @@identity para determinar o valor mais recente  Gerindo a propriedade Identity
  • 185.
    Usando a funçãoNEWID e o tipo de dados uniqueidentifier  Esses recursos são usados em conjunto  Use valores globalmente exclusivos  Use com a restrição DEFAULT CREATE TABLE Customer (CustID uniqueidentifier NOT NULL DEFAULT NEWID(), CustName char(30) NOT NULL)
  • 186.
    Gerando scripts  Geraresquema como um script Transact-SQL  Manter um script de backup  Criar ou actualizar um script de desenvolvimento de banco de dados  Criar um ambiente de teste ou desenvolvimento  Treinar novos funcionários  O que gerar  Uma base de dados inteira num único ficheiro de script  Um esquema somente de tabelas  Um esquema de tabelas e índices
  • 187.
    Práticas recomendadas Especifique sempreas características das colunas em CREATE TABLE Especifique sempre as características das colunas em CREATE TABLE Gere um script para recriar a base de dados e os seus objectos Gere um script para recriar a base de dados e os seus objectos Especifique tipos de dados apropriados e tamanhos para os tipos de dados Especifique tipos de dados apropriados e tamanhos para os tipos de dados
  • 188.
    Laboratório A: Criandotipos de dados e tabelas
  • 189.
    Revisão  Criando tiposde dados  Criando tabelas  Gerando valores de colunas  Gerando scripts
  • 190.
  • 191.
    Visão geral  Tiposde integridade de dados  Impondo a integridade de dados  Definindo restrições  Tipos de restrições  Desactivando restrições  Usando padrões e regras  Decidindo que método de imposição usar
  • 192.
    Tipos de integridadede dados Integridade de domínio (colunas) Integridade de entidade (registos) Integridade referencial (entre tabelas)
  • 193.
    Impondo a integridadede dados  Integridade de dados declarativa  Critérios estabelecidos em definições de objecto  O SQL Server impõe automaticamente  Implemente a integridade declarativa usando restrições, padrões e regras  Integridade de dados procedimental  Critérios definidos em script  O script impõe  Implemente a integridade procedimental usando triggers e procedimentos armazenados
  • 194.
     Definindo restrições Determinando o tipo de restrição que será usado  Criando restrições  Considerações sobre o uso de restrições
  • 195.
    Determinando o tipode restrição que será usado Tipo de integridade Tipo de restrição Domínio DEFAULT CHECK REFERENTIAL Entidade PRIMARY KEY UNIQUE Referencial FOREIGN KEY CHECK
  • 196.
    Criando restrições  UseCREATE TABLE ou ALTER TABLE  É possível adicionar restrições a uma tabela com dados existentes  É possível colocar restrições numa única coluna ou em várias colunas  Única coluna, chamada de restrição em nível de coluna  Várias colunas, chamada de restrição em nível de tabela
  • 197.
    Considerações sobre ouso de restrições  Podem ser alteradas sem recriar uma tabela  Exigem verificação de erros em aplicações e transacções  Verificam dados existentes
  • 198.
     Tipos derestrições  Restrições DEFAULT  Restrições CHECK  Restrições PRIMARY KEY  Restrições UNIQUE  Restrições FOREIGN KEY  Integridade referencial em cascata
  • 199.
    Restrições DEFAULT  Aplicam-seapenas a instruções INSERT  Apenas uma restrição DEFAULT por coluna  Não podem ser usadas com a propriedade IDENTITY ou o tipo de dados rowversion  Permitem alguns valores fornecidos pelo sistema USE Northwind GO ALTER TABLE dbo.Customers ADD CONSTRAINT DF_contactname DEFAULT 'UNKNOWN' FOR ContactName GO
  • 200.
    Restrições CHECK  Sãousadas com as instruções INSERT e UPDATE  Podem fazer referência a outras colunas na mesma tabela  Não podem:  Ser usadas com o tipo de dados rowversion  Conter subconsultas USE Northwind GO ALTER TABLE dbo.Employees ADD CONSTRAINT CK_birthdate CHECK (BirthDate > '01-01-1900' AND BirthDate < getdate()) GO
  • 201.
    Restrições PRIMARY KEY Apenas uma restrição PRIMARY KEY por tabela  Os valores devem ser exclusivos  Não são permitidos valores nulos  Cria um índice exclusivo nas colunas especificadas USE Northwind GO ALTER TABLE dbo.Customers ADD CONSTRAINT PK_Customers PRIMARY KEY NONCLUSTERED (CustomerID) GO
  • 202.
    Restrições UNIQUE  Permitemum valor nulo  Permitem várias restrições UNIQUE numa tabela  Definidas com uma ou mais colunas  Impostas com um índice exclusivo USE Northwind GO ALTER TABLE dbo.Suppliers ADD CONSTRAINT U_CompanyName UNIQUE NONCLUSTERED (CompanyName) GO
  • 203.
    Restrições FOREIGN KEY Devem fazer referência a uma restrição PRIMARY KEY ou UNIQUE  Fornecem uma integridade referencial de uma ou várias colunas  Não criam índices automaticamente  Os utilizadores devem ter as permissões SELECT ou REFERENCES em tabelas referenciadas  Usam apenas uma cláusula REFERENCES na mesma tabela USE Northwind GO ALTER TABLE dbo.Orders ADD CONSTRAINT FK_Orders_Customers FOREIGN KEY (CustomerID) REFERENCES dbo.Customers(CustomerID) GO
  • 204.
    Integridade referencial emcascata EM CASCATA SEM ACÇÃO Customers INSERT new CustomerID CustomerID (PK) 1 Orders CustomerID (FK) UPDATE old CustomerID to new CustomerID 2 Customers CustomerID (PK) UPDATE CustomerID Orders CustomerID (FK) 1 EM CASCATA Customers DELETE old CustomerID CustomerID (PK) 3
  • 205.
     Desactivando restrições Desactivando a verificação de restrições nos dados existentes  Desactivando a verificação de restrições ao carregar novos dados
  • 206.
    Desactivando a verificaçãode restrições nos dados existentes  Só é possível desactivar as restrições CHECK e FOREIGN KEY  Use a opção WITH NOCHECK quando adicionar uma nova restrição  Use a opção WITH NOCHECK se dados existentes não forem alterados  É possível alterar dados existentes antes de adicionar restrições USE Northwind GO ALTER TABLE dbo.Employees WITH NOCHECK ADD CONSTRAINT FK_Employees_Employees FOREIGN KEY (ReportsTo) REFERENCES dbo.Employees(EmployeeID) GO
  • 207.
    Desactivando a verificaçãode restrições ao carregar novos dados  Só é possível desactivar as restrições CHECK e FOREIGN KEY  Use quando:  Os dados obedecem às restrições  O carregamento de novos dados não obedecem às restrições USE Northwind GO ALTER TABLE dbo.Employees NOCHECK CONSTRAINT FK_Employees_Employees GO
  • 208.
    Usando padrões eregras  Como os objectos independentes, eles:  São definidos uma vez  Podem ser ligados a uma ou mais colunas ou aos tipos de dados definidos pelo usuário USE Northwind GO CREATE DEFAULT phone_no_default AS '(000)000-0000' GO EXEC sp_bindefault phone_no_default, 'Customers.Phone' USE Northwind GO CREATE RULE regioncode_rule AS @regioncode IN ('IA', 'IL', 'KS', 'MO') GO EXEC sp_bindrule regioncode_rule, 'Customers.Region'
  • 209.
    Decidindo que métodode imposição usar Componente da integridade de dados Restrições Padrões e regras Triggers Funcionalidade Média Baixa Alta Sobrecarga Baixa Baixa Média-alta Antes ou depois da modificação Antes Antes Depois Tipos de dados, Nulos/Não nulos Baixa Baixa Antes
  • 210.
    Práticas recomendadas Use aintegridade referencial em cascata em vez de triggers Use a integridade referencial em cascata em vez de triggers Use restrições, pois estão em conformidade com o padrão ANSI Use restrições, pois estão em conformidade com o padrão ANSI
  • 211.
    Laboratório A: Implementandoa integridade de dados
  • 212.
    Revisão  Tipos deintegridade de dados  Impondo a integridade de dados  Definindo restrições  Tipos de restrições  Desativando restrições  Usando padrões e regras  Decidindo que método de imposição usar
  • 213.
  • 214.
    Visão geral  Exibindoo texto de um objecto de programação  Introdução às views  Vantagens das views  Criando views  Introdução aos procedimentos armazenados  Introdução aos triggers  Introdução às funções definidas pelo utilizador
  • 215.
    Exibindo o textode um objecto de programação  EXEC sp_helptext [ @objname = ] ‘nome’  Nem todo o objecto de programação possui texto associado USE library EXEC sp_helptext 'dbo.OverdueView' GO
  • 216.
    Introdução às views TitleView titleauthor Last of the Mohicans The Village Watch-Tower Poems James Fenimore Cooper Kate Douglas Wiggin Wilfred Owen View do utilizador USE library GO CREATE VIEW dbo.TitleView AS SELECT title, author FROM title GO title title_no title author synopsis 1 2 3 Last of the Mohicans The Village Watch-Tower Poems James Fenimore Cooper Kate Douglas Wiggin Wilfred Owen ~~~ ~~~ ~~~
  • 217.
    Vantagens das views Enfatizar os dados para os utilizadores  Enfatizar somente dados importantes ou apropriados  Limitar o acesso a dados confidenciais  Mascarar a complexidade da base de dados  Ocultar a complexidade da estrutura da base de dados  Simplificar consultas complexas, incluindo consultas distribuídas a dados heterogéneos  Simplificar a gestão de permissões dos utilizadores  Organizar dados a serem exportados para outras aplicações
  • 218.
     Criando views Definindo views  Restrições sobre a criação de views  Exemplo: exibindo informações de várias tabelas
  • 219.
    Definindo views USE library GO CREATEVIEW dbo.UnpaidFinesView (Member, TotalUnpaidFines) AS SELECT member_no, (sum(fine_assessed-fine_paid)) FROM loanhist GROUP BY member_no HAVING SUM(fine_assessed-fine_paid) > 0 GO USE library SELECT * FROM UnpaidFinesView GO Exemplo 1: Criando uma view Exemplo 2: Consultando uma view
  • 220.
    Restrições sobre acriação de views  Não podem fazer referência a mais de 1024 colunas  Não é possível incluir a cláusula COMPUTE ou COMPUTE BY  Não podem incluir as cláusulas ORDER BY, a menos que sejam usadas com a cláusula TOP na instrução SELECT  Não podem incluir a palavra-chave INTO  Não podem fazer referência a tabelas temporárias  Não podem ser combinadas com outras instruções Transact-SQL num único lote
  • 221.
    lastname Thomas Funk firstname Gary Frank Birth_Date 92.01.16 84.01.18 member_no 12 13 adult_no 11 6 birth_date 1992-01-16 00:00:00.000 1984-01-18 00:00:00.000 Exemplo:exibindo informações de várias tabelas member juvenile BirthdayView USE library GO CREATE VIEW dbo.birthdayview (lastname, firstname, birth_date) AS SELECT lastname, firstname ,CONVERT(char(8), birth_date, 2) FROM member INNER JOIN juvenile ON member.member_no = juvenile.member_no GO member_no 11 12 13 14 lastname Thomas Thomas Funk Rudd firstname Gary Clair Frank Clair middleinitial ~~~ ~~~ ~~~ ~~~ photograph ~~~ ~~~ ~~~ ~~~
  • 222.
    SP - StoredProcedures  Definindo procedimentos armazenados  Vantagens do uso de procedimentos armazenados  Introdução aos procedimentos armazenados
  • 223.
    Definindo procedimentos armazenados Um procedimento armazenado é uma colecção definida de instruções Transact-SQL  Um procedimento armazenado encapsula tarefas repetitivas  Os procedimentos armazenados podem:  Conter instruções que executam operações  Aceitar parâmetros de entrada  Retornar um valor de status para indicar um êxito ou uma falha  Retornar vários parâmetros de saída
  • 224.
    Vantagens do usode procedimentos armazenados  Partilhar a lógica da aplicação  Proteger detalhes das tabelas da base de dados  Fornecer mecanismos de segurança  Melhorar o desempenho  Reduzir o tráfego de rede
  • 225.
    Introdução aos triggers Um trigger é um tipo especial de procedimento armazenado  Um trigger é:  Associado a uma tabela  Chamado automaticamente  Não é chamado directamente  Tratado como parte da transacção que o accionou
  • 226.
     Introdução àsfunções definidas pelo utilizador UDF - User Defined Functions  O que é uma função definida pelo utilizador?  Criando uma função definida pelo utilizador
  • 227.
    O que éuma função definida pelo utilizador?  Funções escalares  Similares a uma função interna  Retornam um valor de dados único do tipo definido por uma série de instruções  Funções com valores de tabela de várias instruções  Semelhante a um procedimento armazenado  Mencionada como se fosse uma view  Funções com valores de tabela em linha  Retorna uma tabela que é resultado de uma única instrução SELECT  Semelhante a uma view com parâmetros
  • 228.
     Criando umafunção definida pelo utilizador  Restrições quanto ao uso de funções definidas pelo utilizador Criando uma função definida pelo utilizador USE northwind GO CREATE FUNCTION fn_NewRegion ( @myinput nvarchar(30) ) RETURNS nvarchar(30) BEGIN IF @myinput IS NULL SET @myinput = 'Not Applicable‘ RETURN @myinput END GO
  • 229.
    Práticas recomendadas Verifique asdefinições de objecto exibindo o texto com o procedimento armazenado do sistema EXEC sp_helptext Verifique as definições de objecto exibindo o texto com o procedimento armazenado do sistema EXEC sp_helptext Use as views para capturar e reutilizar consultas Use as views para capturar e reutilizar consultas Use procedimentos armazenados para encapsular procedimentos complexos Use procedimentos armazenados para encapsular procedimentos complexos Use funções definidas pelo utilizador para encapsular expressões Use funções definidas pelo utilizador para encapsular expressões
  • 230.
  • 231.
    Revisão  Exibindo otexto de um objeto de programação  Introdução às views  Vantagens das views  Criando views  Introdução a procedimentos armazenados  Introdução a disparadores  Introdução a funções definidas pelo usuário
  • 232.
  • 233.
    Visão geral  Introduçãoàs views  Vantagens das views  Definindo views  Modificando dados através de views  Optimizando o desempenho com o uso de views
  • 234.
    Introdução às views EmployeeView LastnameFirstname Davolio Fuller Leverling Nancy Andrew Janet Employees EmployeeID LastName Firstname Title 1 2 3 Davolio Fuller Leverling Nancy Andrew Janet ~~~ ~~~ ~~~ View de utilizador USE Northwind GO CREATE VIEW dbo.EmployeeView AS SELECT LastName, Firstname FROM Employees
  • 235.
    Vantagens das views Focalizar os dados para os utilizadores  Focalizar somente em dados importantes ou apropriados  Limitar o acesso a dados confidenciais  Mascarar a complexidade da base de dados  Ocultar estruturas complexas da base de dados  Simplificar consultas complexas, incluindo consultas distribuídas para dados heterogéneos  Simplificar a gestão de permissões dos utilizadores  Melhorar o desempenho  Organizar dados para serem exportados para outras aplicações
  • 236.
     Definindo views Criando views  Exemplo: View de tabelas associadas  Alterando e eliminando views  Localizando informações sobre definições de views  Ocultando definições de views
  • 237.
    Criando views  Criandouma view  Restrições às definições de views  Não pode incluir a instrução ORDER BY  Não pode incluir a palavra-chave INTO 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
  • 238.
    Exemplo: View detabelas associadas OrderID 10663 10827 10427 10451 10515 CustomerID BONAP BONAP PICCO QUICK QUICK ~~~ ~~~ ~~~ ~~~ ~~~ q RequiredDate 1997-09-24 1998-01-26 1997-02-24 1997-03-05 1997-05-07 pp ShippedDate 1997-10-03 1998-02-06 1997-03-03 1997-03-12 1997-05-23 Orders Customers ShipStatusView 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 CustomerID BONAP PICCO QUICK p y CompanyName Bon app' Piccolo und mehr QUICK-Stop ContactName Laurence Lebihan Georg Pipps Horst Kloss OrderID 10264 10271 10280 1996-08-21 1996-08-29 1996-09-11 pp ShippedDate 1996-08-23 1996-08-30 1996-09-12 ContactName Maria Larsson Art Braunschweiger Christina Berglund
  • 239.
    Alterando e eliminandoviews  Alterando views  Mantém permissões atribuídas  Faz com que as novas opções e instrução SELECT substituam a definição existente  Eliminando views USE Northwind GO ALTER VIEW dbo.EmployeeView AS SELECT LastName, FirstName, Extension FROM Employees DROP VIEW dbo.ShipStatusView
  • 240.
    Localizando informações sobredefinições de views  Localizando definições de views  Não disponível se a view foi criada com a opção WITH ENCRYPTION  Localizando dependências de views  Lista objectos dos quais a view depende  Lista objectos que dependem de uma view
  • 241.
    Localizando definições deviews  Nomes de views INFORMATION_SCHEMA.TABLES ou sysobjects (objectos do sistema)  Nomes de objetos base INFORMATION_SCHEMA.VIEW_TABLE_USAGE ou sysdepends (dependências do sistema)  Definição de views INFORMATION_SCHEMA.VIEWS ou syscomments (comentários do sistema)  Colunas que estão definidas numa view INFORMATION_SCHEMA.VIEW_COLUMN_USAGE ou syscolumns (colunas do sistema)  sp_helptext nome_do objecto
  • 242.
    Localizando dependências deviews  sp_depends nome_do_objecto
  • 243.
    Ocultando definições deviews  Usar a opção WITH ENCRYPTION  Não excluir entradas da tabela syscomments USE Northwind GO CREATE VIEW dbo.[Order Subtotals View] WITH ENCRYPTION AS SELECT OrderID, Sum(CONVERT(money,(UnitPrice*Quantity*(1-Discount)/100))*100) AS Subtotal FROM [Order Details] GROUP BY OrderID
  • 244.
    Modificando dados atravésde views  Não podem afectar mais de uma tabela subjacente  Não podem ser feitas em certas colunas  Poderão ocasionar erros se afectarem colunas às quais a view não faz referência  Serão verificadas se a opção WITH CHECK OPTION tiver sido especificada na definição da view
  • 245.
     Optimizando odesempenho com o uso de views  Considerações sobre o desempenho  Usando views indexadas
  • 246.
    Considerações sobre odesempenho USE Northwind GO CREATE VIEW dbo.TopSalesView AS SELECT * FROM dbo.TotalPurchaseView WHERE Subtotal > 50000 GO TotalPurchaseView 1 ~ ~ ~ ~ 2 ~ ~ ~ ~ 3 ~ ~ ~ ~ 4 ~ ~ ~ ~ 5 ~ ~ ~ ~ 6 ~ ~ ~ ~ Customers Customers 1 ~ ~ ~ n 2 ~ ~ ~ n 3 ~ ~ ~ y 4 ~ ~ ~ y 5 ~ ~ ~ n 6 ~ ~ ~ y Orders Orders 1 ~ ~ ~ n 2 ~ ~ ~ n 3 ~ ~ ~ y 4 ~ ~ ~ y 5 ~ ~ ~ n 6 ~ ~ ~ y Order Details Order Details 1 ~ ~ ~ ~ 2 ~ ~ ~ ~ 3 ~ ~ ~ ~ 4 ~ ~ ~ ~ 5 ~ ~ ~ ~ 6 ~ ~ ~ ~ SELECT * FROM dbo.TopSalesView WHERE CompanyName = 'Ernst Handel' TopSalesView ~ ~ ~ ~ ~ ~ ~ ~ ~
  • 247.
    Usando views indexadas Views indexadas armazenam conjuntos de resultados na base de dados  Criando uma view indexada  Directrizes para a criação de views indexadas Crie views indexadas quando:  A melhoria de desempenho compensa o maior custo de manutenção  Os dados subjacentes não são actualizados com frequência  As consultas executam uma quantidade significativa de associações e agregações  Restrições à criação de views indexadas
  • 248.
    Práticas recomendadas Especifique dbocomo o proprietário quando criar views Especifique dbo como o proprietário quando criar views Verifique as dependências dos objectos antes de os eliminar Verifique as dependências dos objectos antes de os eliminar Avalie cuidadosamente se deve criar views baseadas em views Avalie cuidadosamente se deve criar views baseadas em views Nunca exclua entradas da tabela do sistema syscomments Nunca exclua entradas da tabela do sistema syscomments Deve desenvolver uma convenção de nomeação consistente Deve desenvolver uma convenção de nomeação consistente
  • 249.
  • 250.
     Introdução aosprocedimentos armazenados  Criando, executando e modificando procedimentos armazenados  Usando parâmetros em procedimentos armazenados  Tratando mensagens de erro  Considerações sobre o desempenho Visão geral
  • 251.
     Definindo procedimentosarmazenados  Processamento inicial de procedimentos armazenados  Processamento subsequente de procedimentos armazenados  Vantagens dos procedimentos armazenados  Introdução a procedimentos armazenados
  • 252.
    Definindo procedimentos armazenados Colecções nomeadas de instruções Transact-SQL  Encapsulamento de tarefas repetitivas  Cinco tipos (sistema, local, temporário, remoto e estendido)  Aceitam parâmetros de entrada e retornam valores  Retornam um valor de status para indicar um êxito ou uma falha
  • 253.
    Processamento inicial deprocedimentos armazenados Entradas nas tabelas sysobjects e syscomments Plano compilado colocado na cache de procedimentos Compilação Optimização Criação Execução (primeira vez ou recompilação) Análise
  • 254.
    Processamento subsequente deprocedimentos armazenados Plano de consulta Contexto de execução Conexão 1 8082 Conexão 2 Conexão 3 24 1003 Plano de execução recuperado O plano não utilizado é removido SELECT * FROM dbo.member WHERE member_no = ?
  • 255.
    Vantagens dos procedimentosarmazenados  Partilham a lógica da aplicação  Protegem os detalhes das tabelas da base de dados  Fornecem mecanismos de segurança  Melhoram o desempenho  Reduzem o tráfego de rede
  • 256.
     Criando, executandoe modificando procedimentos armazenados  Criando procedimentos armazenados  Directrizes para a criação de procedimentos armazenados  Executando procedimentos armazenados  Alterando e eliminando procedimentos armazenados
  • 257.
    Criando procedimentos armazenados Criados na base de dados actual com a instrução CREATE PROCEDURE   Podem ser encadeados até 32 níveis  Use sp_help para exibir informações USE Northwind GO CREATE PROC dbo.OverdueOrders AS SELECT * FROM dbo.Orders WHERE RequiredDate < GETDATE() AND ShippedDate IS Null GO
  • 258.
    Directrizes para acriação de procedimentos armazenados  Utilizador dbo deve ser proprietário de todos os procedimentos armazenados  Um procedimento armazenado para uma única tarefa  Crie, teste e depure  Evite usar o prefixo sp_ ao atribuir nomes a procedimentos armazenados  Todos os procedimentos armazenados devem assumir as mesmas configurações de conexão  Minimize o uso de procedimentos armazenados temporários  Use sp_executesql em vez de EXECUTE  Nunca exclua entradas directamente da tabela do syscomments
  • 259.
    Executando procedimentos armazenados Executando um procedimento armazenado isoladamente  Executando um procedimento armazenado em uma instrução INSERT EXEC OverdueOrders INSERT INTO Customers EXEC EmployeeCustomer
  • 260.
    Alterando e eliminandoprocedimentos armazenados  Alterando procedimentos armazenados  Inclua quaisquer opções em ALTER PROCEDURE  Não afecta os procedimentos armazenados encadeados   Eliminando procedimentos armazenados  Execute o procedimento armazenado sp_depends para determinar se os objectos dependem do procedimento USE Northwind GO ALTER PROC dbo.OverdueOrders AS SELECT CONVERT(char(8), RequiredDate, 1) RequiredDate, CONVERT(char(8), OrderDate, 1) OrderDate, OrderID, CustomerID, EmployeeID FROM Orders WHERE RequiredDate < GETDATE() AND ShippedDate IS Null ORDER BY RequiredDate GO
  • 261.
     Usando parâmetrosnos procedimentos armazenados  Usando parâmetros de entrada  Executando procedimentos armazenados com parâmetros de entrada  Retornando valores com parâmetros de saída
  • 262.
    Usando parâmetros deentrada  Valide todos os valores de parâmetros de entrada primeiro  Forneça valores padrão apropriados e inclua verificações NULL CREATE PROCEDURE dbo.[Year to Year Sales] @BeginningDate DateTime, @EndingDate DateTime AS IF @BeginningDate IS NULL OR @EndingDate IS NULL BEGIN RAISERROR('NULL values are not allowed', 14, 1) RETURN END SELECT O.ShippedDate, O.OrderID, OS.Subtotal, DATENAME(yy,ShippedDate) AS Year FROM ORDERS O INNER JOIN [Order Subtotals] OS ON O.OrderID = OS.OrderID WHERE O.ShippedDate BETWEEN @BeginningDate AND @EndingDate GO
  • 263.
    Executando procedimentos armazenadoscom parâmetros de entrada  Passando valores por nome de parâmetro  Passando valores por posição EXEC AddCustomer 'ALFKI2', 'Alfreds Futterkiste', 'Maria Anders', 'Sales Representative', 'Obere Str. 57', 'Berlin', NULL, '12209', 'Germany', '030-0074321' 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'
  • 264.
    Retornando valores comparâmetros de saída CREATE PROCEDURE dbo.MathTutor @m1 smallint, @m2 smallint, @result smallint OUTPUT AS SET @result = @m1* @m2 GO DECLARE @answer smallint EXECUTE MathTutor 5,6, @answer OUTPUT SELECT 'The result is:', @answer The result is: 30 Resultados do Resultados do procedimento armazenado Executando o Executando o procedimento armazenado Criando o Criando o procedimento armazenado
  • 265.
    Tratando mensagens deerro  A instrução RETURN sai da consulta ou do procedimento de modo não condicional  sp_addmessage cria mensagens de erro personalizadas  @@error contém o número do erro da última instrução executada  Instrução RAISERROR  Retorna uma mensagem de erro do sistema ou definida pelo usuário  Define um sinalizador do sistema para registrar um erro
  • 266.
  • 267.
    Considerações sobre odesempenho  System Monitor do Windows 2000  Objecto: SQL Server: Cache Manager  Objecto: SQL Statistics  SQL Profiler  Permite monitorar eventos  É possível testar cada instrução do procedimento armazenado
  • 268.
    Práticas recomendadas Crie cadaprocedimento armazenado para realizar uma única tarefa Crie cada procedimento armazenado para realizar uma única tarefa Valide os dados antes de iniciar as transacções. Valide os dados antes de iniciar as transacções. Verifique os parâmetros de entrada Verifique os parâmetros de entrada Use as mesmas configurações de conexão para todos os procedimentos armazenados Use as mesmas configurações de conexão para todos os procedimentos armazenados Para ocultar o texto de procedimentos armazenados, use a opção WITH ENCRYPTION Para ocultar o texto de procedimentos armazenados, use a opção WITH ENCRYPTION
  • 269.
  • 270.
    Visão geral  Oque é uma função definida pelo utilizador?  Estabelecendo funções definidas pelo utilizador  Exemplos de funções definidas pelo utilizador
  • 271.
    O que éuma função definida pelo utilizador?  Funções escalares  Semelhantes a funções internas  Funções com valor de tabela e várias instruções  Conteúdo semelhante a um procedimento armazenado  Referenciadas como uma view  Funções com valor de tabela in-line  Semelhante a uma view com parâmetros  Retorna uma tabela como o resultado de uma única instrução SELECT
  • 272.
     Estabelecendo funçõesdefinidas pelo utilizador  Criando uma função definida pelo utilizador  Criando uma função com vinculação de esquemas  Definindo permissões para funções definidas pelo utilizador  Alterando e descartando funções definidas pelo utilizador
  • 273.
     Criando umafunção  Restrições às funções Criando uma função definida pelo utilizador USE Northwind GO CREATE FUNCTION fn_NewRegion (@myinput nvarchar(30)) RETURNS nvarchar(30) BEGIN IF @myinput IS NULL SET @myinput = 'Not Applicable' RETURN @myinput END
  • 274.
    Criando uma funçãocom vinculação de esquemas  As funções definidas pelo utilizador e views às quais a função faz referência também são vinculadas a esquema  Os objectos não são referenciados com um nome de duas partes  A função e os objectos pertencem à mesma base de dados  Ter a permissão REFERENCE em objectos necessários
  • 275.
    Definindo permissões parafunções definidas pelo utilizador  Permissão CREATE FUNCTION necessária  Permissão EXECUTE necessária  Permissão REFERENCE necessária em tabelas, views ou funções às quais ela faz referência  O proprietário da tabela também deve ser proprietário da função para usá-la na instrução CREATE TABLE ou ALTER TABLE
  • 276.
    Alterando e eliminandofunções definidas pelo utilizador  Alterando funções  Mantém permissões atribuídas  Faz com que a nova definição de função substitua a definição existente  Eliminando funções ALTER FUNCTION dbo.fn_NewRegion <Novo conteúdo de função> DROP FUNCTION dbo.fn_NewRegion
  • 277.
     Exemplos defunções definidas pelo utilizador  Usando uma função escalar definida pelo utilizador  Exemplo de uma função escalar definida pelo utilizador  Usando uma função com valor de tabela e várias instruções  Exemplo de função com valor de tabela e várias instruções  Usando uma função com valor de tabela in-line  Exemplo de uma função com valor de tabela in-line
  • 278.
    Usando uma funçãoescalar definida pelo utilizador  A cláusula RETURNS especifica o tipo de dados  A função é definida em um bloco BEGIN...END  O tipo de retorno poderá ser qualquer tipo de dado, excepto text, ntext, image, cursor ou timestamp
  • 279.
     Criando afunção  Chamando a função Exemplo de uma função escalar definida pelo utilizador 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 SELECT dbo.fn_DateFormat(GETDATE(), ':')
  • 280.
    Usando uma funçãocom valor de tabela e várias instruções  BEGIN e END delimitam o corpo da função  A cláusula RETURNS especifica table como o tipo de dados  A cláusula RETURNS define o nome e o formato da tabela
  • 281.
    Exemplo de funçãocom valor de tabela e várias instruções  Criando a função  Chamando a função USE Northwind GO CREATE FUNCTION fn_Employees (@length nvarchar(9)) RETURNS @fn_Employees table (EmployeeID int PRIMARY KEY NOT NULL, [Employee Name] nvarchar(61) NOT NULL) AS BEGIN IF @length = 'ShortName' INSERT @fn_Employees SELECT EmployeeID, LastName FROM Employees ELSE IF @length = 'LongName' INSERT @fn_Employees SELECT EmployeeID, (FirstName + ' ' + LastName) FROM Employees RETURN END SELECT * FROM dbo.fn_Employees('LongName') Ou SELECT * FROM dbo.fn_Employees('ShortName')
  • 282.
    Usando uma funçãocom valor de tabela in-line  O conteúdo da função é uma instrução SELECT  Não use BEGIN e END  RETURN especifica table como o tipo de dados  O formato é definido pelo conjunto de resultados
  • 283.
    Exemplo de umafunção com valor de tabela in-line  Criando a função  Chamando a função usando um parâmetro USE Northwind GO CREATE FUNCTION fn_CustomerNamesInRegion ( @RegionParameter nvarchar(30) ) RETURNS table AS RETURN ( SELECT CustomerID, CompanyName FROM Northwind.dbo.Customers WHERE Region = @RegionParameter ) SELECT * FROM fn_CustomerNamesInRegion(N'WA')
  • 284.
    Práticas recomendadas Use funçõesde várias instruções em vez de procedimentos armazenados que retornam tabelas Use funções de várias instruções em vez de procedimentos armazenados que retornam tabelas Use funções in-line para filtrar views indexadas Use funções in-line para filtrar views indexadas Use funções escalares complexas em conjuntos de resultados pequenos Use funções escalares complexas em conjuntos de resultados pequenos Use funções in-line para criar views usando parâmetros Use funções in-line para criar views usando parâmetros
  • 285.
  • 286.
    Visão geral  Introduçãoaos triggers  Definindo triggers  Como funcionam os triggers  Exemplos de triggers  Considerações sobre o desempenho
  • 287.
     Introdução aostriggers  O que são triggers?  Utilizações de triggers  Considerações sobre o uso de triggers
  • 288.
    O que sãotriggers?  Associados a uma tabela  Chamados automaticamente  Não podem ser chamados directamente  São parte de uma transacção
  • 289.
    Utilizações de triggers Alterações em cascata em tabelas relacionadas duma base de dados  Impor uma integridade de dados mais complexa do que uma restrição CHECK  Definir mensagens de erro personalizadas  Manter dados desnormalizados  Comparar os estados anteriores e posteriores dos dados que estão a ser modificados
  • 290.
    Considerações sobre ouso de triggers  Os triggers são reactivos; as restrições são pró-activas  As restrições são verificadas primeiro  As tabelas podem conter vários triggers para uma acção  Os proprietários das tabelas podem designar o primeiro e o último trigger a ser accionado  Os proprietários das tabelas devem ter permissão para executar todas as instruções definidas pelo trigger  Os proprietários das tabelas não podem criar triggers AFTER em views ou tabelas temporárias
  • 291.
     Definindo triggers Criando triggers  Alterando e eliminando triggers
  • 292.
    Criando triggers  Requerpermissões apropriadas  Não pode conter certas instruções 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
  • 293.
    Alterando e eliminandotriggers  Alterando um trigger  Altera a definição sem eliminar o trigger  Desactivando ou activando um trigger   Eliminando um trigger USE Northwind GO ALTER TRIGGER Empl_Delete ON Employees FOR DELETE AS IF (SELECT COUNT(*) FROM Deleted) > 6 BEGIN RAISERROR( 'You cannot delete more than six employees at a time.', 16, 1) ROLLBACK TRANSACTION END
  • 294.
     Como funcionamos triggers  Como funciona um trigger INSERT  Como funciona um trigger DELETE  Como funciona um trigger UPDATE  Como funciona um trigger INSTEAD OF  Como funcionam os triggers encadeados  Triggers recursivos
  • 295.
    Como funciona umtrigger INSERT Instrução INSERT para uma tabela com um trigger INSERT definido INSERT [Order Details] VALUES (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice 31.00 9.65 30.00 Quantity 7 9 24 Discount 0.2 0.15 0.0 Instrução INSERT registada inserted 10525 2 19.00 5 0.2 5 19.00 2 0.2 10525 As acções de TRIGGER são executadas Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice 31.00 9.65 30.00 Quantity 7 9 24 Discount 0.2 0.15 0.0 5 19.00 2 0.2 10523 Trigger Code: USE Northwind CREATE TRIGGER OrdDet_Insert ON [Order Details] FOR INSERT AS UPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity) FROM Products AS P INNER JOIN Inserted AS I ON P.ProductID = I.ProductID Produtos ProductID UnitsInStock … … 1 2 3 4 15 10 65 20 2 15 UPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity) FROM Products AS P INNER JOIN Inserted AS I ON P.ProductID = I.ProductID Instrução INSERT para uma tabela com um trigger INSERT definido Instrução INSERT registada Acções de trigger executadas 1 2 3
  • 296.
    Como funciona umtrigger DELETE Instrução DELETE para uma tabela com um trigger DELETE definido Deleted 4 Dairy Products Cheeses 0x15… Instrução DELETE registada Categories CategoryID 1 2 3 CategoryName Beverages Condiments Confections Description Soft drinks, coffees… Sweet and savory … Desserts, candies, … Picture 0x15… 0x15… 0x15… 0x15… Cheeses Dairy Products 4 DELETE Categories WHERE CategoryID = 4 USE Northwind CREATE TRIGGER Category_Delete ON Categories FOR DELETE AS UPDATE P SET Discontinued = 1 FROM Products AS P INNER JOIN deleted AS d ON P.CategoryID = d.CategoryID Acções do trigger executadas Products ProductID Discontinued … … 1 2 3 4 0 0 0 0 2 1 UPDATE P SET Discontinued = 1 FROM Products AS P INNER JOIN deleted AS d ON P.CategoryID = d.CategoryID Instrução DELETE para uma tabela com um trigger DELETE definido Instrução DELETE registada Acções do trigger executadas 1 2 3
  • 297.
    Como funciona umtrigger UPDATE Instrução UPDATE para uma tabela com um trigger UPDATE definido UPDATE Employees SET EmployeeID = 17 WHERE EmployeeID = 2 Instrução UPDATE registada como INSERT e instruções DELETE inserted 17 Fuller Andrew Vice Pres. ~~~ deleted 2 Fuller Andrew Vice Pres. ~~~ Employees EmployeeID LastName FirstName FirstName Title HireDate 1 2 3 4 Davolio Barr Leverling Peacock et Nancy Andrew Janet Margaret . . . Sales Rep. R Sales Rep. Sales Rep. ~~~ ~~~ ~~~ ~~~ 2 Fuller Andrew Vice Pres. ~~~ As acções de TRIGGER são executadas USE Northwind GO CREATE TRIGGER Employee_Update ON Employees FOR UPDATE AS IF UPDATE (EmployeeID) BEGIN TRANSACTION RAISERROR ('Transaction cannot be processed. ***** Employee ID number cannot be modified.', 10, 1) ROLLBACK TRANSACTION AS IF UPDATE (EmployeeID) BEGIN TRANSACTION RAISERROR ('Transaction cannot be processed. ***** Employee ID number cannot be modified.', 10, 1) ROLLBACK TRANSACTION Transaction cannot be processed. ***** Member number cannot be modified Employees EmployeeID LastName FirstName FirstName Title HireDate 1 2 3 4 Davolio Barr Leverling Peacock et Nancy Andrew Janet Margaret . . . Sales Rep. R Sales Rep. Sales Rep. ~~~ ~~~ ~~~ ~~~ 2 Fuller Andrew Vice Pres. ~~~ Instrução UPDATE para uma tabela com um trigger UPDATE definido Instrução UPDATE registada com instruções INSERT e DELETE Acções do trigger executadas 1 2 3
  • 298.
    Como funciona umtrigger INSTEAD OF Crie uma view que combine duas ou mais tabelas CREATE VIEW Customers AS SELECT * FROM CustomersMex UNION SELECT * FROM CustomersGer CustomersMex CustomerID CompanyName CompanyName Country Phone … ANATR ANTON CENTC Ana Trujill… Antonio M… Centro Co… Mexico Mexico Mexico (5) 555-4729 (5) 555-3932 (5) 555-3392 ~~~ ~~~ ~~~ CustomersGer CustomerID CompanyName CompanyName Country Phone … ALFKI BLAUS DRACD Alfreds Fu… Blauer Se… Drachenb… Germany Germany Germany 030-0074321 0621-08460 0241-039123 ~~~ ~~~ ~~~ O trigger INSTEAD OF direcciona a actualização para a tabela base Customers CustomerID CompanyName CompanyName Country Phone … ALFKI ANATR ANTON Alfreds Fu… Ana Trujill… Antonio M… Germany Mexico Mexico 030-0074321 (5) 555-4729 (5) 555-3932 ~~~ ~~~ ~~~ A inserção original na view Customers não ocorre UPDATE é feito para a view ALFKI Alfreds Fu… Germany 030-0074321 ~~~ ALFKI Alfreds Fu… Germany 030-0074321 ~~~ O trigger INSTEAD OF pode estar numa tabela ou view A acção que inicia o trigger NÃO ocorre Permite actualizações em views não actualizáveis anteriormente 1 2 3
  • 299.
    Como funcionam ostriggers encadeados UnitsInStock + UnitsOnOrder é < ReorderLevel para ProductID 2 OrDe_Update Colocar uma ordem faz com que o trigger OrDe_Update seja executado Executa uma instrução UPDATE na tabela Products InStock_Update Products ProductID UnitsInStock … … 1 3 4 15 10 65 20 O trigger InStock_Update é executado Envia mensagem Order_Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice 31.00 9.65 30.00 Quantity 7 9 24 Discount 0.2 0.15 0.0 10525 19.00 2 0.2 5 2 15
  • 300.
    Triggers recursivos  Activandoum trigger de modo recursivo  Tipos de triggers recursivos  Recursividade directa ocorre quando um trigger acciona e executa uma acção que faz com que o mesmo trigger seja accionado novamente  Recursividade indirecta ocorre quando um trigger acciona e executa uma acção que faz com que um trigger noutra tabela seja accionado  Determinando se triggers recursivos devem ou não ser usados
  • 301.
     Exemplos detriggers  Impondo a integridade dos dados  Impondo regras de negócios
  • 302.
    Impondo a integridadedos dados 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 Products ProductID UnitsInStock … … 1 3 4 15 10 65 20 2 15 Actualizado BackOrders ProductID UnitsOnOrder … 1 12 3 15 10 65 2 15 O trigger O trigger exclui o registro
  • 303.
    Products ProductID UnitsInStock …… 1 3 4 15 10 65 20 Impondo regras de negócios Os produtos com pedidos importantes não podem ser excluídos A instrução DELETE é executada na tabela Product O código do trigger verifica a tabela Order Details Order Details OrderID 10522 10523 10524 10525 ProductID 10 2 41 7 UnitPrice 31.00 19.00 9.65 30.00 Quantity 7 9 24 Discount 0.2 0.15 0.0 9 A transacção é revertida Products ProductID UnitsInStock … … 1 2 3 4 15 10 65 20 2 0 IF (Select Count (*) FROM [Order Details] INNER JOIN deleted ON [Order Details].ProductID = Deleted.ProductID ) > 0 ROLLBACK TRANSACTION 'Transaction cannot be processed' 'This product has order history.'
  • 304.
    Considerações sobre odesempenho  Os triggers funcionam com rapidez, pois as tabelas Inserted e Deleted encontram-se na cache  O tempo de execução é determinado pelo:  Número de tabelas referenciadas  Número de registos afectados  As acções contidas nos triggers consistem numa parte implícita de uma transacção
  • 305.
    Práticas recomendadas Mantenha asinstruções da definição do trigger o mais simples possível Mantenha as instruções da definição do trigger o mais simples possível Minimize o uso de instruções ROLLBACK nos triggers Minimize o uso de instruções ROLLBACK nos triggers Use triggers somente quando necessário Use triggers somente quando necessário Inclua instruções de verificação de fim da recursividade nas definições de triggers recursivos Inclua instruções de verificação de fim da recursividade nas definições de triggers recursivos