Resumo SQL
Resumo SQL
1 - Introdução
• Service Manager: Permite iniciar, pausar, continuar e finalizar os serviços do SQL Server.
• Query Analyzer: Permite utilizar diretamente o SQL Server usando comandos SQL. Os
comandos SQL podem ser executados interativamente, ou podem ser executados de
procedimentos armazenados ou scripts.
• Profiler: permite monitorar toda a atividade do servidor e registrar essa atividade em arquivos
de log, incluindo comandos SQL executados pelo servidor.
Um banco de dados é um conjunto de tabelas que contêm dados relacionados. Por exemplo,
um sistema de contas a pagar poderia ter um banco de dados de contas a pagar, com uma
tabela de duplicatas, uma tabela de bancos, uma tabela de contas etc.
Um índice é uma estrutura de dados que permite pesquisar rapidamente por linhas em uma
tabela, dado o valor de uma determinada coluna ou colunas da tabela. Um índice primário ou
chave primária define um valor único, que não pode ser repetido em outras linhas da tabela.
Uma query é um pedido de pesquisa no banco de dados, que permite obter dados de uma
tabela ou de várias tabelas, especificando as condições de seleção.
Desktop x Cliente/Servidor
O acesso a informações em sistemas de processamento de dados (DESKTOP) isto é, que não
utilizam Sistemas Gerenciadores de Bancos de Dados (SGDB) é feito pelo acesso seqüencial a
um ou mais arquivos. Cabe ao programador criar mecanismos de recuperação da informação.
Com a utilização de um Gerenciador de Banco de Dado, porém, o acesso fica diferente: pede-
se as informações ao gerenciador de banco de dados e elas são fornecidas pelo mesmo. O
SQL Server, como já foi dito, é um sistema de gerenciamento de bancos de dados
cliente/servidor.
2
RESUMO APOSTILA SQL SERVER
O Catálogo do Sistema
Um banco de dados contém uma coleção de tabelas e outros objetos relacionados. Existem
dois tipos de banco de dados: os bancos de dados do sistema são usados pelo SQL Server
para operar e gerenciar o sistema e os bancos de dados dos usuários são usados para
armazenar os dados dos usuários. O catálogo do sistema é composto de tabelas no banco de
dados master.
Master - Controla os bancos de dados do usuário e a operação do SQL Server. Tem como
tamanho inicial 16 MB. É importante manter um backup atualizado desse banco de dados.
Contém informações sobre:
- Contas de login
- Processos em execução
- Mensagens de erro
- Bancos de dados criados no servidor
- Espaço alocado para cada banco de dados
- Travas [locks] de linha ativas
- Espaço alocado para cada banco de dados
- Procedimentos armazenados do sistema
Model - É um modelo usado para criação de novos bancos de dados, que pode ser usado para
definir padrões, como autorizações default de usuário, opções de configuração, tipos de dados
etc. Sempre que um banco de dados do usuário é criado, o conteúdo de model é copiado para
ele. Seu tamanho inicial é 2.5 MB. Esse modelo pode ser alterado.
Msdb - Usado pelo serviço SQLServerAgent, para controlar tarefas como replicação,
agendamento de tarefas, backups e alertas. Contém algumas tabelas de sistema, que
armazenam informações usadas pelo SQLExecutive.
3
RESUMO APOSTILA SQL SERVER
Tabelas do Sistema
As tabelas do sistema, armazenadas no banco de dados master e em cada banco de dados de
usuário, contêm informações sobre o SQL Server e sobre cada banco de dados de usuário.
Existem 17 tabelas em cada banco de dados que formam o catálogo do banco de dados.
Todas começam com o prefixo sys e contém as seguintes informações:
Informação para cada índice criado e para cada tabela sem índices, além de
sysindexes informações para cada tabela que possui colunas text ou image.
4
RESUMO APOSTILA SQL SERVER
Informação sobre cada tipo de dados (do sistema ou definido pelo usuário).
systypes
Informação sobre cada usuário que pode ter acesso ao banco de dados.
sysusers
Existem também tabelas localizadas apenas no banco de dados master, que compõem o
catálogo do sistema. Elas contêm as seguintes informações:
sysconfigures,
Parâmetros de configuração do SQL Server.
syscurconfigs
Informação sobre os bancos de dados existentes.
sysdatabases
REMARKS
DATABASE_NAME DATABASE_SIZE
--------------------
------------------- ---------------
(null)
master 17408
(null)
model 1024
(null)
msdb 8192
(null)
pubs 3072
(null)
tempdb 2048
(5 row(s) affected)
Quando um procedimento tem o formato xp_xxx ele é um procedimento estendido, quer dizer
que não foi escrito em SQL, mas foi compilado como parte de uma DLL. Por exemplo, o
procedimento xp_cmdshell executa um programa.
Exemplo:
xp_cmdshell 'calc.exe'
6
RESUMO APOSTILA SQL SERVER
Objetos
Um objeto contém dados ou interage com os dados. Cada objeto tem uma linha
correspondente a tabela sysobjects.Existem os seguintes tipos de objetos:
Índices
Um índice é composto de ponteiros para os dados, ordenados pelo valor de uma ou mais
colunas. Através de um índice, é possível acessar mais rapidamente os dados, dado o valor de
algumas colunas.
Tipos de dados
Um tipo de dados especifica quais os valores que podem ser armazenados em uma coluna.
Restrições [constraints]
Uma restrição reforça a integridade dos dados em uma tabela, ou entre duas tabelas,
controlando quais dados podem ser inseridos.
7
RESUMO APOSTILA SQL SERVER
Arquvios primários: Todo banco de dados inclui ao menos um arquivo primário, que é feito para
armazenar todos os objetos de banco de dados, tais como tabelas e índices. Este arquivo
também é usado para apontar para o resto dos arquivos que constituem o banco de dados.
Arquivo de log: Todo banco de dados tem um arquivo de log, que é usado para rgistrar todas
informações antes que elas sejam escritas em um arquivo primário ou secundário. Esses dados
são utilizados para ajudar na recuperação, no caso de um problema com o banco de dados.
Um banco de dados pode ter um ou vários arquivos de log se o arquivo de log original ficar sem
espaço.
Cada banco de dados tem um nome físico (o caminho e nome do arquivo) e um nome lógico
(nome usado dentro do SQL Server). Os dois não precisam estar relacionados. Por exemplo,
ao criar um banco de dados chamado VENDAS, o SQL Server, cria um arquivo chamado C:\
MSSQL7\DATA\ VENDAS.mdf
O nome físico pode ser qualquer nome suportado pelo sistema operacional. O nome lógico
pode ter até 30 caracteres.
Arquivos predefinidos
Ao instalar o SQL Server, são criados quatro bancos de dados, com os seguintes nomes
lógicos:
8
RESUMO APOSTILA SQL SERVER
Objetivos:
Depois de fazer fazer alterações no do banco de dados é recomendável fazer backup do banco
de dados master, porque ele contém informações sobre cada banco de dados. Mais
especificamente, a tabela de sistema sysdatabases, do banco de dados master, armazena as
informações sobre todos os bancos de dados.
O Log de Transações
Quando um banco de dados é criado, é criado também um log de transações para esse banco
de dados. Todas as alterações feitas no banco de dados são também registradas nesse log.
Quando é executado um comando que altera os dados (insere, altera ou exclui linhas numa
tabela), essa alteração é gravada primeiro no log de transações. Periodicamente, o SQL Server
faz um checkpoint, um processo que grava em disco as alterações feitas em memória.
Geralmente um checkpoint é feito a cada minuto.
9
RESUMO APOSTILA SQL SERVER
Um banco de dados pode ser criado usando uma das seguintes ferramentas:
Como exemplo, vamos criar um banco de dados, entrando com o seguinte código SQL no
Query Analyzer.
Sintaxe:
Onde:
PRIMARY: Esta opção especifica o grupo de arquivos primário. O grupo de arquivos primário
deve conter todas as tabelas de sistema para o banco de dados. Um banco de dados só pode
ter um grupo de arquivo PRIMARY. Se não for especificado algum, o primeiro listado será o
primário.
FILENAME: Aqui deve-se especificar o caminho e nome do arquivo que você está criando. O
arquivo deve estar localizado na mesma máquina que o servidor SQL Server. Ele pode estar
em uma unidade de disco diferente contanto que esteja na mesma máquina.
SIZE: Especifica o tamanho em megabytes que você quer alocar para o seu banco de dados.
10
RESUMO APOSTILA SQL SERVER
MAXSIZE: Esta opção lhe permite especificar o tamanho máximo até o qual seu arquivo pode
crescer. O padrão permite que seu arquivo cresça até que o disco esteja cheio.
FILEGROWTH: Especifica a taxa de crescimento do arquivo. Este ajuste não pode exceder a
configuração de MAXSIZE. Um valor de 0 indica que não é permitido crescimento. O padrão é
10 por cento, significando que a cada vez que o arquivo cresce, será alocado um espaço
adicional de 10 por cento para ele. Um banco de dados que esteja em mais de um arquivo
(veja Arquivos para maiores detalhes), só é expandido depois que o último arquivo estiver
cheio.
Sintaxe:
SIZE = novo_tamanho
)
Por exemplo:
Com o comando SQL ALTER DATABASE, também é possível acrescentar arquivos ao banco
de dados. Para isso, usa-se a opção ADD FILE.
Sintaxe
Exemplos:
12
RESUMO APOSTILA SQL SERVER
Criando Tabelas
Uma tabela é um objeto do banco de dados, composto de zero ou mais linhas, contendo os
dados, organizados em uma ou mais colunas. Para criar a tabela, você pode usar o Enterprise
Manager ou comandos SQL. Após criar uma tabela, você utiliza comandos SQL para inserir
novas linhas, alterar colunas das linhas existentes, excluir linhas e consultar dados.
Tipos de Dados
Cada coluna tem um tipo de dados, que determina que tipo de informação pode ser colocada
na coluna e quais as características desses dados. O tipo é determinado quando a tabela é
criada e não pode ser alterado posteriormente.
Para dados contendo caracteres, char(n) armazena um número fixo de caracteres. Por
exemplo, uma coluna do tipo char(30) tem sempre 30 caracteres. Se forem informados menos,
o restante é completado com espaços. Já o tipo varchar(n) armazena uma quantidade variável
de caracteres, até o máximo informado. Os tipos nchar(n) e nvarchar(n), armazenam dados
Unicode, de comprimento fixo ou variável, e usam o conjunto de caracteres UNICODE UCS-2.
Os tipos "numéricos exatos", decimal e numeric, permitem armazenar dados exatos, sem
perdas devidas a arredondamento. Ao usar esses tipos, você pode especificar uma precisão,
que indica quantos dígitos podem ser usados no total e uma escala, que indica quantos dígitos
podem ser usados à direita do ponto. Por exemplo, decimal(9,2) permite guardar 7 dígitos
antes do ponto decimal e 2 após, num total de 9, assim o maior valor possível é 9999999,99.
Os tipos "numéricos inexatos", float e real, armazenam dados numéricos, mas nem sempre
mantém a precisão suficiente para armazenar corretamente números de vários dígitos.
O tipo money é usado para valores monetários, ocupando 8 bytes em disco e permitindo
valores entre -922.337.203.685.477,5808 e +922.337.203.685.477,5807 (922 trilhões). O tipo
13
RESUMO APOSTILA SQL SERVER
smallmoney permite valores entre - 214.748,3648 e +214.748,3647 (214 mil) e ocupa 4 bytes
em disco.
Dos tipos inteiros, int usa 32 bits (4 bytes), permitindo armazenar até +/-2.147.483.647, smallint
usa 16 bits (2 bytes) permitindo +/-32767 e tinyint usa 8 bits (1 byte), permitindo números não-
negativos de 0 a 255.
O tipo datetime armazena valores contendo a data e hora, com precisão de 1/300 de segundo,
entre 1º de janeiro de 1753 e 31 de dezembro de 9999 (o século é sempre armazenado). O tipo
smalldatetime ocupa menos espaço e armazena datas e horas de 1º de janeiro de 1900 até 6
de junho de 2079, com precisão de 1 minuto.
Tipos binários são usados para dados que o SQL Server não interpreta, por exemplo, o
conteúdo de um arquivo binário. O tipo text é usado para colunas com dados "memo", ou seja,
com texto de tamanho variável; o tipo ntext armazena dados Unicode de tamanho variável. O
tipo image armazena imagens, também de tamanho variável.
Os tipos text e ntext, armazenam dados de tamanho variável, mas podem armazenar
1.073.741.823 caracteres, para o caso do ntext, e 2.146.483.647 caracteres para o caso do tipo
text. Enquanto isso, os tipos varchar e nvarchar armazenam "somente" 8000 caracteres
(varchar) ou 4000 caracteres (nvarchar)
O tipo bit armazena valor 1 ou 0. Uma coluna do tipo timestamp não pode ser alterada pelo
usuário. Ela é definida automaticamente com a data e hora atual quando a linha é inserida ou
atualizada.
Sintaxe
Onde:
Exemplos:
Com isso, usar o tipo 'cpf', por exemplo, é o mesmo que usar char(11), mas é mais intuitivo e
fácil de entender. Se você especificar NONULL no tipo significa que ele não aceita valores
nulos.
14
RESUMO APOSTILA SQL SERVER
Sintaxe:
sp_droptype nome_tipo
Onde:
nome_tipo é o nome do tipo de dados que deseja excluir.
Exemplo:
sp_droptype nomepessoa
Exemplo:
CREATE TABLE Cliente1
(
CodCliente int NOT NULL,
Nome varchar(50),
CPF varchar(11) NULL,
DataCadastro datetime NOT NULL DEFAULT (getdate()),
Cidade varchar(20) NULL,
UF char(2) NULL,
País varchar(20) DEFAULT ('Brasil')
)
Sintaxe:
DROP TABLE [[banco_dados.]Owner.]nome_tabela
[, [[banco_dados.]owner.]nome_tabela...]
Onde:
- banco_dados é o nome do banco de dados a que a tabela pertence. Essa opção será usada
quando se estiver posicionado num determinado banco de dados e se deseja excluir a tabela
de outro banco de dados.
15
RESUMO APOSTILA SQL SERVER
Exemplos:
Sintaxe:
ALTER TABLE [banco_dados.[owner.]]nome_tabela
{
[ALTER COLUMN nome_coluna
{novo_tipo_de_dados [(precisão[, escala])]
| ADD {nome_coluna dados_coluna
| [WITH CHECK | WITH NOCHECK]}
Onde:
banco_dados é o nome do banco de dados a que a tabela pertence. Essa opção é opcional, ela
será usada somente quando se estiver posicionado num determinado banco de dados se e
deseja excluir a tabela de outro banco de dados.
Exemplos:
16
RESUMO APOSTILA SQL SERVER
A Sintaxe do SELECT
O comando SELECT mostra dados de uma ou mais tabelas. A sua sintaxe simplificada tem a
seguinte forma:
SELECT lista_de_colunas
FROM lista_de_tabelas
WHERE condições
Onde
- A lista_de_colunas especifica quais colunas serão retornadas como resultado, separadas por
vírgulas ou um asterisco (*) que indica todas as colunas da tabela.
- A cláusula FROM, com uma lista_de_tabelas, especifica quais tabelas serão consultadas.
- A cláusula WHERE especifica condições que devem ser satisfeitas pelas linhas das tabelas.
Exemplo:
select * from authors
O resultado irá mostrar todas as colunas e todas as linhas da tabela 'authors' (ou seja, todo o
seu conteúdo), como abaixo (algumas linhas e colunas foram omitidas):
Usando Condições
Os comandos que já usamos não têm a cláusula WHERE. Nesse caso, todas as linhas da
tabela são retornadas. Se o WHERE estiver presente, ele especifica uma condição que
seleciona as linhas, e apenas as que satisfazem essa condição serão mostradas.
Por exemplo, se quisermos os autores que moram na Califórnia, podemos consultar as linhas
cuja coluna 'state' (estado) tem o valor 'CA':
select au_fname, au_lname, city, state
from authors
where state='CA'
O resultado será:
17
RESUMO APOSTILA SQL SERVER
Manipulando expressões
Um comando SELECT pode retornar nas colunas de resultado uma coluna da tabela, ou um
valor calculado. Por exemplo, a tabela titles contém os títulos de livro (title) e os preços de cada
um (price). Se quisermos ver como fica o preço de cada um após um aumento de 10%, pode
ser feito o seguinte:
select price Preço , (price * 1.1) "Preço com 10% de aumento", title from titles
Note que "Preço com 10% de aumento" é o nome do cabeçalho da expressão (price * 1.1),
como o nome colocado possui espaços, foi necessário coloca-lo entre aspas.
Funções matemáticas
Exemplo de funções matemáticas do SQL Server:
Por exemplo:
Select price Preço , ROUND(price, 1) "Preço com 1 casa decimal", from titles
18
RESUMO APOSTILA SQL SERVER
Funções de caracteres
Você pode usar funções para manipular dados do tipo caracter (char ou varchar), por exemplo,
para pegar uma sub-string de uma seqüência de caracteres. E você pode usar o operador +
para concatenar dois valores de tipo caracter.
select au_fname + ' ' + au_lname 'Nome completo', city + ', ' + state 'Cidade' from
authors
O resultado será:
Condições de pesquisa
Como vimos, a cláusula WHERE permite selecionar quais as linhas da tabela a serem incluídas
no resultado. Existem várias formas de montar uma cláusula WHERE, usando um dos
seguintes elementos:
Operadores de comparação:
= igual a
> maior que
< menor que
>= ou !< maior ou igual (não menor)
<= ou !> menor ou igual (não maior)
<> ou != diferente
Usando operadores
As condições mais simples são formadas usando operadores de comparação, como vimos no
exemplo anterior:
select au_lname, city from authors where state = 'CA'
Se quisermos fazer o contrário, isto é, procurar os autores que NÃO são da Califórnia,
podemos fazer:
select au_lname, city from authors where state <> 'CA'
Usando faixas
Na tabela titles, para cada livro, está guardada a sua data de publicação na coluna 'pubdate'.
Se quisermos saber quais os livros publicados no ano de 1991, podemos fazer a consulta:
select pubdate, title from titles where pubdate between '1/1/91' and '12/31/91'
Usando listas
Pode-se selecionar valores de acordo com uma lista. Se o valor pertence à lista, a linha será
incluída no resultado. Por exemplo:
select au_lname, city, state from authors where state in ('UT','CA')
O resultado contém as linhas onde 'state' tem um dos valores 'UT' ou 'CA'. Equivale ao mesmo
que usar uma condição composta:
where state = 'UT' OR state = 'CA'
20
RESUMO APOSTILA SQL SERVER
Ordenando resultados
Para ver o resultado numa ordem particular, use a cláusula ORDER BY. Se estiver presente,
deve ser a última cláusula do comando SELECT. Por exemplo, para ver os livros em ordem de
preço:
select title, type, price from titles order by type asc, price desc
União de conjuntos
O comando SELECT retorna um conjunto de linhas, e permite também operações com a noção
matemática de conjuntos. Por exemplo, o resultado de dois comandos SELECT pode ser
combinados com o operador UNION. Os dois comandos podem até mesmo trazer dados de
tabelas diferentes, desde que com o mesmo número de colunas, e tipos de dados compatíveis
para cada coluna correspondente de um com o outro.
Por exemplo, no banco de dados pubs, a tabela authors contém informação sobre cada autor, o
que inclui a cidade e estado onde ele mora (colunas city e state). A tabela publishers contém
informação sobre as editoras e suas cidades e estados. Para sabermos o conjunto de todas as
cidades onde existem autores ou editoras, pode ser feita uma união dos dois conjuntos, com:
Note que na união de dois conjuntos, os elementos repetidos são eliminados, como quando se
usa o DISTINCT.
Se você quer ordenar de modo diferente os resultados da união, usando ORDER BY, essa
cláusula só pode aparecer no segundo comando SELECT, ou seja, no final dos comandos, por
exemplo:
21
RESUMO APOSTILA SQL SERVER
5 - Alteração de Dados
Objetivos:
- Aprender a inserir , atualizar e excluir linhas.
Inserindo linhas
O comando INSERT insere linhas em uma tabela. A forma mais simples do comando INSERT
insere somente uma linha , dados os valores.
INSERT [INTO] nome_tabela (colunas) VALUES (valores)
Onde:
nome_tabela é o nome da tabela que deseja incluir os dados.
colunas é o nome das colunas da tabela que deseja acrescentar os dados.
valores é o conteúdo de cada coluna.
Exemplos:
insert into Funcionario values (1, 'Primeiro Funcionário', 2, 122, 234.23,
'01/01/1998', '01/01/1998', 'M')
22
RESUMO APOSTILA SQL SERVER
insert into Cliente select CodCliente, Nome from Cliente where CodCliente in (2,4)
Excluindo linhas
O comando DELETE exclui permanentemente uma ou mais linhas de uma tabela, baseado em
alguma condição.
DELETE FROM nome_tabela WHERE condição
Onde:
nome_tabela é o nome da tabela que deseja excluir os dados.
condicao é condição para selecionar as dados que deseja excluir.
Exemplo:
Usando sub-consultas
Assim como UPDATE, o comando DELETE também pode usar sub-consultas para excluir
linhas baseado nos dados de outra tabela.
Outra opção é o comando TRUNCATE TABLE, que quase sempre é mais rápido que o
DELETE, especialmente em tabelas grandes:
Junções de tabelas
Um comando SELECT também pode fazer uma consulta que traz dados de duas ou mais
tabelas. Esse é um processo chamado de junção [join]. As tabelas têm uma coluna em comum
que é usado para fazer as junções.
23
RESUMO APOSTILA SQL SERVER
Sintaxe da Junção
O SQL Server aceita duas sintaxes diferentes para junção de tabelas. Uma delas, mostrada
acima, é específica ao SQL Server e, às vezes, um pouco mais simples de utilizar.
Na sintaxe do SQL Server, na lista do FROM as duas (ou mais) tabelas são especificadas,
separadas por vírgulas. Na cláusula WHERE deve haver uma condição ligando as duas, a
condição de junção [join condition]. Na lista de colunas do SELECT podem ser incluídos
colunas de qualquer uma das tabelas.
A outra forma de sintaxe que pode ser usada é a sintaxe do padrão ANSI SQL.
Exemplo:
Testes de existência
Um teste de existência é uma condição que envolve a palavra EXISTS e uma sub-consulta. A
condição é verdadeira se a sub-consulta retorna alguma linha e é falsa se ela retorna zero
linhas. Por exemplo, para saber quais os departamentos que possue funcionários cujo cargo é
igual a cargo1, utilize o banco de dados Exemplos e execute o seguinte comando:
select d.nome from departamento d where exists
(select * from funcionario f, cargo c
where f.codcargo = c.codcargo
and c.nome = 'Cargo1'
and d.coddepartamento = f.coddepartamento)
24
RESUMO APOSTILA SQL SERVER
6 - Implementando Índices
Objetivos:
- Aprender a criar índices;
- Entender o funcionamento do otimizador de consultas.
Índices não apenas aceleram a recuperação de linhas em consultas, mas eles também
aumentam a velocidade de atualizações e exclusões. Isso ocorre porque o SQL Server deve
encontrar uma linha, antes de poder atualizá-la ou excluí-la. No entanto, índices levam tempo
para serem criados e ocupam espaço em disco. Cada atualização na tabela também atualiza
dinamicamente todos os índices definidos. Portanto, se você criar muitos índices inúteis numa
tabela, pode estar atrapalhando o desempenho da atualização de dados sem agilizar muito o
tempo de resposta nas consultas.
No geral, o aumento da eficiência obtido com o uso de índices para localizar a linha sobrepuja
a carga extra de trabalho necessária para atualizar os índices, a não ser, como mencionado
acima, que a tabela tenha muitos índices.
25
RESUMO APOSTILA SQL SERVER
Quando da criação de um índice único, não pode haver valores duplicados nas colunas do
índice. Se houver, a criação do índice falha e você deve alterar as colunas antes de tentar criá-
lo novamente.
Composto
Um índice composto é aquele formado por duas ou mais colunas. Esse tipo de índice é útil
quando duas ou mais colunas são sempre pesquisadas em conjunto. Por exemplo, poderia ser
criado um índice na tabela Cliente para as colunas (Cidade,Estado). A ordem das colunas
importa: um índice com (Estado,Cidade) seria completamente diferente.
Onde:
nome_indice é o nome do índice que deseja criar.
nome_tabela é o nome da tabela que deseja criar o índice.
nome_coluna1 é o nome da coluna que irá fazer parte do índice.Se o índice tiver mais de uma
coluna acrescente a vírgula e coloque o nome das outras colunas.
UNIQUE indica se o índice será único. É opcional. Se o índice fo único você pode acrescentar
a opção IGNORE_DUP_KEY [ignorar chaves duplicadas].
CLUSTERED indica se o índice será agrupado. Com o índice agrupado e a opção UNIQUE,
você pode também usar a opção IGNORE_DUP_KEY,
FILLFACTOR é o fator de prenchimento, ou seja, a porcentagem de espaço livre que será
deixado em cada página do índice.
DROP_EXISTING exclui o índice existente com o mesmo nome. Se você for criar um índice
cujo nome não existe e usar esta oção, o SQL Server retornará uma mensagem avisando que
o índice com o nome sendo criado não foi encontrado.
STATISTICS_NORECOMPUTE faz com que as estatísticas do índice não sejam recalculadas
automaticamente com a atualização do índice.
PAD_INDEX deixa espaços vazios nas páginas dos níveis intermediários do índice. Só faz
sentido se usado em conjunto com FILLFACTOR.
Para excluir algum índice, use o comando DROP INDEX, com a seguinte sintaxe:
26
RESUMO APOSTILA SQL SERVER
Onde tabela.indice é o nome da tabela, seguido do nome do índice que se deseja excluir.
Otimizando Consultas
O otimizador escolhe uma de duas alternativas ao fazer uma consulta: ou varre a tabela ou usa um índice.
Ele decide o que fazer baseado em:
- Estimativa aproximada de quanto trabalho é necessário para usar o índice ou não. Essa
estimativa é baseada em informações estatísticas sobre o índice, que dizem qual a distribuição
dos dados. Essas informações podem ficar desatualizadas. Para corrigi-las, execute o
comando UPDATE STATISTICS nome_da_tabela.
- Se uma tabela é muito pequena, ou se o otimizador espera que será retornada uma grande
porcentagem de linhas, ele faz uma varredura.
- Se na cláusula WHERE da consulta estão presentes colunas indexadas, é bem provável que
o otimizador resolva utilizar o índice.
7 - Integridade de Dados
27
RESUMO APOSTILA SQL SERVER
Objetivos:
A propriedade IDENTITY
Uma coluna criada com a propriedade IDENTITY tem um valor único que é gerado
automaticamente pelo sistema. Somente uma coluna pode ter essa propriedade. Por exemplo,
crie uma nova tabela no banco de dados Exemplo, com o seguinte comando:
Uma coluna IDENTITY não aceita um valor explicitamente inserido. Ao inserir dados na tabela,
a coluna deve ser omitida. Execute agora:
Note que a coluna CodProduto foi preenchida automaticamente com um valor auto-
incrementado pelo sistema:
Desabilitando IDENTITY
Você pode temporariamente desativar a propriedade IDENTITY, para que você possa inserir
valores explicitamente numa coluna com IDENTITY. Pode ser necessário que você insira
valores explicitamente em tabelas que têm itens deletados com frequência. Inserir valores
explicitamente na coluna com IDENTITY lhe permite preencher espaços vazios deixados na
tabela.
Para desativar a geração automática de valores, use:
28
RESUMO APOSTILA SQL SERVER
A qualquer instante, somente uma tabela em uma sessão pode ter a propriedadede de
IDENTITY_INSERT em ON. Esta propriedade só é válida para o usuário atual e a sessão atual
(perde o efeito quando você se desconecta do SQL Server).
Se já houver uma tabela com esta propriedade em ON, e se entrar com o comando SET
IDENTITY_INSERT ON para outra tabela, será retornado uma mensagem de erro dizendo que
essa propriedade já está em ON e qual a tabela para a qual essa propriedade está em ON.
Onde a definição inicia com as palavras PRIMARY KEY, UNIQUE, CHECK, FOREIGN KEY ou
DEFAULT. A palavra CONSTRAINT e o nome_da_restrição podem ser omitidos. Nesse caso, o
nome será gerado automaticamente.
29
RESUMO APOSTILA SQL SERVER
Na tabela Fornecedor, não pode haver duas linhas com o mesmo valor de 'CodFornecedor'.
Quando a chave é composta de duas ou mais colunas, nesse caso ela tem que ser
especificada com a lista de colunas entre parênteses, por exemplo:
Uma chave primária pode ser acrescentada à tabela depois que ela já foi criada, com o
comando ALTER TABLE. Por exemplo, vamos acrescentar chaves primárias às tabelas Cliente
e Produto:
Verificação [CHECK]
Uma restrição CHECK é muito semelhante a uma regra, que verifica os valores que estão
sendo inseridos. A vantagem é que ele pode fazer referência a uma ou mais colunas da tabela.
Por exemplo, vamos verificar, na tabela Cliente, se a Cidade e Estado são informados. Vamos
criar uma restrição que impede de inserir o valor de Cidade, se Estado não foi informado:
alter table Cliente add check (not (Cidade is not null and Estado is null))
Porque nesse caso é assumida a chave primária. Mas uma chave estrangeira pode fazer
referência a colunas que não a chave primária, desde que possuam uma restrição UNIQUE
definida.
Esse tipo de restrição não cria um índice automaticamente, embora muitas vezes seja
recomendável criar para maior desempenho (geralmente não-clustered). Pode-se especificar o
nome da restrição opcionalmente, na forma CONSTRAINT nome, logo antes das palavras
"FOREIGN KEY".
Gerenciando restrições com comandos SQL
Como já vimos, CREATE TABLE pode criar as restrições junto com a tabela e ALTER TABLE,
com a cláusula ADD, permite adicionar restrições depois que a tabela foi criada. Para excluir
uma restrição, é preciso saber o seu nome. Se você não informou o nome na criação, terá que
descobri-lo, o que pode ser feito usando-se:
sp_help nome_da_tabela
Esse comando mostra informações sobre a tabela, inclusive os nomes de cada restrição. Para
excluir uma restrição, usa-se ALTER TABLE, com a opção DROP (independente do tipo de
restrição). A sintaxe genérica é:
Uma restrição também pode ser desabilitada temporariamente e depois reabilitada com o
comando ALTER TABLE, usando as opções NOCHECK (para desabilitar) e CHECK (para
habilitar). Isso não funciona com PRIMARY KEY, UNIQUE ou DEFAULT, apenas com as
outras restrições. Isso pode ser útil para inserir dados que fujam aos valores impostos pelas
restrições. A sintaxe é:
31
RESUMO APOSTILA SQL SERVER
Objetivos:
- Aprender a criar e utilizar visões e saber quais as particularidades do acesso a visões;
- Aprender a criar e utilizar procedimentos armazenados;
- Aprender a criar e utilizar triggers[gatilhos].
Visões [Views]
Uma visão [view] é uma forma alternativa de olhar os dados contidos em uma ou mais tabelas.
Para definir uma visão, usa-se um comando SELECT que faz uma consulta sobre as tabelas. A
visão aparece depois como se fosse uma tabela.
Visões têm as seguintes vantagens:
-Uma visão pode restringir quais as colunas da tabela que podem ser acessadas (para leitura
ou para modificação), o que é útil no caso de controle de acesso, como veremos mais tarde.
-Uma consulta SELECT que é usada muito freqüentemente pode ser criada como visão. Com
isso, a cada vez que ela é necessária, basta selecionar dados da visão.
-Visões podem conter valores calculados ou valores de resumo, o que simplifica a operação.
-Uma visão pode ser usada para exportar dados para outras aplicações.
Criando uma visão com comandos SQL
Para criar uma visão através de SQL, use o comando CREATE VIEW. Esse comando tem a
seguinte sintaxe:
32
RESUMO APOSTILA SQL SERVER
uma visão, WITH CHECK OPTION garante que os dados permaneçam visíveis através da
visão depois que as modificações forem efetivadas.
Vamos criar uma visão no banco de dados Exemplo, usando as tabelas 'Produto', 'Fornecedor'
e 'ProdutoFornecedor'. Essa visão vai mostrar o nome do fornecedor e o nome do produto.
Crie-a digitando o texto abaixo no Query Analyzer:
Todas as considerações feitas a respeito do comando CREATE VIEW se aplicam aqui. Caso
você não se lembre do comando usado na criação da visão (o comando CREATE VIEW) , você
pode obtê-lo usando o procedimento sp_helptext, da forma:
sp_helptext VisaoFornecProduto
33
RESUMO APOSTILA SQL SERVER
Procedimentos Armazenados
Um procedimento armazenado [stored procedures] é um conjunto de comandos SQL que são
compilados e armazenados no servidor. Ele pode ser chamado a partir de um comando SQL
qualquer.
A vantagem de usar procedimentos armazenados é que eles podem encapsular rotinas de uso
freqüente no próprio servidor, e estarão disponíveis para todas as aplicações. Parte da lógica
do sistema pode ser armazenada no próprio banco de dados, em vez de ser codificada várias
vezes em cada aplicação.
Note que os parâmetros são sempre declarados com @, logo após o nome do procedimento.
Um procedimento pode ter zero ou mais parâmetros. Declara-se o nome do procedimento, e a
seguir o tipo de dados do parâmetro.
Dentro do procedimento pode haver vários comandos SELECT e o resultado desses comandos
será o resultado do procedimento. O corpo do procedimento começa com a palavra AS e vai
até o final do procedimento.
Executando procedimentos armazenados
Para executar um procedimento, usa-se o comando EXEC (ou EXECUTE). A palavra "EXEC"
pode ser omitida:
BuscaCliente 'an'
as
declare @contagem int, @mensagem char(100)
select CodCliente, Nome from Cliente
where Nome like '%' + @nomeBusca + '%'
-- conta quantas linhas foram encontradas
select @contagem = count(*) from Cliente
where Nome like '%' + @nomeBusca + '%'
if @contagem = 0
begin
select @mensagem = 'Nenhum cliente contém
"'+@nomeBusca+'"'
print @mensagem
print ""
end
O comando DECLARE declara variáveis, que são sempre introduzidas pelo caractere @. No
caso, @contagem é uma variável do tipo int e @mensagem do tipo char(100).
Note que quando você usa um comando SELECT, o resultado pode ser colocado numa
variável, como @contagem acima. Esse resultado não aparece no resultado do SELECT. Essa
é também a única forma de alterar uma variável (você não pode escrever '@variável = valor'
diretamente).
O comando IF verifica uma condição e executa um comando caso a condição seja verdadeira.
Se acompanhado da cláusula ELSE, executa um outro comando caso a condição seja falsa. O
comando PRINT usado acima é geralmente usado para mostrar mensagens, que aparecem
quando você chama o procedimento interativamente.
Os comandos BEGIN e END são usados para delimitar uma lista de comandos, que passa a
ser tratada como um comando único. No caso acima, eles são necessários para poder executar
três comandos dentro do IF (o SELECT e os dois PRINT).
Gatilhos [Triggers]
Um gatilho [trigger] é um tipo de procedimento armazenado, que é executado automaticamente
quando ocorre algum tipo de alteração numa tabela. Gatilhos "disparam" quando ocorre uma
operação INSERT, UPDATE ou DELETE numa tabela.
Geralmente gatilhos são usados para reforçar restrições de integridade que não podem ser
tratadas pelos recursos mais simples, como regras, defaults, restrições, a opção NOT NULL
etc. Deve-se usar defaults e restrições quando eles fornecem toda a funcionalidade necessária.
Um gatilho também pode ser usado para calcular e armazenar valores automaticamente em
outra tabela.
Exemplo de gatilhos
create table NotaFiscal
(NumeroNota numeric(10) primary key,
ValorTotal numeric(10,2) default (0) )
35
RESUMO APOSTILA SQL SERVER
Vamos usar gatilhos para duas finalidades: primeiro, quando for excluída uma nota fiscal, todos
os seus itens serão excluídos automaticamente. Depois, quando for incluído um item, a coluna
'ValorTotal' será atualizada, na tabela 'NotaFiscal'.
Criando gatilhos
Gatilhos são sempre criados vinculados a uma determinada tabela. Se a tabela for excluída,
todos os gatilhos dela são excluídos como conseqüência. Ao criar um gatilho, você pode
especificar qual(is) a(s) operação(ões) em que ele será acionado: INSERT, UPDATE ou
DELETE.
Gatilhos para inserção
Quando é feita a inclusão de uma ou mais linhas na tabela, o SQL Server cria uma tabela
virtual chamada inserted, que contém as linhas que serão incluídas (mas ainda não foram).
Essa tabela tem a mesma estrutura da tabela principal. Você pode consultar dados nessa
tabela com o SELECT, da mesma forma que uma tabela real.
Vamos criar um gatilho, chamado InclusaoItemNota, que será ativado por uma operação
INSERT na tabela ItemNotaFiscal.
37
RESUMO APOSTILA SQL SERVER
9 - Segurança
Objetivos:
- Conhecer os recursos do SQL Server para controle de acesso ao banco de dados;
- Aprender a criar logins de usuário e usuários do banco de dados.
Conceitos
Os recursos de segurança do SQL Server permitem determinar:
- Quais usuários podem usar o SQL Server.
- Quais usuários podem acessar cada banco de dados.
- As permissões de acesso para cada objeto de banco de dados e para cada usuário.
- As permissões de acesso para cada comando SQL em cada banco de dados, para cada
usuário.
Existem quatro barreiras para que os usuários possam acessar dados em um servidor SQL
Server:
- O sistema operacional de rede; o usuário deve efetuar logon na rede.
- A autenticação do SQL Server; o usuário deve ter uma conta no SQL Server.
- A autenticação de banco de dados; o ID do usuário deve existir em uma tabela de sistema do
banco de dados (mais especificamente, a tabela sysusers)
- A autenticação de objetos; o usuário deve ter permissões para acessar qualquer objeto
(tabelas, visões, entre outros).
Autenticação de usuários
Quando um usuário tenta acessar um servidor SQL Server, ele pode ser autenticado de duas
maneiras: pela Autenticação do Windows NT ou pela Autenticação do SQL Server. Não
confunda isso com modo de segurança, que é um tópico muito semelhante.
A autenticação do Windows NT se aproveita da segurança embutida no Windows NT Server, a
qual inclui características como senhas criptografadas, senhas que expiram, tamanho mínimo
de senhas, bloqueio de conta, e restrição de acesso com base em nomes de computador.
O SQL Server pode confiar no Windows NT para autenticar logins, ou pode ele mesmo
autenticar os logins.
Modos de segurança
Um modo de segurança se refere a como o DBA (administrador do banco de dados) configura
o SQL Server para autenticar usuários. Um servidor pode usar um de dois modos de
segurança: Windows NT e mista [mixed].
Logins
Um login do SQL Server é um nome que identifica um usuário para o SQL Server. Cada login
tem uma senha, que deve ser informada no caso da segurança mista (ver abaixo).
38
RESUMO APOSTILA SQL SERVER
O SQL Server cria automaticamente um login chamado 'sa' (administrador do sistema), que
não deve ser excluído. O 'sa' tem permissão para fazer praticamente tudo no banco de dados:
criar bancos de dados, tabelas, criar outros logins etc. O sa pode conceder permissões para
outros usuários poderem fazer algumas tarefas.
Nomes de usuário no banco de dados
Se você possui um login, não quer dizer que tenha acesso a todos os bancos de dados. É
preciso ter também um nome de usuário de banco de dados [database user ID], que é
relacionado com o login e permite acesso a um banco de dados específico. O nome de usuário
pode ser específico do login.
O usuário que cria um banco de dados é o dono do banco de dados [database owner]. Dentro
do banco de dados, o dono é conhecido pelo nome especial 'dbo'. Outros usuários podem ter
nomes diferentes, geralmente de acordo com o seu login. O dono do banco de dados pode
conceder permissões para outros usuários de criar e excluir objetos dentro do banco de dados.
O usuário que cria um objeto (tabela, visão, procedimento etc.) no banco de dados é o dono
deste objeto. O dono tem inicialmente todas as permissões no objeto criado, mas ele pode
conceder essas permissões a outros usuários se desejar.
Um login pode ter um alias [apelido] dentro de um banco de dados, que é o nome de outro
usuário. Nesse caso, dentro daquele banco de dados, ele funciona como se fosse aquele
usuário e tem as mesmas permissões dele. Vários usuários (logins) diferentes podem ter o
mesmo alias. Esse é um recurso que existe no SQL Server 7.0, apenas para compatibilidade
com versões anteriores, já que através de papéis [roles] e da atribuição de permissões aos
papéis, o que era feito usando aliases, pode ser feito de maneira muito mais eficaz.
O usuário guest [convidado] é um nome especial que existe em todo banco de dados e permite
a qualquer login usar o banco de dados, mesmo que não tenha um nome de usuário
relacionado.
Papéis [Roles]
Na sua essência, um papel [role] é um grupo de usuários que têm necessidades semelhantes
de acesso ao SQL Server.
Permissões
Até agora, já vimos como criar e gerenciar logins que são usados para controlar o acesso ao
SQL Server. Mas, mesmo que um usuário tenha um login e um ID de usuário válido, ele não
pode acessar qualquer dado em um banco de dados sem que lhe tenham sido dadas
permissões explícitas para acessar os objetos armazenados no banco de dados.
Permissões são usadas no SQL Server para especificar quais usuários podem ter acesso a
quais objetos de bancos de dados, e o que eles podem fazer com tais objetos. Se um usuário
não receber explicitamente a permissão para acessar um objeto, ele não terá acesso ao
mesmo. Permissões podem ser atribuídas a usuários (contas do NT Server ou do SQL Server),
grupos (grupos globais do NT Server), e papéis (papéis predefinidos de servidor, de banco de
dados e papéis personalizados de bancos de dados).
39
RESUMO APOSTILA SQL SERVER
Permissões implícitas
Uma permissão implícita é uma permissão que um usuário obtem apenas pelo fato de
pertencer a um papel predefinido de banco de dados ou de servidor, ou por ser o proprietário
de um objeto de banco de dados. Permissões implícitas não podem ser atribuídas a usuários.
Ao invés disso, um usuário que precise de uma permissão implícita deve ser adicionado a um
papel predefinido que já tenha tal permissão. Permissões implícitas podem assim ser atribuídas
a usuários, papéis personalizados ou grupos, com a simples atribuição dos mesmos a um
papel predefinido de banco de dados ou de servidor. As permissões implícitas também podem
ser atribuídas a usuários, grupos ou papéis personalizados definindo quaisquer destes como o
proprietário de um objeto de banco de dados específico.
Quando um usuário com a permissão de comando adequada cria um novo objeto no banco de
dados, tal como uma tabela, ele se torna o proprietário do objeto de banco de dados [Database
object owner] (DBOO) daquele objeto. Proprietários de objetos de banco de addos têm
permissões implícitas em todos os objetos que lhes pertençam, o que os dá a capacidade de
executar qualquer atividade naquele objeto, tal como SELECT, INSERT, UPDATE, DELETE,
entre outros. Eles têm controle completo dos objetos que criam.
Como dá para perceber, permitir que qualquer um seja um DBOO não é uma boa idéia.
Normalmente, as únicas pessoas que devem criar objetos de bancos de dados são DBAs ou
desenvolvedores SQL, não usuários comuns.
40
RESUMO APOSTILA SQL SERVER
10 - Backup e Restauração
Conceitos
Um backup ou dump do banco de dados é a operação de copiar os dados para um dispositivo
de backup. Pode ser feito com o Enterprise Manager ou com o comando BACKUP. Não é
necessário parar o SQL Server ou desconectar os usuários para fazer a operação de backup.
Ela pode ser feita a qualquer momento. Deve-se considerar que a realização do backup com
usuários utilizando o banco de dados, causa uma pequena queda de performance, que pode
ser perceptível aos usuários. É importante então escolher horas de menor atividade do servidor
(ou ao menos do banco de dados cujo backup está sendo feito) para a realização do backup.
Uma restauração ou RESTORE do banco de dados é a operação de trazer os dados de um
meio de backup de volta para os bancos de dados.
41
RESUMO APOSTILA SQL SERVER
11 - Outros Recursos
42
RESUMO APOSTILA SQL SERVER
43