Escolar Documentos
Profissional Documentos
Cultura Documentos
SQL Server Express 2005 - Conceitos Básicos PDF
SQL Server Express 2005 - Conceitos Básicos PDF
2
Sintaxe Bsica........................................................................................................................................................ 39
Selecionando Registros Especficos .............................................................................................................. 39
Atualizando Registros Especficos ................................................................................................................ 39
A Clusula WHERE Com os Operadores AND e OR................................................................................. 40
A clusula WHERE com o operador IN ........................................................................................................ 40
A Clusula WHERE Com os Operadores NOT IN ..................................................................................... 41
A Clusula WHERE Com o Operador BETWEEN ..................................................................................... 41
A Clusula WHERE Com os Operadores NOT BETWEEN..................................................................... 42
A Clusula WHERE Com o Operador LIKE ................................................................................................. 43
A Clusula WHERE Com os Operadores NOT LIKE ................................................................................ 44
Exerccios ................................................................................................................................................................ 45
Laboratrio ............................................................................................................................................................ 46
Captulo 6 .................................................................................................................................................................... 47
A Clusula ORDER BY ......................................................................................................................................... 47
Ordenando Por Colunas .................................................................................................................................... 47
Ordenando Por Mais de Uma Coluna ........................................................................................................... 48
ORDER BY ASC e DESC....................................................................................................................................... 48
ASC e DESC ............................................................................................................................................................. 49
A Clusula TOP ...................................................................................................................................................... 49
A Clusula TOP Com ORDER BY ..................................................................................................................... 50
A Clusula TOP WITH TIES Com ORDER BY ............................................................................................. 51
Exerccios ................................................................................................................................................................ 52
Laboratrio ............................................................................................................................................................ 53
Captulo 7 .................................................................................................................................................................... 54
Integridade E Consistncia - Parte 1 ............................................................................................................ 54
CONSTRAINTS....................................................................................................................................................... 54
Chaves Primrias (PRIMARY KEY) ............................................................................................................... 54
Chaves Secundrias ou nicas (UNIQUE) .................................................................................................. 56
Chave Estrangeira (FOREIGN KEY / REFERENCES) .............................................................................. 56
Regras de Validao (CHECK) ......................................................................................................................... 57
Valor Padro (DEFAULT).................................................................................................................................. 58
Valores NULL ......................................................................................................................................................... 59
Regras de constraints ......................................................................................................................................... 60
Criando Tabelas Com Todas as Regras de Integridade e Consistncia ........................................... 60
3
Modelo Entidade - Relacionamento (MER) ............................................................................................... 62
Relacionamento .................................................................................................................................................... 62
Relacionamento 1 : 1 ...................................................................................................................................... 63
Relacionamento 1 : N ..................................................................................................................................... 63
Relacionamento N : N..................................................................................................................................... 64
Exerccios ................................................................................................................................................................ 67
Laboratrio ............................................................................................................................................................ 68
Captulo 8 .................................................................................................................................................................... 79
Associando tabelas .............................................................................................................................................. 79
JOIN ........................................................................................................................................................................... 79
INNER JOIN ........................................................................................................................................................ 80
LEFT JOIN ........................................................................................................................................................... 81
RIGHT JOIN ........................................................................................................................................................ 81
Associando Mais de Duas Tabelas............................................................................................................. 82
FULL OUTER JOIN ........................................................................................................................................... 83
CROSS JOIN ........................................................................................................................................................ 83
Os Comandos UPDATE e DELETE Com Utilizao do JOIN ................................................................. 84
Exerccios ................................................................................................................................................................ 87
Laboratrio ............................................................................................................................................................ 88
Captulo 9 .................................................................................................................................................................... 90
UNION ALL ............................................................................................................................................................. 90
Regras de Utilizao ....................................................................................................................................... 91
Subquery ................................................................................................................................................................. 91
Formatos Apresentados Comumente Pelas Subqueries .................................................................. 92
Exemplo de Subquery .................................................................................................................................... 92
Regras de Utilizao ....................................................................................................................................... 93
Exerccios ................................................................................................................................................................ 94
Captulo 10 .................................................................................................................................................................. 95
Totalizando Dados ............................................................................................................................................... 95
GROUP BY ............................................................................................................................................................... 95
HAVING Com GROUP BY ............................................................................................................................... 96
WITH ROLLUP Com GROUP BY.................................................................................................................. 97
WITH CUBE Com GROUP BY ....................................................................................................................... 98
Exerccios ............................................................................................................................................................. 100
4
Laboratrio ......................................................................................................................................................... 101
Captulo 11 ............................................................................................................................................................... 103
Entendendo os Arquivos de Dados ............................................................................................................ 103
Arquivo Primrio (PRIMARY DATA FILE) .............................................................................................. 103
Arquivo Secundrio (SECONDARY DATA FILE) ................................................................................... 103
Arquivo de Log (LOG DATA FILE) .............................................................................................................. 104
Nome Fsico e Lgico................................................................................................................................... 104
Grupos de Arquivos (FILEGROUP)............................................................................................................. 104
Regras dos FILEs e FILEGROUPs ............................................................................................................ 105
Recomendaes de Uso .................................................................................................................................. 105
Tamanho dos Arquivos .............................................................................................................................. 105
Mltiplos Arquivos....................................................................................................................................... 105
Tabelas.............................................................................................................................................................. 105
Separando o Log e Arquivo de Dados ................................................................................................... 106
Exemplo de Criao de Database ................................................................................................................ 106
Criando Tabelas Dentro de FILEGROUPs ................................................................................................ 107
Transaction Log ................................................................................................................................................. 108
Exerccios ............................................................................................................................................................. 109
Laboratrio ......................................................................................................................................................... 113
Captulo 12 ............................................................................................................................................................... 114
Integridade e Consistncia - Parte 2.......................................................................................................... 114
UDDT (User-Defined Datatypes) ................................................................................................................ 114
NULL / NOT NULL ............................................................................................................................................ 115
PRIMARY KEY .................................................................................................................................................... 115
FOREIGN KEY / REFERENCES ..................................................................................................................... 115
DEFAULT .............................................................................................................................................................. 116
RULEs .................................................................................................................................................................... 116
Ao Em Cadeia ................................................................................................................................................. 117
Removendo Uma Constraint Com o Comando ALTER TABLE ........................................................ 118
Adicionando Uma Constraint Com o Comando ALTER TABLE ....................................................... 118
Adicionando Uma Coluna a Tabela ............................................................................................................ 118
Removendo Uma Coluna da Tabela ........................................................................................................... 119
Habilitando e/ou Desabilitando TRIGGERs de Uma Tabela............................................................. 119
Habilitando e/ou Desabilitando Constraints ......................................................................................... 119
5
IDENTITY ............................................................................................................................................................. 120
Adicionando Uma Coluna IDENTITY Com ALTER TABLE ............................................................ 120
SET IDENTITY_INSERT ................................................................................................................................... 120
Obtendo Informaes da Coluna IDENTITY ........................................................................................... 121
DBCC CHECKIDENT ..................................................................................................................................... 121
IDENTITYCOL ................................................................................................................................................ 121
IDENT_CURRENT.......................................................................................................................................... 121
IDENTITY_INCR............................................................................................................................................. 122
IDENTITY_SEED ............................................................................................................................................ 122
@@IDENTITY ................................................................................................................................................ 122
SCOPE_IDENTITY ......................................................................................................................................... 122
Exerccios ............................................................................................................................................................. 123
Laboratrio ......................................................................................................................................................... 125
Captulo 13 ............................................................................................................................................................... 126
O Que Uma Views? ........................................................................................................................................ 126
Criando Uma VIEW........................................................................................................................................... 126
Vantagem das VIEWs....................................................................................................................................... 127
WITH ENCRYPTION ......................................................................................................................................... 128
WITH CHECK OPTION ..................................................................................................................................... 128
Excluindo Uma VIEW ...................................................................................................................................... 129
Alterando Uma VIEW ...................................................................................................................................... 129
VIEWs Indexadas .............................................................................................................................................. 129
Diretrizes Para Criao de ndices Sobre Uma VIEW ..................................................................... 129
Criando e Indexando VIEWs..................................................................................................................... 130
Exerccios ............................................................................................................................................................. 131
Captulo 14 ............................................................................................................................................................... 132
Programando Com Transact-SQL ............................................................................................................... 132
Variveis de Usurio ........................................................................................................................................ 132
Atribuindo Valor a Uma Varivel ................................................................................................................ 132
Controle de Fluxo .............................................................................................................................................. 133
EXECUTE .............................................................................................................................................................. 136
STORED PROCEDURE ..................................................................................................................................... 137
Tipos de STORED PROCEDUREs ................................................................................................................. 137
System Stored Procedure .............................................................................................................................. 138
6
Extended Stored Procedures ........................................................................................................................ 139
Stored Procedures Temporrias ................................................................................................................. 140
Stored Procedures Remotas ......................................................................................................................... 140
Stored Procedures Locais .............................................................................................................................. 141
Parmetros .......................................................................................................................................................... 141
Passagem de Parmetro Por Referncia .................................................................................................. 142
Retornando Um Valor ..................................................................................................................................... 142
A Criao de Uma STORED PROCEDURE................................................................................................. 143
Execuo de Uma Procedure ........................................................................................................................ 143
Otimizao da Procedure............................................................................................................................... 143
Compilao da Procedure .............................................................................................................................. 144
As Prximas Execues da Procedure ...................................................................................................... 144
Vantagem das Procedures ............................................................................................................................. 144
Consideraes na Criao de STORED PROCEDURES ........................................................................ 144
Excluindo Uma Procedure ............................................................................................................................. 145
Alterando Uma STORED PROCEDURE...................................................................................................... 145
Recompilando Uma STORED PROCEDURE............................................................................................. 145
Observaes Quando ao Uso de STORED PROCEDUREs ................................................................... 145
Exerccios ............................................................................................................................................................. 147
Laboratrio ......................................................................................................................................................... 150
Captulo 15 ............................................................................................................................................................... 159
Transaes........................................................................................................................................................... 159
Exemplo de Transao .................................................................................................................................... 160
Transaes Explcitas ...................................................................................................................................... 161
Transaes Implcitas ..................................................................................................................................... 161
Consideraes Sobre Transaes ............................................................................................................... 162
Manipulando Erros .......................................................................................................................................... 162
SET XACT_ABORT ............................................................................................................................................. 162
RAISERROR ......................................................................................................................................................... 163
A Varivel @@ERROR..................................................................................................................................... 164
Criando Uma Mensagem de Erro ................................................................................................................ 165
Eliminando Uma Mensagem de Erro......................................................................................................... 166
Batch ...................................................................................................................................................................... 167
Exerccios ............................................................................................................................................................. 168
7
Laboratrio ......................................................................................................................................................... 171
Captulo 16 ............................................................................................................................................................... 172
Funes ................................................................................................................................................................. 172
Regras Para Utilizao de Funes ............................................................................................................ 172
Funes Built-In ................................................................................................................................................ 173
Tipos de USER DEFINED FUNCTIONS ...................................................................................................... 173
Funes Escalares............................................................................................................................................. 173
Funes Table-Valued ..................................................................................................................................... 174
Funes Que Contm Vrios Comandos e Que Retornam Dados de Uma Tabela.................... 175
Exerccios ............................................................................................................................................................. 176
Captulo 17 ............................................................................................................................................................... 179
TRIGGERs ............................................................................................................................................................. 179
TRIGGER x Transao ..................................................................................................................................... 179
TRIGGERs So Reativas .................................................................................................................................. 182
Tabelas Criadas Em Tempo de Execuo ................................................................................................ 182
TRIGGER DDL ..................................................................................................................................................... 182
Alterando ou Eliminando Um TRIGGER ................................................................................................... 183
TRIGGERs Aninhados ...................................................................................................................................... 183
INSTEAD OF ........................................................................................................................................................ 184
Exerccios ............................................................................................................................................................. 185
Labortorio ......................................................................................................................................................... 188
Captulo 18 ............................................................................................................................................................... 189
Concorrncia....................................................................................................................................................... 189
LOCKs .................................................................................................................................................................... 189
Tipos de LOCKs .................................................................................................................................................. 190
SHARED (S) LOCKs ...................................................................................................................................... 190
UPDATE (U) LOCKs ...................................................................................................................................... 190
EXCLUSIVE (X) LOCKs ................................................................................................................................ 191
INTENT (I) LOCKs ........................................................................................................................................ 191
EXTENT LOCKs .............................................................................................................................................. 191
SCHEMA (SCH) LOCKs ................................................................................................................................ 192
Granularidade .................................................................................................................................................... 192
Problemas de Concorrncia Impedidos Pelos LOCKs......................................................................... 193
LOST UPDATE ................................................................................................................................................ 193
8
UNCOMMITED DEPENDENCY ................................................................................................................. 193
INCONSISTENT ANALYSIS (NONREPEATABLE READ)................................................................. 193
PHANTOMS ..................................................................................................................................................... 193
Customizando o LOCK ..................................................................................................................................... 194
Customizando LOCKs na Seo ................................................................................................................... 194
LOCK Dinmico .................................................................................................................................................. 195
TIMEOUT.............................................................................................................................................................. 196
Exerccios ............................................................................................................................................................. 197
Captulo 19 ............................................................................................................................................................... 199
Distribuio de Dados ..................................................................................................................................... 199
Acessando Dados de um SQL Server Remoto ........................................................................................ 199
Conectando-se a um SQL Server Remoto ................................................................................................ 199
Conectando-se a Uma Origem OLEDB ...................................................................................................... 200
Segurana............................................................................................................................................................. 200
Acessando Dados do Servidor Conectado Com o Nome Totalmente Qualificado.................... 201
Acessando Dados do Servidor Conectado Com a Funo OPENQUERY()................................... 202
Comando e Aes Proibidos no Servidor Conectado .......................................................................... 202
Opes Para Configurar o Servidor Conectado ..................................................................................... 202
Modificando Dados em Um Servidor Remoto........................................................................................ 203
Como as Transaes So Distribudas ...................................................................................................... 204
Participando de Transaes Distribudas ............................................................................................... 205
Consideraes .................................................................................................................................................... 205
MS DTC (Microsoft Distributed Transaction Coordinator) .............................................................. 205
Exerccios ............................................................................................................................................................. 207
Apndice ................................................................................................................................................................... 210
Banco de Dados de Sistema .......................................................................................................................... 210
RESOURCE ....................................................................................................................................................... 210
MASTER............................................................................................................................................................ 210
TEMPDB ........................................................................................................................................................... 210
MODEL .............................................................................................................................................................. 210
MSDB ................................................................................................................................................................. 211
BACKUP ................................................................................................................................................................ 211
Stored Procedures teis................................................................................................................................. 211
9
Introduo
Criei essa apostila com o intuito de compartilhar o pouco de conhecimento que possuo
sobre essa ferramenta, o SQL Server 2005 Express. No de meu interesse cobrar sobre esse
material qualquer tipo de quantia ou valor de qualquer gnero, tendo em vista que retirei boa
parte do material aqui contido, de outras apostilas que possuo, de meus prprios
conhecimentos sobre essa ferramenta to poderosa e outros lugares (revistas, sites, arquivos
de ajuda, etc).
10
Captulo 1
O Que SQL?
Num BDR pode-se fazer uso de vrias tabelas. Essas tabelas, ou entidades, podem ter
suas informaes combinadas por meio de relacionamentos formados por chaves primrias,
secundrias ou estrangeiras.
11
Exerccios
1. O que SQL?
Resposta:
Resposta:
Resposta:
Resposta:
12
Captulo 2
Antes de iniciarmos o nosso curso, vejamos a interface do programa que ir nos ajudar
na montagem de um banco de dados no SQL Server 2005, esse programa o SQL Server 2005
Management Studio Express ou simplesmente SSMSE. Ser nossa IDE com o SQL Server.
Ao iniciar o programa, ir aparecer uma janela como esta abaixo pedindo para que o
SSMSE seja conectado a alguma instncia do SQL Server presente na mquina local ou em uma
mquina remota. No nosso caso, a mquina ser local e no ser preciso fazer nenhum tipo de
identificao agora, pois usaremos o modo Windows Authentication que nada mais que
usar o prprio usurio
rio da mquina local como usurio do SQL Server Express.
13
Depois de conectar-se a instncia do SQL Server,
Server, teremos essa tela abaixo.
14
Captulo 3
Dentro do SQL Server h vrios tipos de objetos. Abaixo esto listados alguns desses
objetos:
15
Manipulando e Conhecendo os Objetos DATATYPEs, DATABASEs e TABLEs
DATATYPES
16
Caso o valor de n esteja entre 25 e 53, sua preciso ser de 15 dgitos, fazendo
com que sejam ocupados 8 bytes.
Built-in datatypes baseados em numricos monetrios
MONEY: Esse datatype aceita valores entre -263 e 263 - 1 sendo que 8 bytes so
ocupados para aloc-lo.
SMALLMONEY: possvel utilizar valores entre -231 e 231 - 1. Ocupa 4 bytes.
Built-in datatypes baseados em data e hora
DATETIME: Permite o uso de valores entre 1/1/1753 e 31/12/9999. Esse
datatype ocupa 8 bytes, sendo que sua preciso atinge 333 mili segundos.
SMALLDATETIME: Permite o uso de valores entre 1/1/1900 e 6/6/2079,
sendo que sua preciso de 1 minuto. O espao ocupado de 4 bytes.
Built-in datatypes baseados em binrios
BINARY(n): Este datatype representa os dados que so utilizados no formato
binrio. O espao ocupado de n+4 bytes, sendo que n pode variar entre 1 e
8000 bytes.
VARBINARY(n): Descrio idntica ao BINARY(n).
IMAGE: O espao ocupado por esse datatype de 2.147.483.647 bytes ou 2
Gbytes.
Built-in datatypes especiais
UNIQUEIDENTIFIER: O formato hexadecimal utilizado para armazenamento
de dados binrios. O espao ocupado de 16 bytes.
TIMESTAMP: Um valor binrio gerado pelo SQL Server, sendo que esse
datatype ocupa 8 bytes.
BIT: Ocupa um bit. Representa 0 (zero), 1 ou NULL.
SQL_VARIANT: O valor pode ser qualquer datatype. Pode armazernar valores
de at 8016 bytes.
DATABASE
Para que o SQL Server crie um database, necessrio utilizar a instruo CREATE
DATABASE [nome_database]. Por exemplo, suponhamos que ser criado um banco de dados
com o nome MINHA_DB. Assim, clique em New Query, isso ir abrir o editor. No editor digite
esse comando abaixo:
CREATE DATABASE MINHA_DB
GO
17
Aps digitar,, selecione o texto digitado e clique em Execute ou pressione a tecla F5.
Isso
sso ir executar somente o comando selecionado, caso existam outros comando abaixo esses
no sero executados.
Apesar de termos criado nossa database, ela ainda no se encontra em uso para que
possamos criar outros objetos dentro dela. Logo, para coloc-la
coloc la em uso utilizaremos o
comando USE [nome_database],
[nome_database] como vemos abaixo:
USE MINHA_DB
GO
Agora nossa database est em uso, como podemos ver na lista de databases Available
Databases (Databases Disponveis):
18
Com esse exemplo, queramos demonstrar os comandos bsicos para a criao e
utilizao de uma database. Feito isso, nosso exemplo tem apenas mais uma serventia,
demonstrar a utilizao do comando DROP DATABASE [nome_database].
[nome_database] Esse comando
exclui qualquer vestgio da nossa database de exemplo do SQL Server. Mas antes que ele possa
ser executado, devemos colocar outra database em uso para que o SQL Server perca o vnculo
com a database que desejamos excluir. Podemos colocar em uso a database MASTER, que
uma database padro do SQL Server. Para isso, faamos:
USE [MASTER]
GO
Como resposta ao comando acima, temos que nossa database em uso agora a
database MASTER.
19
TABLE
[campo1] [datatype],
...,
[campoN] [datatype]
Como exclumos nossa database de exemplo, crie outra database e ponha-a em uso
para que nela possamos criar nossa tabela, d a database o nome de MINHA_DB,
MINHA_DB como no
exemplo.
20
alocados todos os objetos referentes a essa database. Procure a pasta Tables e expanda-a. L,
voc localizar a tabela TELEFONES que acabamos de criar.
A partir de agora j podemos inserir registros em nossa tabela recm criada. Nesse
caso, no necessrio usar o comando USE para que possamos ter acesso tabela, pois como
ela est dentro da database MINHA_DB, o SQL Server j entende que qualquer comando
direcionado a essa tabela admite que a database em que ela se encontra j est em uso.
21
Exerccios
Resposta:
Resposta:
Resposta:
Resposta:
5. O que um datatype?
Resposta:
22
Captulo 4
DML Simples
Os comandos DML so utilizados para manipular os dados dentro de uma tabela. Essa
manipulao pode ser do tipo: Incluso (INSERT), atualizao (UPDATE), excluso (DELETE)
ou seleo (SELECT). Dentre esses comandos, o mais complexo, devido a inmeras
quantidades de clusulas, o comando de seleo (SELECT). Pois ele alm de ter suas
prprias clusulas, pode entrar como clusula dos comandos de incluso, atualizao e
excluso. (Ser visto mais adiante).
INSERT
23
Isso ir inserir o primeiro registro na nossa tabela TELEFONES.
Observando na imagem acima, podemos perceber que nossa aba Messages diz o
seguinte: (1 row(s)) affected),, ou seja, "uma linha afetada". Isso nos mostra que o registro foi
inserido com sucesso. Quando executarmos os comandos UPDATE e DELETE, caso esses
sejam bem sucedidos, uma mensagem similar aparecer na aba Messages essages. Basicamente o
comando INSERT isso,, mas possvel modificarmos um pouco esse comando. comando Existe a
possibilidade de se fazer um INSERT posicional.. Isso significa que podemos escolher quais
campos sero preenchidos pelo INSERT. Vejamos:
INSERT INTO TELEFONES
(
CODIGO,
TELEFONE
)
VALUES
(
2,
'(11)7777-7777'
)
GO
Utilizando o comando:
24
Nesse caso inserimos apenas o cdigo e o telefone da pessoa. Ficou sem o nome. Isso s
possvel se o campo permitir, ou seja, se nele no contiver nenhuma restrio ao NOME ser
um valor nulo. Veremos mais a frente como criar essa restrio.
UPDATE
Os dados pertencentes a mltiplas linhas de uma tabela podem ser alterados por meio
do comando UPDATE.. O comando UPDATE tem a seguinte sintaxe:
Supondo que desejamos atualizar o registro '2' da nossa tabela de telefones e incluir o
nome da pessoa que est faltando. Vejamos como:
UPDATE TELEFONES SET
NOME = 'DONA CAMELIA'
WHERE CODIGO = 2
GO
Ao executarmos esse comando o registro '2' da tabela telefones ser atualizado com o
NOME = 'DONA CAMELIA'.. Para que o SQL Server entenda que estamos querendo atualizar o
registro '2', precisamos inform-lo.
inform lo. Essa informao vem depois da clusula WHERE.
25
DELETE
O comando DELETE deve ser utilizado quando desejamos eliminar os dado de uma
tabela. Para isso, temos o seguinte comando:
A aba Messages nos informa que o comando foi executando com sucesso e o registro
foi eliminado da tabela. Da mesma forma que a clusula WHERE foi utilizada no comando
UPDATE,, ela ser utilizada no comando DELETE.
SELECT
Talvez o comando SELECT seja o mais importante comando dentro dos DMLs.
utilizado para realizar consultas a dados pertencentes a uma tabela. Por meio dele, podemos
retornar dados para outros comandos SQL e, tambm, para outras aplicaes. A sintaxe bsica
do comando :
26
Como podemos ver, ao executar o comando de SELECT nos campos especificados, o
retorno foi uma linha da nossa tabela TELEFONES. Podemos ver o retorno ao observar a nova
aba que apareceu, a aba Results
esults.. Ela nos mostra o resultado de um comando de seleo ou
comandos que tenham relao ao comando de seleo. Nesse caso, o retorno foi apenas uma
linha, pois quando vimos o comando DELETE havamos excludo o registro '2'.
possvel realizar um comando de seleo que retorne todas as colunas de uma tabela.
Para isso basta que se substituam os nomes dos campos da tabela pelo caractere asterisco (*).
Vejamos:
SELECT * FROM TELEFONES
GO
Colunas Virtuais
28
Observe a aba Results.. Voc perceber que ela mostra a coluna AMIGO, mas essa
coluna no existe na nossa tabela TELEFONES.
Nem sempre necessrio gravar um resultado de um clculo para que esse seja exibido
na tabela ou retornado a alguma aplicao. Imagine que a partir do CODIGO da linha de um
registro, voc deseje aplicar uma soma,
soma multiplicao, diviso ou subtrao.
subtrao No nosso caso,
usaremos o campo CODIGO e iremos multiplic-lo
multiplic pelo valor de (pi). Poderemos
P fazer isso
da seguinte forma:
SELECT
CODIGO AS [Cdigo da Linha],
Linha]
NOME AS [Nome da Pessoa],
Pessoa]
TELEFONE AS [Telefone da Pessoa],
Pessoa]
CODIGO * 3.141692 AS [Cdigo vezes PI]
FROM TELEFONES
GO
Observando novamente a aba Results,, vemos que agora existe uma coluna virtual com
o resultado da multiplicao. Se existisse um segundo registro, ele iria mostrar o clculo para
ele tambm, por exemplo, 2 * 3.141692 = 6.283384.
Para que possamos observar a clusula DISTINCT,, iremos adicionar um novo registro
a nossa tabela. Mais precisamente um registro idntico a qualquer um existente nela.
Faamos:
INSERT INTO TELEFONES
(
CODIGO,
NOME,
TELEFONE
)
29
VALUES
(
2,
'MARCO TEIXEIRA',
'(11)5555-5555'
)
GO
Isso ir inserir um novo registro com o mesmo nome na nossa tabela TELEFONES.
O comando SELECT mostra apenas um resultado, quando na nossa tabela existem dois
registros idnticos. Nesse
esse caso fizemos uso dos campos NOME e TELEFONE no comando
SELECT, pois eram nesses campos que os registros estavam duplicados. Caso utilizemos o
campo CODIGO,, os dois registros sero retornados. Vejamos:
SELECT DISTINCT CODIGO, NOME,
NOME TELEFONE FROM TELEFONES
GO
30
Copiando Dados De Uma
ma Tabela Para Outra Com INSERT e SELECT
possvel copiar dados de uma tabela para outra em alguns casos. Um desses casos
quando a tabela origem apresenta a mesma estrutura da tabela destino. O outro quando a
tabela origem no apresenta a mesma estrutura que a tabela destino, ou vice-versa.
vice
Iniciemoss criando uma nova tabela com a mesma estrutura da tabela TELEFONES, s
que o nome dessa tabela ser AGENDA.
AGENDA
CREATE TABLE AGENDA
(
CODIGO INT,
NOME VARCHAR(50
50),
TELEFONE CHAR(15)
)
GO
Como os dados que iremos inserir na tabela AGENDA j esto disponveis na tabela
TELEFONES,, iremos usar uma instruo de INSERT com uma instruo de SELECT para
preench-la.
la. E como ambas possuem a mesma estrutura, usaremos a marcao asterisco (*)
na instruo SELECT para indicar que queremos que todos os
os campos sejam copiados de uma
tabela a outra. Vejamos:
INSERT INTO AGENDA
SELECT * FROM TELEFONES
GO
Nesse caso em especial, s foi possvel copiar dessa forma o contedo da tabela
TELEFONES para AGENDA pois as duas tabelas tinham tinha a mesma estrutura,
estrutura mesma
quantidade de campos e mesmos datatypes.
datatype
31
INSERT Com SELECT Quando as Tabelas No So Iguais
Para que possamos observar esse tipo de comando, iremos criar uma nova tabela
chamada CADASTROS.. Segue cdigo abaixo:
CREATE TABLE CADASTROS
(
CODIGO INT,
NOME VARCHAR(50
50),
ENDERECO VARCHAR(50
50),
BAIRRO VARCHAR(25
25),
CIDADE VARCHAR(25
25),
ESTADO CHAR(2),
TELEFONE CHAR(15)
)
GO
32
Exerccios
Resposta:
Resposta:
3. Qual sintaxe devemos utilizar para copiar todos os dados de uma tabela para outra
quando essas possuem a mesma estrutura?
Resposta:
Resposta:
Resposta:
33
Laboratrio
Resposta:
3. Escreva um comando que exiba todas as colunas e todas as linhas da tabela ANIMAIS.
Resposta:
34
4. Escreva um comando que exiba apenas as colunas TIPO e NOME da tabela ANIMAIS,
apresentando todos os registros da tabela.
Resposta:
5. Escreva um comando que exiba apenas as colunas TIPO, NOME e IDADE da tabela
ANIMAIS, apresentado todos os registros.
Resposta:
6. Escreva um comando que exiba apenas as colunas TIPO e NOME da tabela ANIMAIS
apresentando todos os registros. Apresente a legenda da coluna TIPO com o alias
[Tipo de Animal] e a coluna nome com o alias [Nome do Animal].
Resposta:
7. Escreva um comando que exiba apenas as colunas TIPO, NOME e IDADE da tabela
ANIMAIS apresentando todos os registros. Apresente a legenda da coluna TIPO com o
alias [Tipo de Animal], da coluna nome com o alias [Nome do Animal] e da coluna
IDADE com o alias [Tempo de Vida].
Resposta:
35
8. Escreva um comando que apresente os dados da tabela ANIMAIS da seguinte forma:
Resposta:
Resposta:
36
10. Escreva um comando que apresente os dados da tabela ANIMAIS como vemos a seguir,
apresentando uma vez os dados repetidos.
Resposta:
37
Captulo 5
A Clusula WHERE
Vimos no captulo anterior um pouco dessa clusula, nesse captulo iremos nos
aprofundar na forma como ela trata os dados. A utilidade da clusula WHERE determinar
quais os dados de uma tabela que sero afetados pelos comandos SELECT, UPDATE ou
DELETE. Podemos dizer, ento, que essa clusula determina o escopo de uma consulta a
algumas linhas, realizando a filtragem dos dados que estejam de acordo com as condies
definidas.
Para que possamos fazer um uso mximo dessa clusula, iremos criar uma nova
database, tabela e registros. Segue script:
CREATE TABLE PRODUTOS
(
CODIGO INT,
NOME VARCHAR(50),
TIPO VARCHAR(25),
QUANTIDADE INT,
VALOR DECIMAL(10,2)
)
GO
38
Sintaxe Bsica
Os operadores de comparao podem ser: = (igual ), > (maior que), < (menor que), <>
(diferente de), >= (maior ou igual ), <= (menor ou igual ).. H a possibilidade de se usar os
operadores IN, AND e OR em conjunto com a clusula WHERE,, mas veremos isso mais a
frente.
Com a clusula WHERE,, podemos fazer uma seleo de registros especficos. Suponha
que queremos retornar apenas os produtos os quais
qu o TIPO 'INFORMATICA'.
'INFORMATICA' Vejamos:
SELECT * FROM PRODUTOS WHERE TIPO = 'INFORMATICA'
GO
Para realizar uma alterao sobre os preos dos produtos desta tabela, utilizaremos a
clusula WHERE.. Vejamos um exemplo que demonstra um acrscimo de 15% sobre os
valores dos produtos do tipo 'INFORMATICA'.
'INFORMATICA'
UPDATE PRODUTOS SET VALOR = VALOR * 1.15
WHERE TIPO = 'INFORMATICA'
GO
39
Executando o comando, podemos observar que quatro registros foram alterados. Faa
um SELECT somente nos itens os quais o tipo seja 'INFORMATICA' para visualizar a alterao.
Utilize um SELECT com a clusula WHERE para retornar somente os produtos do tipo
'ELETRONICOS' e veja as alteraes.
Para que vejamos o OR em operao, imaginemos que vamos diminuir o valor dos
produtos, em 20%, que sejam maiores que 1000,00 ou que estejam do tipo 'DIGITAIS'. Ento
teramos o seguinte:
UPDATE PRODUTOS SET VALOR = VALOR * 0.80
WHERE TIPO = 'DIGITAIS' OR VALOR > 1000.00
GO
Observe que a vantagem dessa forma de escrita, com o operador IN, a legibilidade. Ao
executarmos ambos os comandos a sada ser a mesma. Vejamos com o operador IN:
40
A Clusula WHERE Com os
o Operadores NOT IN
41
Por meio do operador AND e dos operadores relacionais =, < e > tambm possvel
consultar uma determinada faixa de valores. No entanto, por meio do BETWEEN esta consulta
tornar-se mais simples. Essee operador permite checar se o valor de uma coluna encontra-se
encontra
em um determinado intervalo. Ele pode ser utilizado para verificar intervalos de data,
caracteres, entre outros.
42
A Clusula WHERE Com o Operador
O LIKE
O operador LIKE empregado para situaes em que se necessita retornar valores que
se iniciam com um determinado caractere ou sentena de caracteres, terminem com um
determinado caractere ou sentena de caracteres ou contenham um determinado caractere ou
sentena desses.. Por exemplo, desejamos retornar todos os produtos que se iniciem com a
letra 'T', ento vejamos:
SELECT * FROM PRODUTOS WHERE NOME LIKE 'T%'
GO
Perceba que aps o nosso caractere de busca, usamos um caractere coringa. Que no
caso do SQL Server o caractere porcentagem (%). Isso especifica ao SQL Server que
desejamos retornar todos os valores que se iniciem com a letra 'T'. Caso quisssemos todos os
valores que terminassem com a letra 'T', usaramos essa busca da seguinte forma:
SELECT * FROM PRODUTOS WHERE NOME LIKE '%T'
GO
Com os caracteres coringas rodeando o nosso caractere de consulta. Vale lembrar que
no apenas o primeiro caractere que pode ser determinado para uma consulta. Caso
desejamos obter como resultado todos os nomes iniciados com a letra 'M' e que contenha a
letra 'S' em qualquer outra posio:
posi
SELECT * FROM PRODUTOS WHERE NOME LIKE 'M%S%'
GO
43
Podemos restringir uma consulta com o operador LIKE determinando no apenas um
caractere como, tambm, uma slaba que deva estar presente no valor do campo. Agora,
usaremos o operador LIKE em conjunto com o operador AND para obter como resultado os
produtos cujos nomes possuam a slaba 'RA' e os tipos que possuam a slaba 'CA'.
'CA'
SELECT * FROM PRODUTOS WHERE NOME LIKE '%RA%' AND TIPO LIKE '%CA%'
GO
Nota:: Caso em uma procura seja necessrio localizar um registro que possua
o caractere coringa (%), usa-se
usa o LIKE nesta forma:
Isso informa ao SQL Server que nesta consulta o caractere que estiver
direita do caractere de ESCAPE, no caso o caractere '^', ser o caractere a ser
procurado.
Os operadores NOT LIKE so utilizados da mesma forma que o operador LIKE, mas
com eles obtemos com resultado inverso. Vejamos:
SELECT * FROM PRODUTOS WHERE NOME NOT LIKE '%RA%'
GO
44
Exerccios
Resposta:
2. Quais os operadores utilizados com a clusula WHERE quando se deseja usar mais de
uma condio de comparao?
Resposta:
3. Que operador utilizado para selecionar uma faixa de valores a ser atingida por um
determinado comando?
Resposta:
Resposta:
5. Que operador permite checar se o valor de uma coluna est presente em uma lista de
elementos e pode ser utilizado no lugar do operador OR em determinadas situaes?
Resposta:
45
Laboratrio
1. Aumente em 12% o valor dos produtos cujos nomes iniciem com a letra 'F'
Resposta:
2. Aumentar em 50 unidades todos os produtos cujo valor seja maior que 400 e inferior a
600
Resposta:
Resposta:
Resposta:
Reposta:
6. Exibir todos os produtos que se iniciem com nome 'MO' e tenham como tipo as letras
'MA'
Resposta:
46
Captulo 6
A Clusula ORDER BY
Por vezes necessrio que o resultado de uma consulta seja mostrado em uma ordem
especfica, de acordo com determinado critrio. Para tal, contamos com opes e clusulas de
ordenao. Uma delas a clusula ORDER BY (ordernar por). Utilizamos a clusula em
conjunto com o comando SELECT a fim de retornar resultados de uma consulta a uma tabela
em determinada ordem.
47
Ordenando Por Mais de
e Uma Coluna
possvel utilizar a clusula ORDER BY para ordenar os dados de vrias colunas, isto
com base nos nomes de vrias colunas e nas posies das colunas no SELECT.
SELECT A seguir um
exemplo desse estilo de ordenao:
SELECT * FROM PRODUTOS ORDER BY NOME, TIPO
GO
Veja que executado, ordena primeiramente pelo NOME e depois pela coluna TIPO.
ASC: Esta opo faz com que as linhas sejam ordenadas na forma ascendente. (Padro)
DESC: Esta opo faz com que as linhas sejam ordenadas na forma descendente.
48
ASC e DESC
A Clusula TOP
Como resultado de uma consulta a uma tabela de um banco de dados, temos a opo de
retornar a quantidade de linhas desejadas, a partir da primeira linha selecionada. Para isso,
utilizamos a clusula TOP.
49
Vamos novamente nos basear na tabela PRODUTOS. Para ra obter como resultado as
primeiras cinco linhas da tabela, utilizamos o seguinte comando:
SELECT TOP 5 * FROM PRODUTOS
GO
Em Partitioned Views,
Views TOP no pode ser aplicada junto s instrues UPDATE e
INSERT
No h ordem das linhas referenciadas na expresso TOP utilizada como as instrues
INSERT, DELETE ou UPDATE,
UPDATE sendo que TOP n retorna linhas aleatrias n como
resposta.
A clusula WITH TIES retornou a primeira linha da tabela, alm de todas as linhas que
apresentam quantidades idnticas quantidade do produto que a clusula TOP 1 selecionou.
51
Exerccios
Resposta:
2. Que comando utilizamos em conjunto com a clusula ORDER BY a fim de permitir que
os dados sejam exibidos na ordem desejada?
Resposta:
3. Qual a finalidade de utilizarmos as opes ASC e DESC com a clusula ORDER BY?
Resposta:
Resposta:
5. A clusula ORDER BY permite que os dados sejam ordenados somente por uma
coluna. Esta afirmao verdadeira?
Resposta:
52
Laboratrio
1. Escreva uma consulta que exiba os dados da tabela PRODUTOS na forma crescente
pelo campo NOME.
Resposta:
2. Escreva uma consulta que exiba o NOME dos produtos ordenado de forma decrescente
e o VALOR de forma crescente.
Resposta:
Resposta:
Resposta:
53
Captulo 7
Para que um sistema de banco de dados sempre possa fornecer informaes confiveis
aos usurios, o administrador deve filtrar algumas aes realizadas sobre essas informaes a
fim de evitar a ocorrncia de possveis erros relacionados s mesmas.
Alm disso, esse sistema deve ser capaz de receber informaes de forma constante
sem ter que sofrer alteraes com a mesma freqncia. O banco de dados deve possibilitar a
insero de uma grande quantidade de dados sem que o mesmo precise ser alterado em sua
estrutura.
CONSTRAINTS
A fim de assegurar a integridade dos dados de uma tabela, o SQL Server oferece cinco
tipos diferentes de constraints, os quais so relacionados a cinco tipos diferentes de
integridades. Segue abaixo:
55
Nota: A chave primria deve fazer parte da integridade referencial que se
estabelece entre duas tabelas relacionadas. Mais detalhes a respeito deste
assunto sero vistos adiante.
Para compreendermos este assunto de forma mais adequada, destacamos que para
criamos uma chave estrangeira preciso que a coluna da primeira tabela, na qual se encontra
a chave primria, seja referenciada pela coluna que se encontra na segunda tabela. Dessa
forma, a coluna da segunda tabela torna-se a chave estrangeira.
56
Vale destacar, no entanto, que no necessrio que uma constraint FOREIGN KEY /
REFERENCES em uma tabela seja vinculada apenas a uma constraint PRIMARY KEY em outra
tabela. Alm disso, embora a FOREIGN KEY / REFERENCES possa conter valores nulos,
possvel que, nessa situao, a verificao dos valores que forma esta constriant no ocorra.
Cenrio:
CODIGO RG
NOME SEXO SALARIO
(PRIMARY KEY) (UNIQUE)
Como podemos observar, nas colunas SEXO e SALARIO, os valores inseridos para os
cadastros MARISTELA DIAS e MARIA JUNQUEIRA esto inadequados, pois no existe sexo X
e, tampouco, salrio negativo. (Exceto aquelas pessoas que "pagam" para trabalhar).
57
Quando pesquisarmos pelas pessoas do sexo feminino, receberemos o seguinte
resultado:
CODIGO RG
NOME SEXO SALARIO
(PRIMARY KEY) (UNIQUE)
CODIGO RG
NOME SEXO SALARIO
(PRIMARY KEY) (UNIQUE)
Quando um valor padro estabelecido para uma coluna, o sistema assume que ele
deve ser utilizado sempre que o valor que deveria ser inserido suprimido, ou seja, quando o
usurio deixa de preencher o valor manualmente. Vejamos a tabela:
Temos, ento, que aplicar a constraint DEFAULT para a coluna SEXO e a coluna
SALARIO. Com os valores padres 'F' e 0 (zero) respectivamente. Se adicionarmos um novo
registro tabela, omitindo os valores para SEXO e SALARIO, o novo registro ficar dessa
forma:
58
CODIGO RG SEXO SALARIO
NOME
(PRIMARY KEY) (UNIQUE) (DEFAULT 'F') (DEFAULT 0)
Valores NULL
Alm dos valores padres, tambm possvel atribuir valores nulos a uma coluna. Por
exemplo, na tabela de FUNCIONARIOS, podemos atribuir valores nulos a coluna SALARIO.
Com isso, podemos inserir todas as informaes da pessoa, mas, omitindo o valor do salrio
dessa pessoa. Vejamos:
SALARIO
CODIGO RG SEXO (DEFAULT 0 e
NOME
(PRIMARY KEY) (UNIQUE) (DEFAULT 'F') admite valor
NULL)
Atribuir valor nulo a uma coluna significa que ela no ter valor algum. Assim, de
acordo com as regras de integridade e consistncia dos dados, preciso atribuir nulabilidade
das colunas de uma tabela a fim de determinar se elas aceitaro valores nulos (NULL) ou no
(NOT NULL). Quando atribumos um valor nulo a uma coluna, esta pode ocupar espao no
banco de dados, mas isso depende de seu datatype.
59
Regras de constraints
Cada tipo de constraint possui uma regra especfica. Vejamos essas regras:
Vrias colunas de uma tabela podem ser definidas como sendo chave
UNIQUE
nica e, ainda, aceitar valores nulos (apenas um).
USE MINHA_DB
GO
60
CEP CHAR(9) NOT NULL,
BAIRRO VARCHAR(25),
CIDADE VARCHAR(25),
ESTADO CHAR(2),
RG CHAR(12) NOT NULL,
SALARIO DECIMAL (9,2) DEFAULT 0,
SEXO CHAR(1) DEFAULT 'F',
61
INSERT INTO DEPENDENTES VALUES (4, 3,'CAROLINA DIAS
CACAPAVA','56.454.654','29/2/1992','F')
INSERT INTO DEPENDENTES VALUES (5, 7,'FERNANDA BEATRIZ MONTEIRO
ROSSI','98.754.548','21/7/1987','F')
INSERT INTO DEPENDENTES VALUES (6, 8,'GLOBENILDO MULERA DOS
SANTOS','21.455.469','23/9/2001','M')
INSERT INTO DEPENDENTES VALUES (7, 8,'GLOBALINA MULERA DOS
SANTOS','21.712.842','11/7/2001','F')
INSERT INTO DEPENDENTES VALUES (8, 8,'GLOBERTO MULERA DOS
SANTOS','98.721.379','18/11/1982','M')
INSERT INTO DEPENDENTES VALUES (9, 11,'ROBERTO VENTANIA E
TEMPESTADE','32.198.712','28/10/1985','M')
GO
Alguns dos mecanismos de abstrao nos quais se baseia a evoluo do MER so:
agregao, classificao e generalizao. Mais detalhes a respeito dos relacionamentos entre
entidades sero abordados a seguir.
Relacionamento
Vale destacar que o grau de relacionamento entre duas entidades determinado pela
quantidade de ocorrncias de uma entidade que est relacionada outra. O grau de
relacionamento entre entidades tambm chamado de cardinalidade.
62
Relacionamento 1 : 1
1 Carlos da Silva M
2 Joaquim Nabuco M
3 Fernando Costa M
Relacionamento 1 : N
COD_PAI NOME
2 Esgrumilda Argentina
3 Fernando Porto
4 Pedro Pedreira
63
Agora a tabela FILHOS:
1 1 Marcelo Braga
2 1 Fernando Braga
Perceba que um pai pode ter vrios filhos, mas um filho tem apenas um pai.
J na tabela que representa o relacionamento para muitos (N), dever haver uma
consulta referente primeira tabela, a qual deve utilizar a chave estrangeira para que, dessa
forma, seja estabelecido o relacionamento entre ambas as tabelas.
Devemos estar atentos ao fato de que, diferentemente das chaves primrias, colunas
que utilizam chave estrangeira aceitam a insero de valores duplicados.
Relacionamento N : N
importante destacar que pode no haver associao de fatos nas situaes em que os
relacionamentos so de carter condicional. Neste caso, a cardinalidade deve ser determinada
por meio de ampla anlise quanto possibilidade de ocorrerem relacionamentos.
64
Tabela ALUNOS:
1 Fernando Fernandes M
2 Carlos Carvalho M
3 Maria Garcia F
4 Ins Pereira F
Tabela CURSOS:
COD_CURSO NOME
1 Matemtica
2 Fsica
3 Qumica
4 Biologia
5 Histria
COD_ALUNO COD_CURSO
1 2
1 5
2 1
2 3
3 2
3 4
3 5
4 1
4 2
65
Para estabelecer este tipo de relacionamento, devemos ter trs tabelas, sendo que a
terceira responsvel por relacionar as outras duas. Para isso, preciso que essas duas
primeiras tabelas tenham uma coluna que seja chave primria.
66
Exerccios
1. O que so constraints?
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
67
Laboratrio
Nesse laboratrio iremos criar um sistema simplificado de venda de CDs. Para isso ser
necessrio criar uma nova database.
Resposta:
Resposta:
TABELA: ARTISTAS
Cdigo do
COD_ART INT NOT NULL PRIMARY KEY
Artista
TABELA: GRAVADORAS
Cdigo da
COD_GRAV INT NOT NULL PRIMARY KEY
Gravadora
Nome da
NOME_GRAV VARCHAR(50) NOT NULL UNIQUE
Gravadora
TABELA: CATEGORIAS
Cdigo da
COD_CAT INT NOT NULL PRIMARY KEY
Categoria
Nome da
NOME_CAT VARCHAR(50) NOT NULL UNIQUE
Categoria
68
TABELA: ESTADOS
TABELA: CIDADES
Cdigo da
COD_CID INT NOT NULL PRIMARY KEY
Cidade
FOREIGN KEY /
REFERENCES
SIGLA_EST Sigla do Estado CHAR(2) NOT NULL
(SIGLA_EST de
ESTADOS)
TABELA: CLIENTES
Cdigo do
COD_CLI INT NOT NULL PRIMARY KEY
Cliente
FOREIGN KEY /
Cdigo da REFERENCES
COD_CID INT NOT NULL
Cidade (COD_CID de
CIDADES)
Endereo do
END_CLI VARCHAR(100) NOT NULL
Cliente
CHECK >= 0
Renda do
RENDA_CLI DECIMAL(9,2) NOT NULL e
Cliente
DEFAULT 0
CHECK ('F','M')
SEXO_CLI Sexo do Cliente CHAR(1) NOT NULL e
DEFAULT 'F'
69
TABELA: CONJUGE
PRIMARY KEY
e
Cdigo do FOREIGN KEY /
COD_CLI INT NOT NULL
Cliente REFERENCES
(COD_CLI de
CLIENTES)
Nome do
NOME_CONJ VARCHAR(50) NOT NULL
Cnjuge
CHECK >= 0
Renda do
RENDA_CONJ DECIMAL(9,2) NOT NULL e
Cnjuge
DEFAULT 0
CHECK ('F','M')
SEXO_CONJ Sexo do Cnjuge CHAR(1) NOT NULL e
DEFAULT 'F'
TABELA: FUNCIONARIOS
Nome do
NOME_FUNC VARCHAR(50) NOT NULL
Funcionrio
Endereo do
END_FUNC VARCHAR(100) NOT NULL
Funcionrio
CHECK >= 0
Renda do
SAL_FUNC DECIMAL(9,2) NOT NULL e
Funcionrio
DEFAULT 0
CHECK ('F','M')
Sexo do
SEXO_FUNC CHAR(1) NOT NULL e
Funcionrio
DEFAULT 'F'
70
TABELA: DEPENDENTES
Cdigo do
COD_DEP INT NOT NULL PRIMARY KEY
Dependente
FOREIGN KEY /
Cdigo do REFERENCES
COD_FUNC INT NOT NULL
Funcionrio (COD_FUNC de
FUNCIONARIOS)
Nome do
NOME_DEP VARCHAR(100) NOT NULL
Dependente
CHECK ('F','M')
Sexo do
SEXO_DEP CHAR(1) NOT NULL e
Dependente
DEFAULT 'F'
TABELA: TITULOS
FOREIGN KEY /
Cdigo da REFERENCES
COD_CAT INT NOT NULL
Categoria (COD_CAT de
CATEGORIAS)
FOREIGN KEY /
Cdigo da REFERENCES
COD_GRAV INT NOT NULL
Gravadora (COD_GRAV de
GRAVADORAS)
Quantidade em
QTD_ESTQ INT NOT NULL CHECK >= 0
Estoque
71
TABELA: PEDIDOS
Nmero do
NUM_PED INT NOT NULL PRIMARY KEY
Pedido
FOREIGN KEY /
Cdigo do REFERENCES
COD_CLI INT NOT NULL
Cliente (COD_CLI de
CLIENTES)
FOREIGN KEY /
Cdigo do REFERENCES
COD_FUNC INT NOT NULL
Funcionrio (COD_FUNC de
FUNCIONARIOS)
Data da
DATA_PED SMALLDATETIME NOT NULL
Emisso
CHECK >= 0
VAL_PED Valor do Pedido DECIMAL(9,2) NOT NULL e
DEFAULT 0
TABELA: TITULOS_PEDIDO
Obs.: Esta tabela ter uma chave primria composta por duas colunas:
NUM_PED e COD_TIT
FOREIGN KEY /
Nmero do REFERENCES
NUM_PED INT NOT NULL
Pedido (NUM_PED de
PEDIDOS)
FOREIGN KEY /
Cdigo do REFERENCES
COD_TIT INT NOT NULL
Ttulo (COD_TIT de
TITULOS)
Quantidade de
QTD_CD INT NOT NULL CHECK >= 1
cada Ttulo
72
TABELA: TITULOS_ARTISTA
Obs.: Esta tabela ter uma chave primria composta por duas colunas:
COD_TIT e COD_ART
FOREIGN KEY /
Cdigo do REFERENCES
COD_TIT INT NOT NULL
Ttulo (COD_TIT de
TITULOS)
FOREIGN KEY /
Cdigo do REFERENCES
COD_ART INT NOT NULL
Artista (COD_ART de
ARTISTAS)
TABELA: ARTISTAS
COD_ART NOME_ART
1 MARISA MONTE
2 GILBERTO GIL
3 CAETANO VELOSO
4 MILTON NASCIMENTO
5 LEGIO URBANA
6 THE BEATLES
7 RITA LEE
TABELA: GRAVADORAS
COD_GRAV NOME_GRAV
1 POLYGRAM
2 EMI
3 SOM LIVRE
4 SOM MUSIC
73
TABELA: CATEGORIAS
COD_CAT NOME_CAT
1 MPB
2 TRILHA SONORA
3 ROCK INTERNACIONAL
4 ROCK NACIONAL
TABELA: ESTADOS
SIGLA_EST NOME_EST
SP SO PAULO
MG MINAS GERAIS
RJ RIO DE JANEIRO
TABELA: CIDADES
1 SP SO PAULO
2 SP SOROCABA
3 SP JUNDIA
4 SP AMERICANA
5 SP ARARAQUARA
6 MG OURO PRETO
7 ES CACHOEIRA DO ITAPEMIRIM
74
TABELA: CLIENTES
TABELA: CONJUGE
TABELA: FUNCIONARIOS
75
TABELA: DEPENDENTES
1 1 ANA PEREIRA F
2 1 ROBERTO PEREIRA M
3 1 CELSO PEREIRA M
4 3 BRISA LINHARES F
6 4 SONIA DA SILVA F
TABELA: TITULOS
76
TABELA: PEDIDOS
1 1 2 02/05/02 1500.00
2 3 4 02/05/02 50.00
3 4 7 02/06/02 100.00
4 1 4 02/02/03 200.00
5 7 5 02/03/03 300.00
6 4 4 02/03/03 100.00
7 5 5 02/03/03 50.00
8 8 2 02/03/03 50.00
9 2 2 02/03/03 2000.00
10 7 1 02/03/03 3000.00
TABELA: TITULOS_ARTISTA
COD_TIT COD_ART
1 1
2 2
3 2
4 2
5 3
6 4
7 4
8 5
9 6
10 7
77
TABELA: TITULOS_PEDIDO
1 1 2 30.00
1 2 3 20.00
2 1 1 50.00
2 2 3 30.00
3 1 2 40.00
4 2 3 20.00
5 1 2 25.00
6 2 3 30.00
6 3 1 35.00
7 4 2 55.00
8 1 4 60.00
9 2 3 15.00
10 7 2 15.00
78
Captulo 8
Associando tabelas
A associao de tabelas pode ser realizada para diversas finalidades, por exemplo,
converter em informaes os dados encontrados em duas ou mais tabelas. Essa associao
pode ser realizada por meio da clusula WHERE e JOIN. importante ressaltar que as tabelas
devem ser associadas em pares, embora seja possvel utilizar um nico comando para
combinar vrias tabelas.
importante ressaltar que a tabelas devem ser associadas em pares, embora seja
possvel utilizar um nico comando para combinar vrias tabelas. Um procedimento muito
comum a associao da chave primria da primeira tabela com a chave estrangeira da
segunda tabela.
Aprenderemos a utilizar as clusulas INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN
e CROSS JOIN para promover a associao das tabelas. Tambm falaremos sobre o uso dos
comandos UPDATE e DELETE em parceria com a clusula JOIN para alterao e eliminao
de dados nas tabelas relacionadas.
JOIN
A clusula JOIN permite que os dados de vrias tabelas sejam combinados com base na
relao existente entre elas. Por meio dessa clusula, os dados de uma tabela so utilizados
para selecionar os dados pertencentes outra tabela.
79
INNER JOIN
comum que duas tabelas tenham campos com o mesmo nome, como o caso da
chave estrangeira da tabela CLIENTES e a chave primria da tabela CIDADES. Para que
possamos informar ao SQL Server de quais tabelas os campos esto sendo relacionados,
podemos "apelidar"
idar" as tabelas. No caso descrito acima, a tabela CLIENTES foi apelidada de
CLI e a tabela CIDADES foi apelidada de CID.. "Apelidar" uma tabela muito parecido com a
criao de ALIAS para campos da tabela, s que nesse caso estamos nos referenciando ao
nome das tabelas.
80
uma converso. A condio de associao pode, ainda, utilizar a funo CAST para converter
tipos de dados que no podem ser transformados facilmente.
LEFT JOIN
A clusula LEFT JOIN permite obter no apenas dados relacionados de duas tabelas,
mas tambm os dados no-relacionados
relacionados encontrados na tabela esquerda da clusula JOIN.
Caso no existam dados relacionados entre as tabelas esquerda e direita do JOIN, os
valores resultantess de todas as colunas de lista de seleo da tabela direita sero nulos.
RIGHT JOIN
Ao contrrio do LEFT JOIN, JOIN a clusula RIGHT JOIN retorna todos os dados
encontrados na tabela direita de JOIN.. Caso no existam dados associados entre as tabelas
esquerda e direita de JOIN,, sero retornados valores nulos. Aplicando o mesmo exemplo do
LEFT JOIN para o RIGHT JOIN teremos o seguinte:
SELECT CLIENTES.NOME_CLI, CONJUGES.NOME_CONJ
CONJUGES FROM CLIENTES
RIGHT JOIN CONJUGES ON CLIENTES.COD_CLI = CONJUGES.COD_CLI
COD_CLI
GO
81
Observe que foram retornados todos os dados da tabela CONJUGES com os respectivos
relacionamentos. Como no existem cadastros de cnjuges sem clientes, no foi apresentado
nenhum valor nulo na tabela esquerda do JOIN.
82
FULL OUTER JOIN
CROSS JOIN
83
Os Comandos UPDATE e DELETE Com Utilizao do JOIN
Perceba que existem quatro funcionrios nesta listagem, mas existem cinco registros
na tabela FUNCIONARIOS.. Veja a tabela funcionrios:
SELECT * FROM FUNCIONARIOS
GO
84
Agora, usaremos o comando UPDATE para realizar zar o aumento de salrio para esses
funcionrios. Para isso, iremos fazer o comando de UPDATE e utilizaremos a parte do JOIN do
comando de SELECT para fazer nossa restrio. Vejamos:
UPDATE FUNCIONARIOS SET SAL_FUNC = SAL_FUNC * 1.1 FROM FUNCIONARIOS AS FUNC
INNER JOIN PEDIDOS AS PED ON PED.COD_FUNC = FUNC.COD_FUNC
COD_FUNC
GO
Tabela: ALUNOS
1 JOAQUIM MANUEL 1
2 MARIA MADALENA 1
3 CARLITOS AMARAL 3
Tabela: CURSOS
COD_CURSO NOME
PRIMARY KEY NOT NULL
1 INGLES
2 ESPANHOL
3 ALEMAO
85
Aps criadas as tabelas e inseridos os registros, iremos utilizar um comando de
SELECT com a clusula JOIN para retornar todos os cursos que tenham alunos matriculados.
Vejamos:
SELECT AL.NOME, CR.NOME FROM ALUNOS AS AL
JOIN CURSOS AS CR ON CR.COD_CURSO = AL.COD_CURSO
GO
Agora iremos excluir todos os alunos do curso de ingls e para esse caso usaremos a
clusula restritiva WHERE.. Vejamos o comando:
DELETE ALUNOS FROM ALUNOS AS AL
JOIN CURSOS AS CR ON CR.COD_CURSO = AL.COD_CURSO
WHERE CR.NOME = 'INGLES'
GO
Como podemos observar, em nossa aba Messages, os alunos do curso de ingls foram
excludos. Utilize um SELECT para verificar a tabelas ALUNOS e confirmar a excluso.
86
Exerccios
Resposta:
Resposta:
3. Que clusula gera os dados relacionados entre duas tabelas e os dados no-
relacionados localizados na tabela posicionada direita de JOIN?
Resposta:
Resposta:
5. Quais comandos utilizar com o JOIN para alterar ou remover informaes de uma
tabela, tendo como base os dados de uma segunda tabela e estando elas inter-
relacionadas?
Resposta:
87
Laboratrio
Resposta:
Resposta:
3. Selecione o nome dos CDs, o nome das gravadoras de cada CD e o nome da categoria de
cada CD.
Resposta:
4. Selecione o nome dos clientes e os ttulos dos CDs vendidos em cada pedido que o
cliente fez.
Resposta:
5. Selecione o nome do funcionrio, nmero, data e valor dos pedidos que este
funcionrio registrou, alm do nome do cliente que est fazendo o pedido.
Resposta:
88
6. Selecione o nome dos funcionrios e o nome de todos os dependentes de cada
funcionrio.
Resposta:
Resposta:
Resposta:
9. Selecione nome do cliente, nome do cnjuge, nmero do pedido que cada cliente fez,
valor de cada pedido que cada cliente fez e cdigo do funcionrio que atendeu a cada
pedido.
Resposta:
89
Captulo 9
Uma consulta
nsulta aninhada em uma instruo SELECT, INSERT, DELETE ou UPDATE
chamada de subquery (subconsulta), ou O-QUE-NO-SE-DEVE-FAZER--NO-SQL-SERVER. O
limite mximo de aninhamentos de uma subquery de 32 nveis, limite este que varia de
acordo com a complexidade
ade de outras instrues que compem a consulta e da quantidade de
memria disponvel.
UNION ALL
A UNION ALL uma clusula responsvel por unir informaes obtidas a partir de
diversos comandos de SELECT.. Basicamente o UNION ALL concatena vrios SELECTs a fim de
montar um nico comando que traga os dados de vrias tabelas distintas. Para entender o
UNION ALL considere a tabela CLIENTES e FUNCIONARIOS do nosso banco de dados
DB_CDS. Supondo que precisamos obter o cdigo, nome, endereo, renda/salrio
renda/salr e sexo de
cada pessoa nessas tabelas, podemos proceder da seguinte forma:
SELECT COD_CLI, NOME_CLI, END_CLI,
END_CLI RENDA_CLI, SEXO_CLI FROM CLIENTES
UNION ALL
SELECT COD_FUNC, NOME_FUNC,
, END_FUNC, SAL_FUNC, SEXO_FUNC FROM FUNCIONARIOS
GO
90
Nota: Para que a consulta possa ser realizada, fundamental que as colunas
sejam do mesmo tipo.
Regras de Utilizao
O nome (alias) das colunas, quando realmente necessrio, deve ser includo no
primeiro SELECT.
A incluso de WHERE pode ser feita em qualquer comando SELECT.
possvel escrever qualquer SELECT com JOIN ou subquery, caso seja necessrio.
necessrio que todos os comandos SELECT utilizados apresentem o mesmo nmero
de colunas.
necessrio que todas as colunas dos comandos SELECT tenham o mesmo datatype
em seqncia. Por exemplo, uma vez que a segunda coluna do primeiro SELECT
baseia-se no datatype decimal, preciso que as segundas colunas dos outros SELECTs
tambm apresentem o mesmo tipo de datatype decimal.
Para que tenhamos dados ordenados, o ltimo SELECT deve ter uma clusula ORDER
BY adicionada em seu final.
Devemos utilizar a clusula UNION sem ALL para exibio nica de dados repetidos
em mais de uma tabela.
Subquery
Exemplo de Subquery
Como vimos em um exemplo anterior, com a clusula JOIN podemos retornar todos os
clientes que possuem cnjuge. Vejamos essa instruo:
SELECT CLI.NOME_CLI, CONJ.NOME_CONJ FROM CLIENTES AS CLI
INNER JOIN CONJUGES AS CONJ ON CONJ.COD_CLI = CLI.COD_CLI
GO
Fazendo uso de uma subquery, a nossa instruo SQL ficaria dessa forma:
SELECT CLIENTES.NOME_CLI, (SELECT NOME_CONJ FROM CONJUGES WHERE COD_CLI =
CLIENTES.COD_CLI) AS [NOME_CONJ] FROM CLIENTES WHERE CLIENTES.COD_CLI IN (SELECT
COD_CLI FROM CONJUGES)
GO
92
Como podemos ver, as duas nos retornaram os mesmos dados. E como podemos ver,
tambm, a soluo mais elegante utilizar o JOIN.
Regras de Utilizao
93
Exerccios
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
94
Captulo 10
Totalizando Dados
Veremos como a clusula GROUP BY pode ser utilizada para agrupar vrios dados,
tornando mais prtica a totalizao dos mesmos. Tambm conheceremos outras clusulas que
podem ser empregadas em parceria com o GROUP BY, como HAVING, WITH ROLLUP e JOIN.
GROUP BY
Com a clusula GROUP BY possvel agrupar diversos registros com base em uma ou
mais colunas. Por exemplo, na nossa database DB_CDS, mais de um ttulo produzido por
uma gravadora, caso seja necessrio saber qual a quantidade de ttulos que essa gravadora
produziu, podemos usar o GROUP BY em associao com o JOIN para obtermos esses dados.
Nas situaes em que se especfica a clusula GROUP BY, deve ocorrer uma das
seguintes situaes: a expresso GROUP BY deve ser correspondente expresso da lista de
seleo ou cada uma das colunas presentes em uma expresso no-agregada na lista de
seleo deve ser adicionada lista de GROUP BY.
Quando utilizamos o GROUP BY, nos retornado grupos em ordem aleatria, nesse
caso podemos utilizar a clusula ORDER BY em conjunto para orden-los.
Em que:
95
expressao_group_by:: Tambm conhecida como coluna agrupada, trata-se
expressao_group_by trata de
uma expresso na qual o argumento realizado. Ela pode ser especificada como
uma coluna ou como uma expresso no-agregada
no agregada que faz referncia coluna
c
que a clusula FROM retornou, mas no possvel especific-la
especific com uma alias
de coluna determinado na lista de seleo. Alm disso, no podemos utilizar a
expressao_group_by as colunas dos seguintes tipos: IMAGE,
IMAGE TEXT e NTEXT.
96
restringe os resultados obtidos aps a aplicao da clusula FROM,
FROM ao passo
que a clusula HAVING filtra o retorno do agrupamento.
Como exemplo, iremos agrupar todos os ttulos de CDs que venderam mais de 100.00:
SELECT TIT.NOME_CD, SUM(TP..VAL_CD) AS [VALOR] FROM TITULOS_PEDIDO AS TP
INNER JOIN TITULOS AS TIT ON TIT.COD_TIT = TP.COD_TIT
GROUP BY TIT.NOME_CD
NOME_CD HAVING SUM(TP.VAL_CD) > 100.00
GO
Esta clusula determina que, alm das linhas normalmente oferecidas por GROUP BY,
tambm sejam obtidas como resultado as linhas de sumrio. O sumrio dos grupos feito em
uma ordem hierrquica, a partir do nvel mais baixo at o mais alto. A ordem que define a
hierarquia do grupo determinada pela ordem na qual so definidas as colunas agrupadas.
Caso esta ordem seja alterada, a quantidade de linhas produzidas pode ser afetada.
Dessa forma, possvel analisar diversas informaes em uma s coluna, por exemplo,
a gravadora que possui a menor quantidade de ttulos em estoque.
e Vejamos:
SELECT
GRAV.NOME_GRAV,
TIT.NOME_CD, TIT.QTD_ESTQ
QTD_ESTQ,
SUM(TIT.QTD_ESTQ) AS [TOTAL_ESTQ]
FROM TITULOS AS TIT
INNER JOIN GRAVADORAS AS GRAV ON GRAV.COD_GRAV = TIT.COD_GRAV
COD_GRAV
GROUP BY GRAV.NOME_GRAV
NOME_GRAV, TIT.NOME_CD, TIT.QTD_ESTQ WITH ROLLUP
GO
97
Observe a imagem abaixo:
Visto que a clusula CUBE responsvel por retornar todas as combinaes possveis
de grupos e subgrupos, a quantidade de linhas no est relacionada ordem em que so
determinadas as colunas de agrupamento, sendo, portanto, mantida a quantidade de linhas j
apresentadas.
A clusula WITH CUBE,, em conjunto GROUP BY,, gera toais e subtotais, apresentando
vrios agrupamentos de acordo com as colunas definidas com o GROUP BY. BY Vejamos o
mesmo exemplo anterior, s que com WITH CUBE:
98
SELECT
GRAV.NOME_GRAV,
TIT.NOME_CD, TIT.QTD_ESTQ
QTD_ESTQ,
SUM(TIT.QTD_ESTQ) AS [TOTAL_ESTQ]
FROM TITULOS AS TIT
INNER JOIN GRAVADORAS AS GRAV ON GRAV.COD_GRAV = TIT.COD_GRAV
COD_GRAV
GROUP BY GRAV.NOME_GRAV
NOME_GRAV, TIT.NOME_CD, TIT.QTD_ESTQ WITH CUBE
GO
Observe que o retorno de linhas superior ao exemplo anterior, pois nas linhas abaixo,
a clusula WITH CUBE fez todas as combinaes possveis com os dados passados.
99
Exerccios
Resposta:
Resposta:
3. Qual a clusula que, utilizada em parceria com a clusula GROUP BY, acrescenta uma
linha na qual so exibidos os subtotais e totais dos registros j distribudos em colunas
agrupadas?
Resposta:
Resposta:
Resposta:
100
Laboratrio
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
6. Exiba quantos pedidos cada cliente fez, mostrando o nome dos clientes.
Resposta:
101
7. Exiba quantos CDs possui cada categoria, mostrando o nome das mesmas.
Resposta:
8. Exiba quantos CDs possui cada gravadora, mostrando o nome das mesmas.
Resposta:
9. Exiba quantos pedidos cada funcionrio atendeu, mostrando o nome dos funcionrios.
Resposta:
10. Exiba quantos dependentes cada funcionrio possui, mostrando seus nomes.
Resposta:
102
Captulo 11
A partir deste captulo, iremos mais afundo nos aspectos tcnicos do SQL Server 2005 e
veremos a complementao de comandos vistos anteriormente.
Um database criado pelo SQL Server 2005 formado por, no mnimo, dois arquivos de
sistema: um arquivo de dados e um arquivo de armazenamento de log. Porm , tal database
pode ter trs ou mais arquivos dependendo da necessidade.
Apresenta a extenso .mdf como padro. O PRIMARY DATA FILE aponta para os
demais arquivos do database. no arquivo de dados primrio, alm do database MASTER,
que registrada a localizao de todos os arquivos no database. Porm, na maioria das vezes,
o DATABASE ENGINE utiliza as informaes de localizao provenientes do database
MASTER.
103
Arquivo de Log (LOG DATA FILE)
Um arquivo do SQL Server formado por dois nomes: um nome fsico e outro lgico. O
nome fsico utilizado para se referir ao arquivo fsico no disco, enquanto o nome lgico o
nome utilizado para nos referirmos aos arquivos fsicos em todas as instrues do Transact-
SQL.
A utilizao de FILEGROUPs pode ser til caso estejamos trabalhando com uma
configurao de hardware caracterizada por vrios discos rgidos (disk arrays). Neste caso, os
discos pode ser preparados para alocar objetos e arquivos especficos, que por sua vez,
estaro contidos em FILEGROUPs.
Recomendaes de Uso
Mltiplos Arquivos
Tabelas
Grandes dados de objetos, assim como tabelas e ndices, podem ser associados a um
FILEGROUP especfico. Essas tabelas e ndices podem ser particionados. Quando isso feito,
os dados so separados em unidades, sendo que cada uma das unidades pode ser colocada em
um FILEGROUP distinto, no database.
105
Para obter uma performance melhor, recomenda-se separar em FILEGROUPs distintos
as diferentes tabelas utilizadas nas mesmas consultas JOIN, para se obter um acesso paralelo
aos dados. Tambm aconselhvel separar em FILEGROUPs distintos as tabelas de maior
acesso e os ndices NONCLUSTERED pertencentes a essas tabelas. Com os arquivos
localizados em discos diferentes, temos um acesso I/O paralelo, o que melhora em muito a
performance do sistema.
(
NAME = 'CAP_11_DADOS_2',
FILENAME = 'D:\CAP_11_DADOS_2.NDF',
SIZE = 20MB,
MAXSIZE = 500MB,
FILEGROWTH = 20MB
),
FILEGROUP FG_01
(
NAME = 'CAP_11_DADOS_3',
FILENAME = 'E:\CAP_11_DADOS_3.NDF',
SIZE = 10MB,
MAXSIZE = 250MB,
FILEGROWTH = 20%
),
(
NAME = 'CAP_11_DADOS_4',
FILENAME = 'F:\CAP_11_DADOS_4.NDF',
SIZE = 10MB,
MAXSIZE = 250MB,
FILEGROWTH = 20%
),
106
FILEGROUP FG_02
(
NAME = 'CAP_11_DADOS_5',
FILENAME = 'G:\CAP_11_DADOS_5.NDF',
SIZE = 10MB,
MAXSIZE = 1000MB,
FILEGROWTH = 20%
)
LOG ON
(
NAME = 'CAP_11_LOG_1',
FILENAME = 'H:\CAP_11_LOG_1.LDF',
SIZE = 50MB,
MAXSIZE = 250MB,
FILEGROWTH = 50MB
),
(
NAME = 'CAP_11_LOG_2',
FILENAME = 'I:\CAP_11_LOG_2.LDF',
SIZE = 50MB,
MAXSIZE = 250MB,
FILEGROWTH = 50MB
)
GO
107
Transaction Log
Caso exista algum problema no meio de uma transao, quando o SQL Server iniciado
novamente, ele procura pelo Transaction Log as transaes no finalizadas (transaes no
marcadas com o CHECKPOINT). Esse processo denominado RECOVERY. Para que seja
possvel identificar uma transao, necessrio informar o SQL Server. Para tal, usamos as
instrues BEGIN TRANSACTION, para marcar o incio da transao e COMMIT
TRANSACTION para finalizar a transao com sucesso. Caso seja necessrio abortar a
transao, usamos o comando ROLLBACK TRANSACTION.
108
Exerccios
Resposta:
2. Que so FILEGROUPs?
Resposta:
Resposta:
Resposta:
109
5. Quais das alternativas a seguir so caractersticas dos FILEGROUPs?
6. Qual das alternativas a seguir uma afirmativa correta com relao s regras
atribudas aos files e FILEGROUPs?
7. Qual das alternativas a seguir correta com relao aos arquivos fsicos gerados pelo
SQL Server?
110
8. Qual a definio de Transaction Log?
A.
B.
C.
111
D.
E.
112
Laboratrio
Resposta:
113
Captulo 12
O usurio pode definir seus prprios datatypes com base nos tipos de dados fornecidos
pelo SQL Server. Conhecidos como UDDTs, o tipo de dado definido pelo usurio tambm pode
ser considerado sinnimo de um tipo j disponvel.
Para que possamos descart-la, necessrio que nenhuma tabela esteja usando esse
UDDT. Caso contrrio impossvel.
114
NULL / NOT NULL
PRIMARY KEY
Para que uma linha seja identificada como nica dentro de uma tabela, devemos
garantir a integridade de entidades por meio da constraint PRIMARY KEY. Assim que essa
constraint definida no momento da criao ou da alterao de uma tabela, podemos definir
tambm a chave primria.
importante lembrar que cada tabela pode apresentar apenas uma constraint deste
tipo. Uma vez definida como chave primria, uma coluna no deve aceitar valores nulos. Caso
essa constraint seja atribuda para mais de uma coluna, a combinao de valores dessas duas
colunas dever ser nica.
Para garantir a integridade referencial entre duas tabelas, preciso definir a constraint
FOREIGN KEY / REFERENCES quando ambas so criadas ou alteradas. Uma consulta definida
como PRIMARY KEY na tabela de origem poder receber o atributo de chave estrangeira em
outra coluna, de modo que seja criada uma ligao entre as duas.
Valores nulos so aceitos nas constraints FOREIGN KEY / REFERENCES, porm, sua
presena faz com que ela interrompa a verificao dos demais valores existentes. Portanto
devemos especificar o valor NOT NULL nas colunas definidas como FOREIGN KEY /
REFERENCES para que a verificao seja completa.
115
DEFAULT
RULEs
116
Para criar um objeto RULE, devemos proceder da seguinte forma:
CREATE RULE R_SIM_NAO
AS @VAR IN ('S','N')
GO
Ao Em Cadeia
Para remover uma constraint de uma tabela, utilizamos o comando ALTER TABLE da
seguinte forma:
Devemos lembrar que caso seja necessrio remover uma constraint do tipo PRIMARY
KEY, ela no pode estar referenciada em nenhuma outra tabela como FOREIGN KEY /
REFERENCES, ou seja, essa PRIMARY KEY no pode ser uma chave estrangeira para outra
tabela. Para que possamos remov-la, ento, necessrio primeiramente remover a FOREIGN
KEY / REFERENCES da tabela qual ela faz referncia e depois remov-la.
Para adicionar uma constraint a uma tabela, utilizamos o comando ALTER TABLE da
seguinte forma:
118
Removendo Uma Coluna da Tabela
possvel remover uma coluna de uma tabela, caso ela no esteja mais sendo usada ou
pode ser descartada sem afetar o sistema. Faamos:
119
IDENTITY
Para que IDENTITY seja utilizado, devemos atribuir uma origem, tambm chamado de
SEED ou semente, e um incremento ou INCREMENT. Qualquer nmero inteiro por ser
definido para representar a semente ou o incremento. Vejamos um exemplo:
CREATE TABLE CARROS
(
CODIGO INT IDENTITY(1,1) NOT NULL,
MARCA VARCHAR(20),
MODELO VARCHAR(20),
Podemos adicionar uma coluna IDENTITY a uma tabela j criada da seguinte forma:
Apesar de este mtodo poder inserir uma coluna IDENTITY, ele no modifica a
propriedade de uma coluna em especfico.
SET IDENTITY_INSERT
A propriedade SET IDENTITY_INSERT pode ser definida como ON apenas para uma
tabela que possua uma coluna IDENTITY de um database. Caso essa propriedade j esteja
configurada como ON em uma tabela e o comando SET IDENTITY_INSERT ON esteja
relacionado outra tabela uma mensagem de erro ser retornada pelo SQL Server.
120
Obtendo Informaes da Coluna IDENTITY
DBCC CHECKIDENT
Caso o parmetro RESEED seja informado, isso determinar que ser preciso
reinicializar o valor do IDENTITY. J o parmetro NORESEED informa que no ser preciso
reinicializar o valor do IDENTITY.
IDENTITYCOL
IDENT_CURRENT
121
IDENTITY_INCR
IDENTITY_SEED
@@IDENTITY
SCOPE_IDENTITY
Retorna o valor mais recente atribudo a uma coluna IDENTITY. Esta coluna pode
pertencer a qualquer tabela que faa parte de um escopo de uma PROCEDURE ou qualquer
TRIGGER.
122
Exerccios
Resposta:
Resposta:
Resposta:
Resposta:
123
6. Qual das alternativas a seguir possui Built-in Datatypes baseados em caracters?
a. char, nchar, bigint
b. varchar, char, bit
c. ntext, char, nvarchar
d. varchar, char, text
e. bit, int, text
7. Que alternativa apresenta as diferentes constraints que podem ser utilizadas no SQL
Server para otimizar a integridade dos dados encontrados nas colunas de uma tabela?
a. PRIMARY KEY, FOREIGN KEY/REFERENCES, UNIQUE, CHECK E DEFAULT
b. IDENTITY, UNIQUE, CHECK, ON DELETE CASCADE, DEFAULT
c. PRIMARY KEY, IDENTITY, DEFAULT, FOREIGN KEY/REFERENCES, CHECK
d. ON DELETE CASCADE, PRIMARY KEY, FOREIGN KEY/REFERENCES, CHECK
e. CHECK, REFERENCES, IDENTITY, PRIMARY KEY, UNIQUE
8. Que alternativa contm o comando que exibe o valor mais recente que foi definido para
uma coluna Identity pelo SQL Server?
a. IDENTITY_SEED
b. IDENTITYCOL
c. SCOPE_IDENTITY
d. SET IDENTITY_INSERT_ON
e. IDENT_INCR
9. Que alternativa apresenta as palavras que devem ser inseridas nos espaos em branco
da afirmativa a seguir? Derivados dos system datatypes, os _________ so voltados
especificamente para o banco de dados no qual esses esto sendo criados. Portanto,
no possvel utiliz-los em outros bancos de dados. A exceo fica por conta dos
___________ criados no database ____________, pois os databases subsequentes tambm
possuiro esses datatypes.
a. Rules / UDDTs / TempDB
b. Defaults / Rules / TempDB
c. User Definided Datatypes / Defautls / Master
d. User Definided Datatypes / UDDTs / Model
e. Rules / Defaults / Model
124
Laboratrio
Resposta:
125
Captulo 13
Definimos uma VIEW como sendo uma tabela virtual composta por linhas e colunas de
dados, os quais so provenientes de tabelas referenciadas em uma query que define a VIEW.
Essas linhas e colunas so geradas de forma dinmica no momento em que feita uma
referncia a uma VIEW.
A query que determina a VIEW pode ser proveniente de uma ou mais tabelas ou de
outras VIEWs. Para determinar uma VIEW que utiliza dados provenientes de fontes distintas,
podemos utilizar as queries distribudas.
Ao criarmos uma VIEW, podemos filtrar o contedo de uma tabela a ser exibido, visto
que ela um filtro de tabelas que pode auxiliar no agrupamento de dados das tabelas,
protegendo certas colunas e simplificando o cdigo de uma programao.
Mesmo que o SQL Server seja desligado, depois de criada, a VIEW no deixa de existir
no sistema. Embora sejam internamente compostas por SELECTs, as VIEWs no ocupam
espao no banco de dados.
Tabela: FUNCIONARIOS
1 CORNELIO MARISTOS 1
2 CLEIDI CORONHA 1
4 CASIMIRO CASADO 3
5 FERDINANDO FERNADEZ 4
126
Tabela: CARGOS
1 FAXINEIRO
2 ESTAGIARIO
3 GERENTE
4 PRESIDENTE
Iremos criar uma VIEW que nos retornar o nome do funcionrio e o cargo ocupado
por este. Criando nossa VIEW, essa fica da seguinte forma:
CREATE VIEW V_NOME_FUNC_CARGO AS
SELECT F.NOME, C.NOME_CARGO FROM FUNCIONARIOS AS F
INNER JOIN CARGOS AS C ON F.COD_CARGO = C.COD_CARGO
GO
127
WITH ENCRYPTION
Caso o usurio tente inserir, por meio da VIEW um produto com o valor superior a
400,00, o SQL Server ir permitir, pois no h nenhum tipo de checagem com relao ao valor
do produto. Mas caso usssemos a clusula WITH CHECK OPTION, isso impediria o usurio
de, por meio da VIEW, incluir um produto com o valor superior a 400,00. Vejamos:
CREATE VIEW V_PRODUTOS_VALOR400_WCO AS
SELECT * FROM PRODUTOS WHERE VALOR <= 400
WITH CHECK OPTION
GO
Agora tentaremos incluir um produto com o valor acima de 400,00 por meio da VIEW.
Vejamos:
INSERT INTO V_PRODUTOS_VALOR400_WCO VALUES (11,'GABINETE','INFORMATICA',100,500)
GO
128
Observe a mensagem gerada pelo SQL Server:
Caso seja necessrio alterar a estrutura de uma VIEW,, devemos utilizar o comando
ALTER VIEW,, da seguinte forma:
VIEWs Indexadas
A criao de ndices sobre uma VIEW uma tarefa que requer a observao
obse de algumas
regras. Vejamos:
129
O primeiro ndice a ser criado sobre uma VIEW deve ser do tipo CLUSTERED e
UNIQUE.
Os nomes de tabelas e funes que se encontram dentro de uma VIEW devem ser
formados por duas partes.
130
Exerccios
Resposta:
Resposta:
Resposta:
4. Qual comando podemos utilizar para alterar uma VIEW sem excluir as permisses j
atribudas a ela?
Resposta:
131
Captulo 14
Variveis de Usurio
Uma varivel local do Transact-SQL um objeto nos scripts e batches que mantm um
valor de dado. Por meio do comando DECLARE, podemos criar variveis locais, sendo isto
feito no corpo de um procedimento ou batch.
ou
Como podemos observar, todo nome de varivel precedido do caractere '@' (arroba).
A sintaxe bsica de declarao a seguinte:
132
Controle de Fluxo
IF [expressao_booleana]
{ comando_sql | bloco_comando }
[ ELSE
{ comando_sql | bloco_comando } ]
Caso o bloco de comando tenha mais de duas linhas, necessrio o uso de BEGIN / END.
Similar a linguagem PASCAL e DELPHI, com exceo da no utilizao do ';' ou '.' no final do
END .
CASE / WHEN / THEN / END: O elemento CASE utilizado para conferir uma lista de
condies e, ento, retornar uma entre as vrias expresses de resultados possveis.
especialmente til quando queremos evitar IFs aninhados. Sintaxe bsica:
SELECT
CASE [nome_coluna]
...
ELSE [novo_valor]
END
FROM [nome_tabela]
Um exemplo prtico o caso em que desejamos exibir o sexo, por extenso, dos
funcionrios da nossa loja de CDs. Usando o database DB_CDS, procederemos da seguinte
forma:
133
SELECT COD_FUNC,
NOME_FUNC,
END_FUNC,
SAL_FUNC,
'SEXO_FUNC' = CASE SEXO_FUNC
WHEN 'F' THEN 'FEMININO'
WHEN 'M' THEN 'MASCULINO'
END
FROM FUNCIONARIOS
GO
WHILE: Este comando faz com que o comando SQL ou bloco de comando seja executado
repetidamente ou at o momento em quem uma condio verdadeira. Vejamos a sintaxe:
WHILE [condicao_booleana]
BEGIN
[comando1]
...
[comandoN]
END
TRY ... CATCH: Esses comandos so utilizados para tratar e controlar erros em grupos de
comandos do SQL Server. Vejamos a sintaxe:
BEGIN TRY
{ comando_sql | bloco_comando }
END TRY
BEGIN CATCH
{ comando_sql | bloco_comando }
END CATCH [ ; ]
134
A seguir, destacamos algumas consideraes relacionadas aos comandos TRY e CATCH:
A fim de obter informaes sobre o erro que provocou a execuo do bloco CATCH,
dispomos de vrias funes de sistema que devem ser utilizadas em qualquer parte do escopo
de um bloco CATCH. Caso no sejam utilizadas nesse escopo, as funes retornam NULL.
135
A seguir, descrevemos as funes de sistema disponveis para obter informaes de
erro a partir do bloco CATCH:
Porm, existem certos tipos de informaes de erro que no so identificados por uma
construo TRY / CATCH, tipos estes descritos abaixo:
EXECUTE
ou
136
Na primeira sintaxe, temos @retorno e nome_procedure. @retorno representa uma
varivel que armazena o estado de uma STORED PROCEDURE, e deve ser declarada antes de
ser utilizada em EXECUTE. @retorno inteira (INT) e opcional.
STORED PROCEDURE
Aplicaes criadas por meio do SQL Server podem ser armazenadas como STORED
PROCEDUREs. Assim, podemos criar aplicaes com a finalidade de executar essas STORED
PROCEDUREs e fazer o processamento dos resultados.
137
System Stored Procedure
Caractersticas:
138
General Extended Stored Procedures: A partir de uma instncia do SQL Server,
oferece uma interface para programas de diversas atividades de manuteno.
139
Stored Procedures Temporrias
Podem ser locais ou globais. A forma dessa identificao feita por meio do caractere
'#' (sharp) precedendo o nome da procedure.
Valor 1: Ao ajustarmos REMOTE ACCESS para este valor, ser permitido executar STORED
PROCEDUREs locais a partir de servidores remotos e vice-versa.
Nota: Nas verses posteriores do SQL Server essa opo no ser mais
possvel. aconselhvel no utiliz-lo para desenvolver novos projetos.
140
Stored Procedures Locais
SET @SOMA = 10 + 50
RETURN
END
GO
Para execut-la:
EXEC SP_SOMA
GO
Para que possamos visualizar essa STORED PROCEDURE, expanda o n MINHA_DB ->
PROGRAMMABILITY -> STORED PROCEDURES.
Parmetros
SET @SOMA = @A + @B
RETURN
END
GO
Para execut-la:
EXEC SP_SOMA2 10, 50
GO
141
Passagem de Parmetro Por Referncia
Um tipo de passagem de parmetro que pode ser utilizado a passagem por referncia.
Nesse tipo de passagem utilizada a palavra chave OUTPUT a fim de retornar um parmetro
de sada.
Vejamos um exemplo:
CREATE PROCEDURE SP_MULTIPLICA
( @A INT, @B INT, @RESULT INT OUTPUT ) AS
BEGIN
SET @RESULT = @A * @B
RETURN
END
GO
Para que possamos receber a sada dessa procedure, devemos proceder da seguinte
forma:
DECLARE @X INT
EXEC SP_MULTIPLICA 20, 20, @X OUTPUT
SELECT @X
Retornando Um Valor
Por meio do comando RETURN, possvel fazer com que a procedure retorne um
valor, que deve ser obrigatoriamente um valor inteiro. Vejamos:
CREATE PROCEDURE SP_DIVIDE
( @A INT, @B INT ) AS
BEGIN
DECLARE @C INT
SET @C = @A / @B
RETURN @C
END
GO
Para que possamos receber o retorno dessa procedure, temos o cdigo dessa forma:
DECLARE @X INT
EXEC @X = SP_DIVIDE 100, 10
PRINT @X
142
A Criao de Uma STORED PROCEDURE
Assim que uma STORED PROCEDURE criada, podemos referenci-la a objetos ainda
inexistentes no banco de dados. Neste caso, os objetos devero existir apenas quando a
procedure for executada. Essa referncia antecipada a objetos possvel pelo processo
chamado delayed name resolution.
Otimizao da Procedure
Uma procedure sofre um processo de otimizao caso ela tenha atingido o estgio
resolution de maneira bem sucedida.O SQL Server possui um otimizador de queries, que
desenvolve para a procedure um plano de execuo que possui mtodos de acesso rpido a
dados. Para que o otimizador possa realizar essa tarefa, ele analisa os comando internos da
procedure. Os ndices, a quantidade de dados que as tabelas apresentam, os JOINs, UNIONs,
GROUP BYs e ORDER BYs, e os valores e operadores utilizados na clusula WHERE so os
fatores que o processador de queries considera para criar o plano de otimizao para a
procedure.
143
Compilao da Procedure
importante considerar:
144
Excluindo Uma Procedure
BEGIN
{ comando_sql | bloco_comando }
RETURN
END
146
Exerccios
Resposta:
Resposta:
Resposta:
Resposta:
5. Cite alguns aspectos que devemos levar em considerao na criao de uma STORED
PROCEDURE.
Resposta:
147
6. A qual tipo de STORED PROCEDURE o pargrafo a seguir se refere? So criadas
quando o SQL Server instalado nos bancos de dados de sistema. Quando
retornam valor 0 (ZERO), isto significa que a operao foi realizada com sucesso.
Valores diferentes de 0 (ZERO) indicam falha.
a. Stored Procedures Remotas.
b. Stored Procedures Locais.
c. Extended Stored Procedures.
d. System Stored Procedures.
e. Stored Procedures Temporrias Locais e Globais.
7. Qual das alternativas a seguir NO uma caracterstica das Extend Stored Procedures
a. Podem ser adicionadas apenas ao banco de dados master.
b. No permitem a criao de rotinas externas prprias em linguagens de
programao. Uma dessas linguagens a C.
c. So programadas por meio da API do SQL Server Extended Stored Procedure.
d. So executadas diretamente no espao de endereo de uma instncia do SQL
Server.
e. No devem ser utilizadas para instanciar o tempo de execuo de linguagem
comum do Microsoft .NET FrameWork e para execuo do cdigo gerenciado, j
que verses futuras do SQL Server no suportaro mais esse tipo de tarefa.
8. Qual das alternativas as seguir apresenta a descrio correta de um valor que pode ser
atribudo opo Remote Access?
a. Valor 0: Ao ajustarmos Remote Access para esse valor, ser permitido executar
STORED PROCEDUREs locais a partir de servidores remotos ou STORED
PROCEUDREs remotas a partir do servidor local.
b. Valor 1: Ao ajustarmos Remote Access para este valor, STORED PROCEDUREs locais
no sero executadas a partir de um servidor remoto e STORED PROCEDUREs
remotas no sero executadas no servidor local.
c. Valor 1: Ao ajustarmos Remote Access para este valor, no ser permitido executar
STORED PROCEDUREs locais a partir de servidores remotos mas podero ser
executadas STORED PROCEDUREs remotas a partir do servidor local.
d. Valor 0: Ao ajustarmos Remote Access para este valor, STORED PROCEDUREs locais
sero executadas a partir de um servidor remoto e STORED PROCEDUREs remotas
no sero executadas no servidor local.
e. Valor 0: Ao ajustarmos Remote Access para este valor, STORED PROCEDUREs locais
no sero executadas a partir de um servidor remoto e STORED PROCEDUREs
remotas no sero executadas no servidor local.
148
9. Que palavra utilizada na passagem de parmetros por referncia?
a. EXECUTE.
b. OUTPUT
c. EXISTS
d. RETURN
e. UNION
149
Laboratrio
Para realizar este laboratrio, crie o database SISCOM com o seguinte scritp:
USE MASTER
GO
IF EXISTS(SELECT * FROM MASTER.DBO.SYSDATABASES
WHERE NAME LIKE '%SISCOM%')
DROP DATABASE SISCOM
GO
CREATE DATABASE SISCOM
ON PRIMARY
(
NAME = 'SISCOM_DADOS1',
FILENAME = 'C:\DADOS\SISCOM_DADOS1.MDF',
SIZE = 3MB,
MAXSIZE= 3MB,
FILEGROWTH = 1MB
),
FILEGROUP TABELAS
(
NAME = 'SISCOM_DADOS2',
FILENAME = 'C:\DADOS\SISCOM_DADOS2.NDF',
SIZE = 10MB,
MAXSIZE= 100MB,
FILEGROWTH = 10MB
),
FILEGROUP INDICES
(
NAME = 'SISCOM_DADOS3',
FILENAME = 'C:\DADOS\SISCOM_DADOS3.NDF',
SIZE = 10MB,
MAXSIZE= 100MB,
FILEGROWTH = 10MB
)
LOG ON
(
NAME = 'SISCOM_LOG',
FILENAME = 'C:\DADOS\SISCOM_LOG.LDF',
SIZE = 1MB,
MAXSIZE= 10MB,
FILEGROWTH = 1MB
)
GO
/* ********************************************************************** */
USE SISCOM
GO
EXEC SP_ADDTYPE 'CODIGO', 'INT', 'NOT NULL'
EXEC SP_ADDTYPE 'NOME', 'CHAR(100)', 'NOT NULL'
EXEC SP_ADDTYPE 'MOEDA','DECIMAL(10,2)','NOT NULL'
EXEC SP_ADDTYPE 'SEXO', 'CHAR(1)','NOT NULL'
EXEC SP_ADDTYPE 'DDD', 'CHAR(3)', 'NOT NULL'
EXEC SP_ADDTYPE 'FONE','CHAR(10)', 'NOT NULL'
EXEC SP_ADDTYPE 'RG','CHAR(15)', 'NOT NULL'
EXEC SP_ADDTYPE 'CPF','CHAR(20)','NOT NULL'
EXEC SP_ADDTYPE 'DATA','SMALLDATETIME','NOT NULL'
EXEC SP_ADDTYPE 'VALOR','DECIMAL(10,2)','NOT NULL'
GO
/* ********************************************************************** */
CREATE RULE R_MOEDA
AS @MOEDA >= 200.00
150
GO
CREATE RULE R_SEXO
AS @SEXO IN ('F','M')
GO
/* ********************************************************************** */
CREATE DEFAULT D_MOEDA
AS 200.00
GO
151
)ON TABELAS
GO
152
SET DATA_NASCCLI =
CONVERT(SMALLDATETIME, CONVERT (CHAR(2),DATEPART(MM,'01/01/01')) + '/' +
CONVERT(CHAR(2),DATEPART(DD,'01/01/01'))+ '/' +
CONVERT(CHAR(4),DATEPART(YY,'01/01/01') - COD_CLI - 30))
GO
/* ********************************************************************** */
CREATE TABLE CONJUGE
(
COD_CLI CODIGO,
NOME_CONJ NOME,
RENDA_CONJ MOEDA,
SEXO_CONJ SEXO,
CONSTRAINT PK_CONJ PRIMARY KEY(COD_CLI),
CONSTRAINT FK_CONJ FOREIGN KEY (COD_CLI) REFERENCES CLIENTE(COD_CLI)
)ON TABELAS
GO
153
INSERT FONE VALUES(3,17,'555-4578','011')
INSERT FONE VALUES(3,18,'666-1245','011')
INSERT FONE VALUES(3,19,'777-3265','011')
INSERT FONE VALUES(4,20,'888-2154','011')
INSERT FONE VALUES(4,21,'999-1111','015')
INSERT FONE VALUES(4,21,'202-1222','015')
INSERT FONE VALUES(4,22,'254-3333','015')
INSERT FONE VALUES(1,23,'458-4444','015')
INSERT FONE VALUES(1,23,'874-5555','015')
INSERT FONE VALUES(1,24,'313-6666','015')
INSERT FONE VALUES(1,24,'587-7777','015')
INSERT FONE VALUES(2,25,'589-8888','015')
INSERT FONE VALUES(2,26,'999-9999','015')
INSERT FONE VALUES(2,27,'999-1010','015')
INSERT FONE VALUES(2,27,'111-1111','015')
INSERT FONE VALUES(3,28,'222-1212','015')
INSERT FONE VALUES(3,28,'333-1313','015')
INSERT FONE VALUES(3,28,'444-1414','015')
INSERT FONE VALUES(3,29,'555-1515','015')
INSERT FONE VALUES(4,29,'666-1616','015')
INSERT FONE VALUES(4,30,'777-1717','015')
INSERT FONE VALUES(4,31,'888-1818','015')
INSERT FONE VALUES(4,32,'999-1919','015')
INSERT FONE VALUES(4,33,'101-2020','015')
INSERT FONE VALUES(4,34,'555-2121','021')
INSERT FONE VALUES(4,35,'333-2222','021')
INSERT FONE VALUES(4,36,'717-2323','021')
INSERT FONE VALUES(3,37,'656-2424','021')
INSERT FONE VALUES(3,38,'374-2525','021')
INSERT FONE VALUES(3,39,'859-2626','021')
INSERT FONE VALUES(3,40,'222-2727','021')
INSERT FONE VALUES(3,41,'256-2828','021')
INSERT FONE VALUES(3,42,'542-2929','021')
INSERT FONE VALUES(2,43,'578-3030','021')
INSERT FONE VALUES(2,44,'896-4041','021')
INSERT FONE VALUES(2,45,'369-5050','021')
INSERT FONE VALUES(2,46,'132-5151','021')
INSERT FONE VALUES(1,47,'321-6161','021')
INSERT FONE VALUES(1,48,'542-7171','011')
INSERT FONE VALUES(1,49,'201-8181','011')
INSERT FONE VALUES(1,50,'301-9191','011')
INSERT FONE VALUES(1,50,'401-1919','011')
INSERT FONE VALUES(1,50,'501-1818','011')
INSERT FONE VALUES(1,51,'601-1212','011')
INSERT FONE VALUES(1,52,'701-1313','011')
GO
/* ********************************************************************** */
CREATE TABLE FUNCIONARIO
(
COD_FUNC CODIGO IDENTITY,
NOME_FUNC NOME,
DATA_CADFUNC DATA NOT NULL DEFAULT GETDATE(),
SEXOFUNC SEXO,
SAL_FUNC MOEDA,
END_FUNC VARCHAR(100) NOT NULL,
CONSTRAINT PK_FUNC PRIMARY KEY(COD_FUNC)
) ON TABELAS
GO
154
INSERT FUNCIONARIO VALUES('ABLIO ABEL GARCIA','03/02/01','M',1000.00,'RUA C')
INSERT FUNCIONARIO VALUES('BIA BIANCA BONES','04/03/01','F',5000.25,'RUA D')
INSERT FUNCIONARIO VALUES('BEATRIZ BERTIOGA','05/05/01','F',300.00,'RUA E')
INSERT FUNCIONARIO VALUES('CAIO CESAR CEAREZ','06/05/01','M',250.00,'RUA F')
INSERT FUNCIONARIO VALUES('CELSO CESARE','07/06/01','M',1542.36,'RUA J')
INSERT FUNCIONARIO VALUES('DANILO DOUGLAS','08/06/01','M',1524.56,'RUA K')
INSERT FUNCIONARIO VALUES('DENIS DENILO','09/07/01','M',5235.56,'RUA L')
INSERT FUNCIONARIO VALUES('EVERTON EVARISTO','10/07/01','M',2542.25,'RUA M')
INSERT FUNCIONARIO VALUES('EVANIR EVA','11/08/01','M',4523.54,'RUA N')
INSERT FUNCIONARIO VALUES('FABIO FABRICIO','12/08/01','M',1524.25,'RUA O')
INSERT FUNCIONARIO VALUES('FABIOLA FABIOLO','02/01/02','F',2554.25,'RUA P')
INSERT FUNCIONARIO VALUES('GERALDO GOMES','03/010/02','M',1542.25,'RUA Q')
INSERT FUNCIONARIO VALUES('HELIO HELIPOLIS','04/01/02','M',1542.23,'RUA R')
INSERT FUNCIONARIO VALUES('IRINEU IRENE','05/02/02','M',2523.00,'RUA S')
INSERT FUNCIONARIO VALUES('JONAS JACKES','05/02/02','M',2500.00,'RUA T')
INSERT FUNCIONARIO VALUES('LEANDRO LAGO','06/02/02','M',1500.00,'RUA U')
INSERT FUNCIONARIO VALUES('LUCIO LACIO','07/03/02','M',2500.00,'RUA V')
INSERT FUNCIONARIO VALUES('LECIO LICIO','08/04/02','M',1420.00,'RUA X')
INSERT FUNCIONARIO VALUES('MARIO MENDES','06/02/02','M',1262.00,'RUA W')
INSERT FUNCIONARIO VALUES('OLAVO ODAVLAS','07/07/02','M',1540.00,'RUA Y')
GO
/* ********************************************************************* */
CREATE TABLE DEPENDENTE
(
COD_DEP CODIGO IDENTITY,
COD_FUNC CODIGO,
NOME_DEP NOME,
SEXO_DEP SEXO,
DATA_NASCDEP DATA,
CONSTRAINT PK_DEP PRIMARY KEY(COD_DEP),
CONSTRAINT FK_DEP FOREIGN KEY (COD_FUNC) REFERENCES FUNCIONARIO(COD_FUNC)
) ON TABELAS
GO
155
NUM_PED CODIGO IDENTITY NOT NULL,
COD_CLI CODIGO NOT NULL,
COD_FUNC CODIGO NOT NULL,
DATA_PED DATA NOT NULL,
VAL_PED VALOR NOT NULL,
CONSTRAINT PK_PED PRIMARY KEY(NUM_PED),
CONSTRAINT FK_PED1 FOREIGN KEY(COD_CLI) REFERENCES CLIENTE(COD_CLI),
CONSTRAINT FK_PED2 FOREIGN KEY(COD_FUNC) REFERENCES FUNCIONARIO(COD_FUNC)
) ON TABELAS
GO
/* ******************************************************************/
CREATE PROCEDURE P_ENCHEPEDIDO
AS
DECLARE @COD_FUNC INT,
@COD_CLI INT,
@COD_STA INT,
@DATA VARCHAR(255),
@DATAPED SMALLDATETIME,
@VALOR DECIMAL(10,2)
SET @COD_FUNC = 1
SET @COD_CLI = 1
SET @COD_STA = 1
156
VAL_UNIT VALOR NOT NULL,
CONSTRAINT PK_PRODUTO PRIMARY KEY(COD_PROD),
CONSTRAINT FK_PRODUTO FOREIGN KEY(COD_TIPOPROD) REFERENCES
TIPOPROD(COD_TIPOPROD),
CONSTRAINT UQ_PRODUTO UNIQUE(NOME_PROD)
)
GO
157
-- OBTENDO INFORMAES:
USE SISCOM
Resposta:
Resposta:
3. Criar uma procedure que receba o cdigo do funcionrio como parmetro. Verificar se
este funcionrio tem dependente. Se ele possuir dependentes, aplicar um desconto de
5.00 no seu salrio. Se ele no tiver dependente, aplicar um aumento salarial de 500.00
para este funcionrio.
Resposta:
158
Captulo 15
Transaes
comum que uma unidade lgica de trabalho seja formada por diversas operaes do
banco de dados. Um Exemplo que ocorre com bastante freqncia a transferncia de fundos,
em que temos o dbito de uma conta para o crdito em outra. Para que este tipo de operao
seja realizado da forma adequada, a consistncia do banco de dados essencial, visto que ou
as duas operaes so realizadas, ou nenhuma . Isso significa que, se algum erro impedir a
operao de parte do dbito, o crdito no ser realizado. Este requerimento, em que tudo
ou nada, denominado atomicidade. Cada transao uma unidade de atomicidade.
O tratamento das falhas deve ser realizado de acordo com seu tipo. As falhas mais
simples so aquelas que no resultam em perda de informaes. J as falhas mais complexas e,
portanto, mais difceis de serem tratadas so aquelas que resultam na perda de informao.
Este tipo de falha pode fazer com que o banco de dados perca sua consistncia. Novamente,
devemos ressaltar que a consistncia do banco de dados depende da atomicidade das
transaes.
159
Exemplo de Transao
IF @@ERROR <> 0
BEGIN
RAISERROR(50002
50002, 16, 1)
ROLLBACK TRANSACTION T_UPDATE_SALARIO
END
ELSE
COMMIT TRANSACTION T_UPDATE_SALARIO
GO
Executando este script, teremos como retorno um erro, pois uma constraint CHECK
definida na coluna SAL_FUNC de FUNCIONARIOS nos impede de alterar o salrio de um
funcionrio para um valor inferior 0 (zero). Vejamos o erro:
160
Transaes Explcitas
Transaes Implcitas
O comando SET permite criar transaes implcitas para aplicao que foram
desenvolvidas em sistemas diferentes do SQL Server. Vejamos sua aplicao:
Caso j exista uma transao implcita na conexo, o comando SET no iniciar outra
transao, visto que no so permitidas as transaes aninhadas. Nas situaes em que essa
transao estiver configurada para ON, seu encerramento deve ser feito por meio da execuo
explcita de um dos seguintes comandos: COMMIT ou ROLLBACK TRANSACTION. Se a
transao no for desfeita dessa maneira, as alteraes e dados modificadas sero desfeitos
no momento em que o usurio se desconectar. Por padro, a transao ser configurada para
OFF. Quando a transao anterior encerrada, inicia-se uma nova transao de forma
implcita.
161
Consideraes Sobre Transaes
Antes que a transao seja iniciada, devemos executar a maior quantidade possvel de
comandos. Alm disso, com os comandos DELETE e UPDATE, devemos utilizar a clusula
WHERE.
Manipulando Erros
Alm disso, devemos ter em mente que a manipulao de erros que abortam batches
pode ser realizada por uma construo do tipo TRY / CATCH nas situaes em que a execuo
dos batches e das stored procedures remotas realizada dentro do escopo de um bloco TRY.
A configurao de SET XACT_ABORT do servidor local utilizada como base para determinar
o comportamento dos batches e das stored procedures remotas nas situaoes em que
ocorrem erros que abortam comandos e batches.
SET XACT_ABORT
Nas situaes em que a execuo da stored procedure remota que gerou o erro ocorre
no escopo do bloco TRY no servidor local, as informaes a respeito do ltimo erro ocorrido
no servidor remoto so passadas pelo controle para o bloco CATCH. J nas situaes em que a
162
stored procedure remota no executada no escopo de um bloco TRY, o valor de @@ERROR
no pode ser verificado.
A execuo mais adequada da stored procedure remota deve ocorrer a partir do bloco
TRY referente a uma construo TRY / CATCH. Com isso, caso haja problemas para que tal
procedure seja finalizada, a execuo direcionada ao bloco CATCH associado, o qual se
encontra no servidor local e possui informaes a respeito do ltimo erro gerado no servidor
remoto. J nas situaes em que a finalizao dessa procedure ocorrem sem problemas, a
execuo segue seu curso normal dentro do bloco TRY no servidor local. O resultado obtido
com esta execuo pode ser utilizado normalmente.
RAISERROR
Este comando responsvel por gerar uma mensagem de erro, a qual pode ser
construda de forma dinmica. Alm disso, RAISERROR pode fazer referncia a uma
mensagem definida pelo usurio que se encontra armazenada em SYS.MESSAGES, uma VIEW
de catlogo. Essa mensagem retornada para a aplicao que fez a chamada ou para o bloco
CATCH associado. Esse retorno ocorre como se a mensagem fosse um erro do servidor.
RAISERROR gera erros que funcionam de forma semelhante aos erros gerados pelo
cdigo Database Engine. Os valores referentes a esses erros so relatados pelas seguintes
funes de sistema: @@ERROR, ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER,
ERROR_PROCEDURE, ERROR_SEVERITY e ERROR_STATE.
Vale destacar, tambm, que RAISERROR pode ser utilizada por blocos CATCH com a
finalidade de lanar novamente um erro que invocou este tipo de bloco utilizando funes de
sistema para recuperar dados a respeito do erro original.
Nota: A incluso de uma mensagem definida pelo usurio feita por meio do
SP_ADDMESSAGE. J sua excluso feita por meio do SP_DROPMESSAGE.
A Varivel @@ERROR
Esta varivel tem a finalidade de retornar o nmero referente ao erro aps a execuo
de um comando Transact-SQL. Caso este nmero seja referente a um dos erros definidos na
VIEW de catlogo SYS.MESSAGES, o valor de @@ERROR referente coluna
SYS.MESSAGES.MESSAGE_ID relativa ao erro ocorrido. A partir de SYS.MESSAGES, possvel
verificar o texto correspondente ao erro.
O valor de @@ERROR deve ser verificado de forma imediata ou deve ser salvo em uma
varivel local a fim de que se possa ser verificado posteriormente. Isso se faz necessrio
porque esse valor excludo e @@ERROR reiniciado a cada comando executado. Observe o
exemplo a seguir:
DECLARE @ERRO INT
IF @ERRO <> 0
PRINT N'O nmero do erro gerado foi ' + CAST(@ERRO AS VARCHAR(10))
GO
164
Criando Uma Mensagem de Erro
Para criarmos uma mensagem de erro, necessrio fazer uso da stored procedure
SP_ADDMESSAGE,, que tem a seguinte sintaxe:
Em que:
Vejamos um exemplo:
USE MASTER
GO
RAISERROR (50001,16,1)
GO
165
Nesse caso, criamos essa mensagem no database MASTER,, mas ela pode ser criada na
database do usurio. A vantagem de se criar na MASTER que a mensagem fica acessvel a
qualquer usurio.
Como essa mensagem foi definida para escrever no log do Windows sempre que
acontecer, vejamos o Windows Logs:
166
Batch
Definimos batches como sendo um grupo composto por um ou mais comandos SQL que
uma aplicao envia, de uma nica vez, para serem executados pelo SQL Server. Caso haja
algum erro de compilao, o Plano de Execuo deixa de ser executado, o que significa que os
comandos que compem o batch tambm no so executados. J um erro ocorrido em tempo
de execuo poder apresentar um dos seguintes efeitos:
Grande parte dos erros ocorridos em tempo de execuo paralisam o comando atual e
o seguinte do batch. Apenas alguns erros em tempo de execuo paralisam somente o
comando atual, sem afetar os outros comandos batch.
O comando executado antes da ocorrncia do erro em tempo de execuo no
afetado. Apenas h uma exceo, que ocorre nas situaes em que o batch est em uma
transao e o erro causa um ROLLBACK. Quando isso ocorre, qualquer comando que
no tenha sido submetido ser desfeito.
167
Exerccios
Resposta:
Resposta:
Resposta:
4. Que um batch?
Resposta:
5. Quais so os efeitos que podem ser apresentados por um erro ocorrido em tempo de
execuo?
Resposta:
168
6. O que acontece quando o SET XACT_ABORT est configurado como ON no servidor
local?
a. gerada uma mensagem de erro, a qual pode ser construda deforma dinmica.
b. Ocorre uma converso dos erros que abortam batches e comandos na stored
procedure remota: todos eles so convertidos apenas para erros que abortam
batches.
c. Ocorre a excluso da mensagem definida pelo usurio, feita por meio do
SP_DROPMESSAGE.
d. gerada uma mensagem de erro, a qual s pode ser construda de forma no-
dinmica.
e. Ocorre uma converso dos erros que abortam somente os comandos na stored
procedure remota.
7. Que comando pode fazer referncia a uma mensagem definida pelo usurio, que se
encontra armazenada em SYSMESSAGES, uma VIEW de catlogo?
a. ROLLBACK
b. COMMIT
c. RAISERROR
d. RETURN
e. INSERT
169
9. Que plano de Execuo?
a. So comandos responsveis por iniciar a transao nas situaes em que no
ocorrem erros.
b. uma converso dos erros que abortam batches e comandos na stored procedure
remota.
c. Conjunto de transaes especficas ou definidas pelo usurio em verses anteriores
do SQL Server.
d. So comandos responsveis por encerrar a transao com xito nas situaes em
que no ocorrem erros.
e. So os comandos que compem um batch e so compilados pelo SQL Server em
uma nica unidade executvel.
170
Laboratrio
Crie uma procedure (utilizando transaes) que receba o cdigo do funcionrio como
parmetro e verifique o total do ltimo pedido que este funcionrio atendeu. Se este total for
maior do que 50,00 aplicar um prmio de 10% do valor do pedido para este funcionrio
(gravando uma linha correspondente na tabela PREMIO) e atribuir um desconto de 10% no
valor deste ltimo pedido. Para que possamos realizar este laboratrio, usaremos o database
SISCOM:
Resposta:
171
Captulo 16
Funes
Antes de trabalharmos com funes no SQL Server, devemos conhecer uma srie de
regras necessrias para sua utilizao, como veremos a seguir.
172
Funes Built-In
Por meio das UDFs, podemos executar uma determinada ao para obter um valor, que
pode ser tanto um nico valor escalar como um conjunto de valores. Essas rotinas ainda so
capazes de aceitar diversos parmetros, da mesma forma que a maioria das funes em outras
linguagens de programao.
Funes Escalares
Similares s funes built-in, retornam um nico valor. Esse valor retornado possui um
datatype definido na clusula RETURNS. Os parmetros de entrada podem ser aceitos ou
recusados por meio dessas funes, que podem ser utilizadas sempre que uma expresso
vlida.
O valor escalar de uma funo in-line obtido a partir de um s comando, sendo que
no existe corpo de funo neste caso. J uma funo que possui vrios comandos Transact-
SQL capaz de retornar um valor de qualquer datatype. O corpo desta funo definido no
bloco BEGIN / END.
173
Vejamos um exemplo de uma funo escalar:
CREATE FUNCTION F_AREA_QUADRADO (@LADO INT) RETURNS INT AS
BEGIN
RETURN (@LADO * @LADO)
@LADO
END
GO
--EXECUTANDO
EXECUTANDO A FUNO RECM CRIADA
SELECT DBO.F_AREA_QUADRADO
F_AREA_QUADRADO (5)
GO
Funes Table-Valued
As funes table-valued
valued utilizam um nico comando SELECT para retornar um
conjunto de resultados em forma de tabela, j que o datatype desse valor retornado TABLE.
Caso a funo table-valued
valued seja in-line,
in line, no existir corpo de funo. Vejamos um exemplo:
CREATE FUNCTION F_DATA_CADASTRO (@DATA SMALLDATETIME) RETURNS TABLE AS
RETURN (SELECT * FROM DBO.FUNCIONARIO WHERE CONVERT(CHAR
CHAR(08),
DATA_CADFUNC) = CONVERT(CHAR
CHAR(08), @DATA))
GO
--EXECUTANDO
EXECUTANDO A FUNO RECM CRIADA F_DATA_CADASTRO
SELECT * FROM F_DATA_CADASTRO ('2001-05-05')
GO
Crie e execute a funo a cima (ser necessrio o banco de dados SISCOM, visto no
laboratrio anterior).
174
Funes Que Contm Vrios Comandos e Que Retornam Dados de Uma
Tabela
RETURN
END
GO
175
Exerccios
1. Que so funes?
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
176
6. Quais das alternativas a seguir apresentam regras que devem ser consideradas quando
trabalhamos com funes?
a. Os valores escalares representam o nico retorno que pode ser obtido a partir de
uma funo.
b. Uma funo que foi definida pelo usurio no aceita parmetros de output.
c. Uma permisso de SELECT exigida para a execuo de uma User Defined Function
por parte do usurio.
d. A execuo de uma funo escalar exige a utilizao do comando SELECT e do nome
qualificado por duas partes.
e. Os datatypes cursor, table ou timestamp podem ser utilizados nos parmetros de
entrada de uma funo no SQL Server.
8. Qual das alternativas apresenta as palavras que devem ser inseridas nos espaos em
branco do pargrafo a seguir? Similares s funes ___________, as funes
___________retornam um nico valor, pois operam com um s valor. Este valor retornado
possui um datatype definido na clusula __________.
a. User Defined Function / built-in / where
b. Escalares / User Defined Function / if
c. built-in / escalares / RETURNS
d. Escalares / built-in / where
e. built-in / escalares / else
177
Observe as afirmativas a seguir:
178
Captulo 17
TRIGGERs
TRIGGER x Transao
Tanto o TRIGGER como o comando que o acionou so tratados como transaes. Esta
transao pode ser desfeita em qualquer lugar de dentro do TRIGGER com o comando
ROLLBACK TRANSACTION. Caso seja utilizado, o ROLLBACK ir desfazer tudo o que o
TRIGGER tenha feito at o momento e tambm o que o comando fez antes do TRIGGER.
Para que possamos ver um exemplo funcional, vamos criar duas tabelas
(FUNCIONARIOS e HISTORICOS). Utilize o database MINHA_DB para esse exemplo, caso o
database j possua uma tabela chamada FUNCIONARIOS, "drope-a". Elimine tambm as
VIEWs associadas, caso seja necessrio.
Tabela: FUNCIONARIOS
1 CARLOS 35 2500.00
2 RENATO 36 2000.00
3 JOAO 34 3000.00
4 JOANA 18 1000.00
179
5 CARMEN 27 700.00
6 RAQUEL 25 3500.00
7 MARIA 28 2000.00
Tabela: HISTORICOS
1 2500.00 25/02/06
2 2000.00 30/03/06
3 3000.00 24/04/06
4 1000.00 25/06/06
5 700.00 27/07/06
6 3500.00 28/07/06
Agora, para que possamos ver o funcionamento do TRIGGER, inclua um novo registro
na tabela funcionrios. Depois, use o comando SELECT na tabela HISTORICOS e observe os
registros.
INSERT INTO FUNCIONARIOS VALUES ('MARCO',25,2000.00)
GO
180
Observe a imagem abaixo:
O comando INSERT,, portanto, aciona o TRIGGER que executa o cdigo interno. Este
tipo de TRIGGER,, cujo acionamento ocorre no momento em que dados so inclusos na tabela,
capaz de executar internamente qualquer um dos seguintes comandos: SELECT, UPDATE,
INSERT e DELETE.. Os nicos comandos que no podem ser executados pelos TRIGGERs so:
CREATE (todos)
DROP (todos)
DISK (todos)
GRANT
LOAD
REVOKE
ALTER TABLE
ALTAR DATABASE
TRUNCATE TABLE
UPDATE STATISTICS
RECONFIGURE
RESTORE DATABASE
RESTORE LOG
SELECT INTO
181
TRIGGERs So Reativas
As constraints que j esto prontas podem ser adicionadas na tabela a fim de que as
regras de negcios comuns sejam mantidas. J para construir regras de negcios mais
complexas, preciso utilizar os TRIGGERs, os quais, diferentemente das constraints, so
reativos. Isso significa que, utilizando os TRIGGERs, o SQL Server primeiramente executa o
comando que o acionou e, depois, verifica a ocorrncia de erros; caso haja um erro, o comando
desfeito.
TRIGGER DDL
Para demonstrar o TRIGGER DDL, iremos criar um database chamado TESTE e uma
tabela com as colunas CODIGO (INT) e TEXTO (VARCHAR(20)) chamada MINHA_TABELA.
CREATE DATABASE TESTE
GO
USE TESTE
GO
182
Agora criaremos um TRIGGER que ser acionado assim que o usurio tentar excluir a
nossa tabela. Vejamos:
CREATE TRIGGER T_NAO_EXC_TABELA ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS
PRINT 'VOC NO TEM PERMISSO DE EXCLUIR ESTA TABELA!'
ROLLBACK TRANSACTION
GO
TRIGGERs Aninhados
183
O anhimamento de TRIGGERs configurado no momento da instalao do SQL Server,
mas tambm possvel habilitado posteriormente. Para habilitar o aninhamento de
TRIGGERs, devemos usar a STORED PROCEDURE SP_CONFIGURE. Observe:
-- DESABILITA TRIGGERS ANINHADOS
EXEC SP_CONFIGURE 'NESTED TRIGGERS', 0
GO
INSTEAD OF
Este comando responsvel por determinar que o TRIGGER DML seja executado ao
invs do comando SQL ser disparado. Com isso, as aes realizadas por comandos
disparadores so sobrescritas. Apenas um TRIGGER INSTEAD OF pode ser definido por
tabela ou em uma VIEW por cada comando INSERT, UPDATE ou DELETE. Apesar deste
aspecto, possvel definir VIEWs em outras VIEWs, cada uma delas possuindo seu prprio
TRIGGER INSTEAD OF.
184
Exerccios
Resposta:
Resposta:
Resposta:
Resposta:
Resposta:
185
6. Que comandos no podem ser executados com TRIGGERs?
a. CREATE(todos), DROP(todos), LOAD, INSERT
b. REVOKE, ALTER TABLE, TRUNCATE TABLE, DELETE
c. RECONFIGURE,SELECT INTO, UPDATE STATISTICS, INSERT
d. GRANT, ALTER TABLE, INSERT, SELECT INTO
e. RESTORE LOG, ALTER DATABASE, LOAD, GRANT
186
9. Escolha a alternativa que apresenta a palavra que deve ser inserida no espao em
branco da frase a seguir: Os TRIGGERs_______ no podem ser utilizados com VIEWs que
podem ser atualizadas e que utilizam WITH CHECK OPTION, pois, caso isso acontea,
o SQL Server gerar um erro.
a. Aninhados
b. de alterao
c. de excluso
d. de incluso
e. INSTEAD OF
187
Labortorio
1. Crie um TRIGGER de incluso na tabela FUNCIONARIO, que insira uma linha na tabela
PREMIO cada vez que um funcionrio do sexo feminino for inserido na tabela. O valor
do prmio dever ser de 200.00.
Resposta:
2. Crie um TRIGGER sobre a tabela ITENS. A cada item inserido, o TRIGGER dever
calcular o valor que deve ser pago neste item e atualizar o total do pedido na tabela
PEDIDO.
Resposta:
188
Captulo 18
Concorrncia
LOCKs
Por conta dos LOCKs, um mesmo dado no pode ser utilizado simultaneamente pelos
usurios. Assim, um usurio no ter a capacidade de ler e alterar dados que esto sendo
processados por um outro usurio, ou seja, no haver conflitos de UPDATE.
189
Tipos de LOCKs
Duas transaes podem ter um SHARED LOCK em um mesmo recurso, mesmo que
uma das transaes ainda no tenha sido finalizada.
Enquanto todas as linhas que iro satisfazer a query no forem enviadas para o cliente,
os SHARED LOCKs sero mantidos.
O UPDATE LOCK adotado pelo SQL Server na alterao de pginas de dados. Quando
isso feito, esse modo de LOCK promovido para o modo EXCLUSIVE LOCK, na pgina
alterada.
A fim de evitar o DEADLOCK descrito, necessrio que uma nica transao obtenha o
UPDATE LOCK em um recurso, de maneira que, caso um recurso seja alterado por uma
transao, tenhamos a converso do UPDATE LOCK para EXCLUSIVE LOCK. Caso no haja
alterao, o LOCK convertido para SHARED LOCK.
190
EXCLUSIVE (X) LOCKs
Este modo de LOCK evita que duas transaes possam alterar simultaneamente um
mesmo recurso. Os EXCLUSIVE LOCKs so utilizados em operaes para alterar dados, tais
como INSERT, UPDATE ou DELETE.
Uma das vantagens dos INTENT LOCK poupar o SQL Server de analisar todos os
LOCKs nas linhas ou pginas de uma tabela com o objetivo de definir se transao poder
alocar a tabela inteira. Isso traz um ganho de performance, j que o SQL Server precisa
examinar apenas os INTENT LOCKs na tabela.
EXTENT LOCKs
O SQL Server possuir LOCKs que bloqueiam outros processos que requerem um LOCK.
Esses LOCKs bloqueadores so denominados BLOCKING LOCKS.
Devido ao BLOCKING LOCK, um processo poder ter continuidade logo aps o trmino
do processo que est provocando o bloqueio.
191
SCHEMA (SCH) LOCKs
Estes LOCKs so utilizados com a finalidade de evitar que a tabela ou ndice assim
como seu esquema, seja destrudo ao ser referenciado por uma outra sesso.
Os SCHEMA LOCKs podem ser de dois tipos: SCHEMA STABILITY (SCH-S) e SCHEMA
MODIFICATION (SCH-M). O primeiro tipo evita a destruio de um recurso, enquanto o
segundo evita que outra seo possa fazer referncia a um recurso em alterao.
Granularidade
No SQL Server podemos fazer com que uma transao possa realizar um LOCK de
vrios tipos de recursos. Isso possvel por meio da alocao multigranular do Database
Engine, que aloca os recursos de maneira automtica em um nvel que seja apropriado para a
tarefa, o que acaba diminuindo o custo de LOCK.
192
Problemas de Concorrncia Impedidos Pelos LOCKs
LOST UPDATE
Vamos supor que as mesmas informaes fossem modificadas por dois usurio
diferentes. No fossem os LOCKs, apenas a ltima alterao seria registrada no banco de
dados, ou seja, as alteraes de uma transao que fossem sobrescritas por alteraes de uma
outra transao seriam perdidas.
UNCOMMITED DEPENDENCY
O problema de leitura suja seria provocado pelo fato de uma transao ler os dados de
uma outra transao que ainda no foi confirmada. Diante dessa situao, ao invs de
COMMIT TRANSACTION, a transao no confirmada poderia executar um ROLLBACK
TRANSACTION.
1. Uma segunda transao acessa a mesma linha diversas vezes, sendo que, em cada
acesso, faz a leitura de dados diferentes. Trata-se de m processo semelhante ao DIRTY
READ, em que uma transao modifica os dados que esto sendo lidos por uma
segunda transao. importante considerar, no entanto, que na anlise de
inconsistncia, a transao que fez alterao a responsvel por liberar os dados que
foram lidos pela segunda transao.
2. Entre duas ou mais leituras, uma outra transao altera as informaes da linha. Da o
termo NONREPEATABLE READ, pois a leitura original nunca ser repetida. H, ainda,
uma inconsistncia porque cada leitura produzir valores diferentes.
PHANTOMS
Este problema poderia ocorrer caso as transaes no fossem separadas umas das
outras.
Vamos supor a seguinte situao: Iremos alterar de uma nica vez todos os registros de
tabelas existentes em uma determinada regio. Ao mesmo tempo em que essa alterao
193
feita, um novo registro acrescentado regio por outra transao. Assim, da prxima vez
que a primeira transao fizer a leitura dos registros, haver um registro a mais na leitura.
Customizando o LOCK
ROWLOCK: Obriga a utilizao de um LOCK de linha, que mantido pelo SQL Server
at o fim do comando. Porm, ser mantido at o final da transao caso
especifiquemos HOLDLOCK.
PAGLOCK: Obriga a utilizao de um SHARED LOCK no nvel de pgina. Tambm
mantido at o fim do comando a no ser que seja especificado HOLDLOCK.
TABLOCK: O SQL Server obriga a utilizao de um SHARED LOCK na tabela. Os
usurio podem ver os dados mas no podem alter-los.
UPDLOCK: Utiliza um SHARED LOCK, mas sim do UPDATE LOCK no nvel de pgina
durante a leitura dos dados da tabela. Quando utilizamos um UPDATE LOCK, outras
transaes tem acesso a leitura mas no a escrita.
TABLOCKX: Utiliza um EXCLUSIVE LOCK na tabela at o fim do comando. Impede
leitura e escrita. Veja o modo de utilizao:
BEGIN TRANSACTION
GO
COMMIT TRANSACTION
GO
194
Por meio das especificaes de LOCK, podemos sobrepor um LOCK de seo de um
determinado comando. J para especificar um TIL de um comando, podemos utilizar o
comando DBCC USEROPTIONS, como mostra o exemplo:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DBCC USEROPTIONS
GO
READ COMMITTED: Este argumento, que o padro, faz com que o SQL Server utilize
SHARED LOCKs em operaes de leitura. No aceita DIRTY READs.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
REPEATABLE READ: Esta opo evita que os dados acessados em uma query sejam
alterados por outros usurios, por meio da utilizao de LOCKs nos dados.
NONREPEATABLE READs e DIRTY READs no so permitidas. Pode-se acrescentar
novas linhas ao conjunto, pois sero consideradas na prxima leitura. Deve ser usado
somente em extrema necessidade. Pois o nvel de concorrncia menor do que o nvel
de isolamento padro.
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
LOCK Dinmico
A escolha automtica dos tipos de LOCK, alm de poupar o trabalho do DBA em ajust-
los manualmente, concede aos desenvolvedores a chance de voltar seus esforos unicamente
para a aplicao. Alm disso, pelo fato de o SQL Server escolher automaticamente o tipo de
LOCK para cada tarefa, h uma diminuio do overhead do sistema.
195
TIMEOUT
Como visto anteriormente, uma transao que solicita um lock, mas no o obtm pelo
fato de uma outra transao j possuir um LOCK conflitante no recurso, ir aguardar um
determinado tempo at que consiga realizar o LOCK no recurso desejado e, desta forma, possa
completar o processo. A esse tempo de espera damos o nome de TIMEOUT. possvel
configur-lo por meio do seguinte comando: SET LOCK_TIMEOUT [tempo_milisegundos]
196
Exerccios
Resposta:
Resposta:
Resposta:
Resposta:
5. Que TIMEOUT?
Resposta:
197
6. Que LOCK tem a finalidade de aplicar uma hierarquia de LOCK?
a. EXCLUSIVE (X) LOCKS
b. UPDATE (U) LOCKS
c. INTENT (I) LOCKS
d. SCHEMA (SCH) LOCKS
e. DEADLOCK
8. Qual das alternativas a seguir devemos utilizar para configurar um nvel de isolamente
a ser aplicado na seo.
a. LOCK ISOLATION LEVEL
b. TRANSACT ISOLATION LEVEL
c. TRANSACTION ISOLATION LEVEL
d. ROLE ISOLATION LEVEL
e. NOLOCK
198
Captulo 19
Distribuio de Dados
A fim de que possamos acessar os dados presentes no servidor remoto com freqncia,
basta realizar um link entre o servidor remoto e o local e, ento, fazer as queries utilizando o
nome totalmente qualificado do objeto, o qual formado pelos seguintes itens:
servidor.banco_dados.schema.objeto
Observemos:
EXEC SP_ADDLINKEDSERVER @SERVER = 'SERVER', @SRVPRODUCT = 'SQL SERVER'
GO
199
A Stored Procedure de Sistema, SP_ADDLINKEDSERVER, permite determinar o nome
do servidor conectado, que diz respeito a um servidor virtual definido para o SQL Server com
todos os dados que se fazem necessrios para realizar o acesso origem de dados OLEDB.
O nome do servidor conectado pode ser utilizado com a finalidade de fazer uma
referncia s tabelas remotas de vrias maneiras. Uma das formas possveis utilizar esse
nome como um parmetro de entrada para a funo OPENQUERY(), suja finalidade enviar
um comando para executar no provedor OLEDB. Com isso, o rowset obtido como resultado
pode ser utilizado no comando Transact-SQL como referncia a uma VIEW ou a uma tabela.
Para que possamos fazer conexo com uma origem de dados OLEDB, devemos utilizar
a sintaxe descrita a seguir:
EXEC SP_ADDLINKEDSERVER
@SERVER = 'SERVIDOR',
@SRVPRODUCT = 'ORACLE',
@PROVIDER = 'MSAPKE',
@DATASRC = 'ORACLEDB'
GO
Em que:
Segurana
200
No momento em que um usurio efetua seu logon no servidor local e executa uma
query distribuda, o servidor realiza um logon no servidor remoto em nome do
usurio.
Caso as informaes de logon do usurio (usurio e senha) existam nos dois
servidores, o SQL Server pode conectar-se ao servidor remoto utilizando as credenciais
do usurio atual.
Observe a sintaxe descrita abaixo. Ela permite estabelecer uma conexo segura entre
os dois servidores:
EXEC SP_ADDLINKEDSRVLOGIN
@RMTSRVNAME = 'SERVIDOR',
@USESELF = 'FALSE',
@LOCALLOGIN = 'CLASSROOM\ALUNO',
@RMTUSER = 'XXXX',
@RMTPASSWORD = 'XXXX'
GO
Em que:
201
O acesso aos dados presentes em um servidor conectado pode ser feito a partir de um
nome totalmente qualificado. Para tanto, basta utilizar como base os exemplos descritos:
SELECT * INTO #MINHA_TABELA_TEMPORARIA FROM
[nome_servidor].[database].DBO.[nome_tabela]
GO
Os seguintes comandos no podem ser executados: SELECT INTO, CREATE, ALTER e DROP.
202
A Stored Procedure de Sistema SP_SERVEROPTION permite determinar algumas
opes para configurar o servidor local. Observe:
EXEC SP_SERVEROPTION
@SERVER = 'SERVIDOR',
@OPTNAME = 'OPCAO',
@OPTVALUE = 'VALOR'
GO
COLLATION COMPATIBLE, se configurado para TRUE, faz com que o SQL Server
assuma que todas as colunas e CHARACTERS SETS presentes no servidor remoto so
compatveis com o servidor local. (Idioma)
Um servidor remoto apenas pode ser registrado em uma transao caso ele seja uma
chamada da Stored Procedure Remota ou um destino de uma query distribuda. As sesses
que esto envolvidas nas transaes distribudas Transact-SQL no obtm um objeto de
transao a ser passado para outra sesso a fim de que ela possa ser registrada na transao
distribuda de forma explcita.
203
podem ser executadas na query distribuda apenas as operaes somente-leitura. Com isso,
uma chamada stored procedure remota fazendo referncia a um servidor remoto realizada
pela sesso que j se encontra registrada na transao distribuda.
Caso a opo SP_CONFIGURE REMOTE PROC TRANS esteja configurada com o valor
ON, alm de as transaes locais serem promovidas a transaes distribudas por conta da
chamada a uma stored procedure remota, tais chamadas feitas locais so protegidas de forma
automtica como sendo parte das transaes distribudas. Para tanto, torna-se desnecessrio
reescrever aplicaes a fim de emitir o comando BEGIN DISTRIBUTED TRANSACTION.
Vale destacar que, devido a falhas de sistema ou de comunicao, possvel que haja
um atraso na entrega das mensagens de COMMIT ou de ABORT. No decorrer do perodo de
atraso, todos os LOCKs de objetos que tenham sido omitidos so mantidos pelo gerenciador
de recursos.
204
A transao ser abortada caso haja falha em qualquer uma de suas partes. Quando
isso acontece, o gerenciador no responde ao requerimento de preparao para o COMMIT ou
responde simplesmente NO.
Consideraes
Este servio oferecido pelo SQL Server assegura a integridade das transaes a partir
do gerenciamento de alteraes feito atravs de dois ou mais servidores. Dessa forma, o MS
DTC oferece alta consistncia entre os servidores na medida em que garante que as alteraes
realizadas sobre os dados sero feitas em todos os servidores de forma simultnea.
Alguns objetos COM so expostos pelo MS DTC. Eles tm a finalidade de permitir que
os clientes participem de transaes coordenadas atravs de diversas conexes para uma
variedade de armazenamento de dados.
206
Exerccios
Resposta:
2. Que fatores devem ser levados em considerao para estabelecer a segurana entre os
servidores local e remoto de forma adequada?
Resposta:
Resposta:
Resposta:
Resposta:
207
6. Para que utilizada a STORED PROCEDURE SP_ADDLINKEDSERVER?
a. Ela permite realizar o mapeamento dos logins referentes ao servidor local para os
logins presentes no servidor conectado.
b. Permite realizar o mapeamento dos IDs de login e das senhas entre os servidores
local e remoto.
c. Permite executar uma transao distribuda a fim de que possamos alterar os
dados presentes em um servidor remoto.
d. Estabelece uma instncia padro que pode ser sobrescrita por meio de
REMOTE_PROC_TRANSACTIONS da opo SET no nvel da conexo.
e. Assegura que todos os gerenciadores de recursos confirmem a transao ou
abortem a mesma.
208
e. O processo composto basicamente por duas fases: Na primeira, o MS DTC define
se cada transao est pronta para realizar o COMMIT. Caso todos eles estejam,
comea a segunda fase, na qual o MS DTC realiza ROLLBACK em caso de falha.
209
Apndice
RESOURCE
Este banco de dados possui todos os objetos de sistema do SQL Server, os quais so
visualizados de forma lgica no esquema SYS de todos os bancos de dados. O RESOURCE, que
um banco de dados somente leitura, no possui metadados ou dados dos usurios. Ele
permite a rpida atualizao de verses e o fcil rollback dos pacotes de servios.
MASTER
TEMPDB
MODEL
utilizado como um modelo para criar todos os outros bancos de dados. Dessa forma,
quando solicitamos a criao de um novo banco de dados, o SQL Server copia todos os objetos
de MODEL para o novo banco de dados. Caso sejam feitas alteraes em cima do banco de
dados MODEL, todos os novos bancos de dados iro herdar essas alteraes.
210
MSDB
Utilizado pelo SQL Server Agent com a finalidade de registrar operadores e programar
a execuo de JOBs e as configuraes de replicao. O MSDB utilizado para armazenar os
dados no apenas do SQL Server Agent, mas tambm do SQL Server e SSMS. Um histrico
completo de backups e restauraes on-line mantido pelo SQL Server no banco de dados
MSDB.
BACKUP
Talvez uma das tarefas mais importantes do DBA seja a criao de backups. Apenas um
pequeno deslize no servidor de dados e todas as informaes podem ir por gua a baixo, a no
ser que o DBA, previamente, tenha feito um backup de sua base de dados.
A realizao do backup no SQL Server pode ser feita de trs maneiras principais: por
linha de comando atravs do SSMS, pelo passo-a-passo do SSMS ou pode meio de JOBs
agendados. Veremos como fazer um backup a partir da linha de comando do SSMS. A sintaxe
bsica a seguinte:
BACKUP DATABASE [nome_database] TO DISK 'X:\caminho_logico\nome_database.bak'
GO
Aqui est listado algumas procedures para manuteno e configurao do SQL Server.
Vejamos:
212