Você está na página 1de 81

Apostila de MS SQL Server Pág.

: 1 / 80

Conceitos e Estrutura do SQL Server

Conceito
Banco de Dados Relacional
Banco de Dados Cliente-Servidor
Processo Servidor
Processo Cliente
Integridade Relacional
Controle de Transações

Estrutura
Criar Banco de Dados
Criar e Administrar Arquivos Secundários
Criar tabelas
Criar tabelas Temporárias
Criar tabelas Particionadas
Criar Chave Primária
Criar Chave Estrangeira
Criar Índices
Estabelecer Logins
Criar Usuários
Estabelecer Permissões
Criar Default
Criar Rules
Criar Role
Criar View
Criar Stored Procedures
Criar Trigger
Criar Cursor
Criar Script
Criar/Executar Backup / Restore
Linguagem SQL
DML
DDL
DQL
DCL
Pág.: 2 / 80
Apostila de MS SQL Server
Conceitos

O que é um Banco de Dados?


Em termos simples, um banco de dados é uma coleção de dados, onde os dados são armazenados em
tabelas. Alguns gostam de pensar em um banco de dados como um mecanismo organizado que tem a
capacidade de armazenar informações, pela qual um usuário pode recuperar as informações
armazenadas de uma maneira eficaz e eficiente.
Um banco de dados relacional é um banco de dados dividido em unidades lógicas chamadas tabelas, em
que as tabelas são relacionadas entre si dentro do banco de dados. Um banco de dados relacional
permite dividir os dados em unidades lógicas menores, mais gerenciáveis, oferecendo melhor e mais
fácil manutenção e desempenho ótimo do banco de dados de acordo com o nível de organização.

O Que é SQL?
SQL (Structured Query Language) é a linguagem padrão utilizado para comunicar-se com um banco de
dados relacional. O protótipo original foi desenvolvido pela IBM utilizando o artigo do Dr. E. F. Codd (“A
Relational Modelo of Data for Large Shared Data Banks”) Modelo Relacional de Informações de Dados
para Grandes Bancos de Dados Compartilhados.

Visão geral do Transact-SQL


Transact-SQL é a linguagem do SQL Server para definição, consulta e manipulação de dados. Essa
linguagem é baseada no padrão ANSI SQL-92, também suportado por outros bancos de dados, e
acrescenta extensões ao padrão ANSI, exclusivas do SQL Server. SQL é a sigla de estruture Query
Language, embora ela faça bem mais do que consulta.
Os comandos Transact-SQL podem ser divididos nas seguintes categorias (note que isso não abrange
todos os comandos, só os comuns que serão utilizados nesse curso):
DLL, DML, Comandos Select e DCL

ANSI SQL
Significa American National Standards Institute, uma organização que é responsável por planejar
padrões para vários produtos e conceitos. No caso do SQL, isso fornece um esqueleto básico de
fundamentos básicos necessários, que como um resultado final, permite consistência entre várias
implementações. Com a linguagem SQL podemos nos comunicar com qualquer banco de dados que
trabalhe com o sistema (RDBMS), afinal, se tivéssemos uma linguagem para cada banco de dados,
ficaria difícil a comunicação e até mesmo a migração desses dados entre bancos de dados.
Exemplo, imagine que cada país fosse um banco de dados, logo, cada país tem uma língua nativa,
dificultando então a comunicação entre eles, com isso, teríamos que aprender cada língua desses
países. Assim como o inglês que é uma língua de comunicação universal, o SQL é a língua universal de
comunicação entre banco de dados relacional, tornando mais fácil a comunicação entre os usuários e
aplicativos com o banco de dados.
Apostila de MS SQL Server Pág.: 3 / 80

Sessões de SQL
É uma ocorrência de um usuário que interage com um banco de dados relacional por meio da utilização
de comandos de SQL. Comandos válidos de uma sessão SQL podem ser inseridos para consultar o
banco de dados, manipular dados e definir estruturas do banco de dados, como tabelas.
Quando um usuário conecta-se a um banco de dados, a sessão de SQL é
inicializada.

Sistemas Gerenciadores de Banco de Dados


O acesso a informações em sistemas em sistemas de processamentos de dados que não utiliza Sistemas
Gerenciadores de Bancos de Dados (SGBDs), é feito pelo acesso seqüencial a um ou mais arquivos.
Cabe ao desenvolvedor criar mecanismo de recuperação da informação. Com a utilização de um SGBD,
porém, o acesso fica diferente: pede-se as informações ao gerenciador de banco de dados e elas são
devolvidas pelo mesmo.
O processo pode ser comparado a uma compra em uma loja de departamento e uma compra em uma
loja de autopeças, no primeiro caso o cliente dirige-se a loja e procura por todas as seções, encontra o
produto desejado e efetua a compra. Já na segunda o cliente pede o ao balconista o item desejado e
este entrega-o.No caso da compra em loja de departamentos o trabalho é toda do cliente, sendo este
responsável inclusive pelas especificações necessárias (fazer a escolha certa). Já na loja de auto peças,
o balconista assume toda a responsabilidade pela entrega da mercadoria desejada.

Arquitetura Cliente-Servidor
O SQL Server 2005 é um banco de dados relacional, destinado a ser compatível com aplicações que
apresentam arquitetura Cliente/Servidor, no qual o banco de dados fica residente em um computador
central chamado Servidor e cujas informações são compartilhados por diversos usuários que executam
as aplicações em seus computadores locais ou clientes.
A arquitetura Cliente/Servidor reduz consideravelmente o tráfego de rede, pois retorna ao usuário
apenas os dados solicitados.
Pág.: 4 / 80
Apostila de MS SQL Server
Arquitetura do SQL Server

O Banco de dados SQL Server 2005 é dividido em diversos componentes lógicos, como tabelas, índices,
visões e outros componentes visíveis para o usuário.
Um servidor SQL Server pode conter vários bancos de dados pertencentes a diversos
usuários.
Cada instância de um SQL Server 2005 possui quatro bancos de dados de sistema (System Databases)
chamados master, model, tempdb e msdb. Cada um desses bancos de dados é exigido pelo SQL
Server e não pode ser renomeado e nem removido sem antes desativar o SQL Server. Os dois outros
bancos de dados que são criados o pubs e northwind, são bancos de dados de usuário e são bancos
de dados de exemplo e podem ser removidos sem afetar as operações do SQL Server.
Embora ambos os tipos de bancos de dados (Sistema e Usuário) armazenem dados, o SQL Server utiliza
os bancos de Sistema para operar e gerenciar o sistema.

model tempdb msdb

. Bancos de
MASTER dados do
sistema
System System System
tables tables

Sytem
tables

Bancos de
dados de
System System usuário
Tables Tables

SAU02 SAU05

Master
É o banco de dados principal de configuração do SQL Server. Ele contém informações em todos os
bancos de dados que existe no servidor, incluindo os arquivos de banco de dados físico e suas
localizações, também contém as definições de configuração e contas de login do SQL Server.
Informações contidas no Banco de Dados Master:

Registro de servidor e logins remotos,


Bancos de dados e arquivos de banco de dados locais,
Contas de logins,
Processos e trancaduras,
Definição de configurações de servidor.

Com estas informações, é valido dizer que um backup atual do banco de dados master é crucial para
qualquer recuperação do servidor.
Apostila de MS SQL Server Pág.: 5 / 80

O processo de instalação cria o banco de dados master (master.mdf) e o arquivo de log do banco de
dados master (mastlog.ldf) no diretório do C:\Arquivos de programas\Microsoft SQL
Server\MSSQL\Data. No caso de um banco de dados master ser corrompido ou destruído e não puder
ser restaurado do backup, você poderá reconstruir o banco de dados master no seu estado padrão, a
Microsoft fornece um utilitário chamado rebuildm.exe, que esta localizada no subdiretório C: \Arquivos
de programas\Microsoft SQL Server\80\Tools\Binn.
Após reconstruir o banco de dados master, você terá que fazer manualmente qualquer alteração de
configuração e registro de banco de dados e servidor, além de recriar os logins para restaurar o servidor
no seu estado anterior.

Tempdb
O Banco de dados Tempdb é usado para o armazenamento de tabelas temporárias e stored procedures
temporários.
O banco de dados Tempdb é recriado toda vez que o SQLServer for iniciado, então o Tempdb não
poderia ser usado para o armazenamento de dados persistente. As tabelas e as procedures temporárias
que são geradas pelo SQL Server são soltas automaticamente quando as conexões são fechadas. Por
isso se não houver atividade de conexão, o Tempdb fica vazio, todos os bancos de dados e processos no
SQL Server compartilham o Tempdb para gravação de trabalhos. O arquivo de banco de dados Tempdb
(tempdb.mdf) e os arquivos de log (templog.ldf) estão no diretório C:\Arquivos de programas\Microsoft
SQL Server\MSSQL\Data.

Msdb
É um banco de dados do sistema que é utilizado por vários componentes do SQL Server, como o serviço
do SQL Server Agent. Além da configuração do SQL Server Agent e das informações sobre a tarefa, a
replicação, o envio de log e os dados de plano de manutenção são armazenados no banco de dados
Msdb.
Informações contidas no banco de dados Msdb:

Informações sobre o plano de manutenção do banco de dados, como função e histórico do


plano de manutenção.
Informações sobre os publicadores e os distribuidores de replicação.
Informação sobre a configuração do envio de log e monitoramento.

O arquivo de banco de dados msdb (msdb.mdf) e os arquivos de log do Msdb (msdb.ldf) estão
localizados no diretório C:\Arquivos de programas\Microsoft SQL Server\MSSQL\Data. Devido à
quantidade de informações sobre configuração armazenadas no Msdb, o backup do banco de dados é
recomendado rotineiramente. Se o banco de dados Msdb for corrompido, você poderá reconstruir um
Msdb padrão usando um script de construção do SQL Server instalado no processo de instalação. O
filename do script de instalação do Msdb é instmsdb.sql e esta localizado no diretório C:\Arquivos de
programas\Microsoft SQL Server\MSSQL\Install.
Se o banco de dados Msdb não existir, o script o criará primeiro e, em seguida construirá todos os
objetos de banco de dados necessários, depois você poderá ter que reconfigurar todas as funções de
programação, planos de manutenção, envio de log e configuração de replicação.
Pág.: 6 / 80
Apostila de MS SQL Server
Model
É um banco de dados template que o SQL Server usa para criar novos bancos de dados. Cada vez que
você cria um banco de dados novo no SQL Server, o conteúdo do banco de dados Model é copiado para
dentro do novo banco de dados para estabelecer seus objetos padrões, incluindo tabelas, stored
procedures e outros objetos de banco de dados. O banco de dados é necessário mesmo que você não
pretenda criar nenhum banco de dados de usuário.
Cada vez que o SQL Server é iniciado, o banco de dados Tempdb é recriado usando o Banco de dados
Model como seu template. Por padrão o banco de dados encontra-se vazio ao ser criado. O arquivo de
banco de dados Model (model.mdf) e os arquivos de log do banco de dados Model (modellog.ldf) são
criados no diretório C:\Arquivos de programas\Microsoft SQL Server\MSSQL\Data, durante o processo de
instalação.

Localização dos Bancos de dados


Os bancos de dados ficam armazenados em arquivos físicos que recebem o nome de DEVICE. Um device
ocupa sempre a quantidade de disco que for a ele destinada, independente da existência ou não de
banco de dados em seu interior e independente da taxa de ocupação destes databases.

Arquitetura de Armazenamento Físico


Os Bancos de dados SQL Server são armazenados em grupos de arquivos que contem dados individuais
e arquivos de log, cada banco de dados é feito de arquivos de dados principal e, opcionalmente, de
secundários, assim como arquivos de log. Estes arquivos são identificados por suas extensões padrão de
arquivos, arquivo de dados principal (*,mdf) e arquivo de log (*.ldf). O arquivo de log e de dados
podem ser armazenados em qualquer unidade não comprimida FAT e NTFS.
Com exceção dos arquivos de log, os dados no arquivos do SQL Server são gravados em unidades
chamadas paginas. Cada Pagina armazena 8k de dados permitindo um Maximo de 8060 bytes em cada
pagina (96bytes são usados para cada cabeçalho de pagina).
Devido ao limite de dados de pagina de 8060 bytes, o tamanho Maximo de registro também é de 8060
bytes, que inclui todos os tipos de dados, exceto ntext, text e dados de imagem. Text, ntext e dados de
imagem são gravados em uma coleção de páginas separadas que permitem até 2GB de informações
por item de dados. Um ponteiro para estas paginas de dados é gravado com o registro fonte.
Apostila de MS SQL Server Pág.: 7 / 80

Trabalhando com Grupos de Arquivos

Com grupos de arquivos é permitido explicitamente a colocação de objetos de banco de dados sobre um
conjunto específico de arquivos de banco de dados. Isso pode ser útil para administração assim como
para o desempenho, você pode colocar o grupo de arquivos sobre unidades físicas de disco separadas e
depois colocar os objetos do banco de dados sobre os arquivos que são membros desse grupo de
arquivos. Isso pode melhorar o desempenho por que leituras e gravações no banco de dados executam
em unidades físicas de disco separadas ao mesmo tempo. Uma vantagem administrativa é que pode ser
feito o backup e restaurar arquivos individuais em um grupo de arquivos.
Os grupos de arquivos são criados quando se altera o banco de dados e adiciona-se arquivos a um
grupo de arquivos específico.

Criando Banco de Dados

CREATE DATABASE banco_curso


ON (
NAME = Aula,
FILENAME = 'C:\DiretorioBanco\BancoAula\Aula.mdf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5 )

LOG ON
( NAME = 'Aulalog',
FILENAME = 'C:\DiretorioBanco\BancoAula\Aula.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB )

Alterando Banco de Dados


Para alterar o banco de dados usamos o comando ALTER DATABASE, podemos modificar o nome do
banco de dados para Digidata.

ALTER DATABASE banco_curso


MODIFY NAME = DIGIDATA

Adicionando FileGroup ao Banco de Dados

ALTER DATABASE DIGIDATA ADD FILEGROUP SECUNDARY_DIGIDATA

Adicionando mais Arquivos de Dados ao Banco de Dados


Pág.: 8 / 80
Apostila de MS SQL Server

ALTER DATABASE digidata ADD FILE (


NAME = digidata2,
FILENAME = 'd:\bancoSQL\digidata.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB) TO FILEGROUP SECUNDARY_DIGIDATA

Excluindo Arquivos de Dados ao Banco de Dados

ALTER DATABASE DIGIDATA REMOVE FILE DIGIDATA2

Excluindo FileGroup do Banco de Dados

ALTER DATABASE DIGIDATA REMOVE FILEGROUP SECUNDARY_DIGIDATA

Excluindo o Banco de Dados

DROP DATABASE digidata


Apostila de MS SQL Server Pág.: 9 / 80

Criando o Banco de Dados com Wizard

Caixa de Dialgo New Database

Propriedade Definição
Logical Name Nome da base de dados. Referenciado em conexões.
File Type Tipo de dados armazenado. Dados ou Log de operações.
File Group Grupo a que pertence o arquivo, identificado por um endereço físico.
Initial Size Tamanho inicial do arquivo de dados. Apartir de MB.

Conforme demosntrado na caixa de dialogo “Change Autogrowth for


Autogrowth Banco_Curso”, define parâmetros que determinarão a forma em que os
arquivos de dados irão se expandir.

Path Endereço (diretório) onde são armazenados os arquivos de dados.


Nome do arquivo de dados, com sufixo .MDF para arquivo de dados e
File Name
.LGF para arquivo de log.
Tabela de Definições para Caixa de Dialgo New Database
Pág.: 10 / 80
Apostila de MS SQL Server

Caixa de Dialgo Change Autogrowth

Propriedade Definição
Enabled Autogrowth Habilita ou não crescimento automático, baseado em parâmetros.
File Growth Define crescimento em percentual ou Megabytes.
Restinge crescimento da área em Megabytes ou permite crescimento
Maximum File Size
indeterminado.
Tabela de Definições para Caixa de Dialgo Change Autogrowth
Apostila de MS SQL Server Pág.: 11 / 80

Criando Group File’s com Wizard

Criando um FileGroup’s 1/2

Criando um FileGroup’s 2/2


Pág.: 12 / 80
Apostila de MS SQL Server
Tipos de Comandos de SQL

DDL (Data Definition Language)


Linguagem de definição de dados, é a parte de SQL que permite criar e reestruturar objetos de banco
de dados, como criar e excluir uma tabela.
Os principais comandos de DDL incluem os seguintes:

CREATE TABLE
ALTER TABLE
DROP TABLE
CREATE INDEX
ALTER INDEX
DROP INDEX

DML (Data Manipulation Language)


Linguagem de Manipulação de Dados, é a parte de SQL utilizada para manipular dados dentro de
objetos de um banco de dados relacional.
Há três comandos básicos de DML:

INSERT
UPDATE
DELETE

DCL (Data Control Language)


Linguagem de Controle de Dados, permitem que você controle o acesso a dados dentro do banco de
dados, são normalmente utilizados para criar objetos relacionados com acesso de usuário e também
para controlar a distribuição de privilégios entre usuários, alguns comandos de controle de dados são:

ALTER PASSWORD
GRANT
REVOKE
CREATE SYNONYM

Comandos de Administração de Dados


Permitem ao usuário realizar auditorias e realizar análises em operações dentro do banco de dados, são
dois comandos gerais de administração de dados:

START AUDIT
STOP AUDIT
Apostila de MS SQL Server Pág.: 13 / 80

Comandos de Controle Transacional


Permitem ao usuário gerenciar transações dentro de banco de dados.

COMMIT
ROLLBACK
SAVEPOINT
SET TRANSACTION

Comando Definição
Commit Salvar transações dentro do banco de dados.
RollBack Desfaz transações dentro do banco de dados.
Cria pontos dentro de grupos de transações até que eles desfaçam
SavePoint
as transações com rollback ou salvar com commit.
Set Transaction Atribui um nome em uma transação.

Procedimentos Armazenados do Sistema


Um procedimento armazenado [stored procedure] é uma seqüência de comandos da linguagem
Transact-SQL, compilados e armazenados num banco de dados. Os procedimentos armazenados do
sistema [system stored procedures] são fornecidos pelo SQL Server, armazenados no banco de dados
Máster e automatizam várias tarefas comuns de gerenciamento.
Por Exemplo, o procedimento sp_databases mostra quais os nomes de bancos de dados existentes.

Exemplos de estored procedures armazenados:

sp_databases – mostra quais os nomes de bancos de dados existente.


sp_helpdb aula – mostra informações sobre o banco de dados aula.

Note que todos os procedimentos armazenados do sistema têm nomes que começam com ‘sp_’
(abreviatura de System Procedures). Ao executar um procedimento que inicie com ‘sp_’ o procedimento
sera procurado no banco de dados atual, se não for encontrado ele será procurado no banco de dados
Máster.
Quando um procedimento inicia com ‘xp_’ ele é um procedimento estendido, quer dizer que não foi
escrito em SQL, mas foi compilado como parte de uma DLL.

Exemplo: xp_cmdshell ‘calc.exe’


Pág.: 14 / 80
Apostila de MS SQL Server
Tabelas

Entidades, Relacionamentos e Atributos

Quanto mais organizadas estiverem as informações no Banco de dados, mais forte será a “Conversa”
com o Gerenciador de Banco de Dados. Para Isso criou-se um modelo chamado de Modelo de Entidade
e Relacionamentos, do qual fazem parte três elementos:

Entidades: Uma entidade é um objeto de interesse do qual podem ser colecionadas informações. Ex:
Tabelas de clientes, Tabela de pedidos de clientes.

Relacionamentos: As entidades podem ser relacionadas entre si pelos relacionamentos.


Ex: Entidade de Clientes e Entidade de Pedidos (“clientes fazem pedidos”).

Atributos: São as características das entidades. São representadas pelas colunas das tabelas. Ex:
nome, endereço, telefone e etc.

Componentes de uma Tabela

O armazenamento e a manutenção de dados valiosos é a razão para a existência de qualquer banco de


dados. Lembre-se de que uma tabela é a forma mais simples de armazenamento de dados em um
banco de dados relacional.
A seguir os componentes de uma tabela:

Campo: É uma coluna em uma tabela que é projetada para manter informações específicas sobre cada
registro na tabela. Ex:

ID_CLIENTE NOME ENDEREÇO TELEFONE

Registro ou Linha de dados: É cada entrada individual que existe em uma tabela. Ex:

ID_CLIENTE NOME ENDEREÇO TELEFONE


20003 João da Silva R. Conde Pameira 3333-3235
20004 Marcos Pereira R. Paula Frontes 2522-8589

Coluna: É uma entidade vertical em uma tabela que contém todas as informações associadas com um
campo específico em uma tabela. Ex:

ID_CLIENTE
20003
20004
20005
Apostila de MS SQL Server Pág.: 15 / 80

Criando Tabelas
Uma tabela [table] é um objeto do banco de dados, composto de zero ou mais linhas [rows], contendo
os dados, organizados em uma ou mais colunas [columns]. Para criar a tabela você pode usar o
Enterprise Manager ou utilizando comandos SQL DDL (Data Definition Language ) no SQL Query
Analyzer. Antes de criar suas tabelas, é importante levar em conta um bom projeto do banco de dados,
que determina quais as informações a serem guardadas.

Tipos de Dados
Cada coluna tem um tipo de dados [data type], que determina que tipo de informações (caracteres,
números, datas/horas) podem ser colocadas nas colunas e quais as características desses dados. O tipo
de dados é determinado quando a tabela é criada e não pode ser alterado posteriormente. Você pode
usar tipo de dados do sistema, predefinidos, ou criar novos tipos de dados, chamados tipo de dados do
usuário baseados nos tipos de dados existentes.

Os tipos de dados existentes são:

Tipo Definição Tamanho


Char(n), Caracteres Alpha Numéricos – Posição Fixa Até 4.000
Varchar(n) Caracteres Alpha Numéricos – Posição Não Fixa Até 4.000
Decimal(p,e) Caracteres Numéricos com definiçao de precisão e escala Até (38,38)
numeric(p,e) Caracteres Numéricos com definiçao de precisão e escala Até (38,38)
BigInt Caracteres Numéricos Inteiros de 8 bytes –2^63 a 2^63-1
Int Caracteres Numéricos Inteiros de 4 bytes –2^17 a 2^17-1
SmallInt Caracteres Numéricos Inteiros de 2 bytes –2^14 a 2^14 -1
TinyInt Caracteres Numéricos Inteiros de 1 byte –2^7 a 2^7 -1
Real Caracteres Numéricos de Ponto Flutuante de 8 bytes 15 digitos
Money Caracteres Numéricos de 4 Casas Decimais de 8 bytes –2^63 a 2^63-1
Smallmoney Caracteres Numéricos de 4 Casas Decimais de 4 bytes –2^17 a 2^17-1
January 1, 1753-December 31,
Datetime Caracteres de Data e Hora de 4 bytes
9999
January 1, 1900, through June
Smalldatetime Caracteres de Data e Hora de 2 bytes
6, 2079
Tipos de Dados Binários de tamanho Fixo de bytes de n. n Bytes n+4
Binary(n)
deve ser um valor de 1 a 8000
Tipos de Dados Binários de tamanho variável de bytes de Comprimento real dos dados +
varbinary(n)
n. n deve ser um valor de 1 a 8000 4 bytes, não bytes de n
Imagem Tipos de Dados Binários de tamanho variável 2^31-1
Text, Caracteres Alpha Numéricos de tamanho variável 2^30-1
Bit Caracteres Numéricos de 1 bit 0-1
Apostila de MS SQL Server Pág.: 16 / 80

Criando Tabelas do Projeto de Aula

CREATE TABLE Clientes(


ID_Cliente int NOT NULL,
Nome varchar (50) NOT NULL,
Cnpj char (18) NOT NULL,
Tipo char (1) NOT NULL,
Status bit NOT NULL,
Data datetime NOT NULL,
Historico text NULL,
Foto image NULL,
Credito money NULL
)

CREATE TABLE Produtos(


ID_Produto int NOT NULL,
Descricao varchar (25) NOT NULL,
PrecoCompra money NOT NULL,
Saldo int NOT NULL
)

CREATE TABLE Pedidos(


ID_Pedido int NOT NULL,
ID_Cliente int NOT NULL,
DataPed datetime NOT NULL
)
On SECUNDARY_DIGIDATA

CREATE TABLE Itens(


ID_Pedido int NOT NULL,
ID_Produto int NOT NULL,
Quantidade int NOT NULL,
PrecoVenda money NOT NULL
) On SECUNDARY_DIGIDATA
Apostila de MS SQL Server Pág.: 17 / 80

Criando Tabelas com Wizard


Acione com o botão direito do mouse o né Tables na caixa de dialogo Object Explore, clicando em New
Table. Logo em seguida pode ser definido aspectos como nome da tabela, local de armazenamento e a
qual esquema pertence. Para tanto, observe a caixa de dialogo Properties.

Caixa de Dialogo Object Explore

Caixa de Dialogo Properties


Apostila de MS SQL Server Pág.: 18 / 80

Área de Trabalho – Create Table


Apostila de MS SQL Server Pág.: 19 / 80

Nota 01:
Observe a tabela de tipos, anteriormente exibida nessa apostila visando conhecer os vários tipos possíveis para
cada coluna da tabela.

Nota 02:
Ao final, ainda não sendo definido o nome da tabela, será solicitado conforme caixa de dialogo Choose Name.

Nota 03:
Nessa etapa podemo definir a Chave-Primária da tabela, bastando somente definir (selecionar usando a tecla shift)
as colunas que irão compor essa chave, e com o botão direito do mouse optar por Set Primary Key.

Caixa de Dialogo Choose Name


Apostila de MS SQL Server Pág.: 20 / 80

Constraints

Chave Primária [Primary Key]

A chave primaria [primary key] de uma tabela é uma coluna ou seqüência de colunas que identificam
unicamente uma linha dentro da tabela, ou seja, seu valor não pode ser repetido para outras linhas. Ao
definir uma chave primária, automaticamente é criado um índice na tabela. Só pode haver uma chave
primária na tabela.
Na criação da tabela, essa restrição pode ser definida da seguinte forma (quando a chave primária é
composta de uma só coluna):

CREATE TABLE Clientes (


ID_CLIENTE int not null identity primary
key,
NOME varchar (50) not null,
CNPJ char (18) not null,
TIPO char (1) not null,
STATUS bit not null,
DATA datetime not null,
HISTORICO Text,
CREDITO money)

Uma chave primária pode ser acrescentada à tabela depois que ela foi criada com o comando ALTER
TABLE. Por exemplo, vamos criar chaves primárias à tabela clientes de duas maneiras distintas:

ALTER TABLE Clientes add primary key (id_cliente)


ALTER TABLE Cclientes add constraint PK_Clientes primary key
(id_cliente)

Utilizando o wizard específico no Enterprise Manager, podemos facilmente definir a Primary Key
selecionando as linhas (que representam coluna), clicando em seguida com o botão direito do mouse e
escolhendo no menu de contexto a opção “Set Primary Key”.
Apostila de MS SQL Server Pág.: 21 / 80

Criando Chave Primária para as Tabelas do Projeto

ALTER TABLE Clientes add constraint PK_Clientes primary key (id_cliente)


ALTER TABLE Produtos add constraint PK_Produtos primary key (id_produto)
ALTER TABLE Pedidos add constraint PK_Pedidos primary key (id_pedido)

Unicidade [unique]

Uma restrição unique em uma coluna ou grupo colunas determina que seu valor deva ser único na
tabela. Esse tipo de restrição é usado para chaves alternadas, ou seja, valores que se repetem na tabela
além da chave primária. Pode haver várias restrições UNIQUE na tabela e as colunas de uma restrição
UNIQUE permitem valores nulos. Repare na sintaxe:

ALTER TABLE Clientes ADD UNIQUE (CNPJ)

Chave Estrangeira [FOREIGN KEY]

Uma forma importante de integridade no banco de dados é a integridade referencial, que é a verificação
de integridade feita entre duas tabelas. Por exemplo, a tabela ‘dbo.itens’ será usada para relacionar
dados de produtos e pedidos. Ela contém as colunas ID_PRODUTO e ID_PEDIDO.
Uma chave estrangeira é uma restrição de integridade referencial. Ela consiste de uma coluna ou grupo
de colunas cujo valor deve coincidir com valores de outra tabela. No nosso caso, vamos adicionar duas
chaves estrangeiras na tabela ‘dbo.itens’: ID_PEDIDO faz referencia a coluna ID_PEDIDO da tabela
dbo.pedidos e ID_PRODUTO que faz referência à coluna ID_PRODUTO da tabela dbo.produtos e uma
chave estrangeira na tabela ‘dbo.pedidos’: ID_CLIENTE que faz referencia a coluna ID_CLIENTE da
tabela ‘dbo.clientes’, como seguem abaixo:

ALTER TABLE PEDIDOS ADD CONSTRAINT


FK_PEDIDOS_CLIENTES
FOREIGN KEY (ID_CLIENTE) REFERENCES CLIENTES
(ID_CLIENTE)

ALTER TABLE ITENS ADD CONSTRAINT FK_ITENS_PEDIDOS


FOREIGN KEY (ID_PEDIDO) REFERENCES PEDIDOS (ID_PEDIDO)

ALTER TABLE ITENS ADD CONSTRAINT FK_ITENS_PRODUTOS


Apostila de MS SQL Server Pág.: 22 / 80

FOREIGN KEY (ID_PRODUTO) REFERENCES PRODUTOS (ID_PRODUTO)

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 ‘dbo.clientes’

Esse comando mostra informações sobre a tabela, inclusive os nomes de cada restrição. Para excluir,
usa-se ALTER TABLE, com a opção DROP (independente do tipo de restrição).

ALTER TABLE CLIENTES DROP CONSTRAINT


‘NOME_DA_RESTRIÇÃO’

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.

ALTER TABLE ITENS NOCHECK CONSTRAINT 'NOME_DA_RESTRIÇÃO'


Apostila de MS SQL Server Pág.: 23 / 80

Diagrama

Clientes * Produtos *
ID_Cliente ID_Produto
Nome Descricao
Cnpj PrecoCompra
Tipo Saldo
Status
Data
Historico

FK_Pedidos_Clientes Foto
Credito
FK_Itens_Produtos

Pedidos * Itens *
ID_Pedido ID_Pedido
ID_Cliente FK_Itens_Pedidos ID_Produto
DataPed Quantidade
PrecoVenda
Apostila de MS SQL Server Pág.: 24 / 80

Criando Chave Estrangeira com Wizard


Basta selecionar a coluna desejável, clicando com o botão direito do mouse na opção RelationsShips,
clicando em seguida no botão Add. Imediatamente a caixa de dialogo Foreign Key RelationsShips passa
apresentar as propriedades conforme ilustrado.

Caixa de Dialogo Foreign Key RelationsShips

Propriedade Definição

Quando assinaldo Yes, verifica a existência de dados que possam impedir


Check Existing Data a criação da chave, devido a existência de valores na coluna não válidos.
on Create Não válidos aqui refere-se a valores não encontrados previamente na
coluna de referência na tabela de referência.

Exibe uma Caixa de Dialogo onde é solicitado:

Escolha das colunas que irão compor a chave estrangeira.


Tables and Columns
Especification
Escolha da tabela de referência (Foreign Table) e a coluna nessa tabela
onde será verificado a existência prévia de valor correspondente quando
da inclusão ou auteração de registros.

Nome da chave estrangeira, normalmente no padrão


Name
FK_NomeTabelaOrigem_NomeTabelaDestino
Tabela de Definições para Caixa de Dialogo Foreign Key RelationsShips
Apostila de MS SQL Server Pág.: 25 / 80

Índices
Porque Índices?

Índice é um mecanismo que acelera bastante o acesso aos dados. Consiste de uma estrutura de dados
que contém ponteiros ordenados para os dados. O SQL Server usa [Indexes ou Índices]
automaticamente em varias situações para acelerar a pesquisa e atualização de dados. Por exemplo:

Se uma coluna esta na cláusula WHERE em um comando SELECT, UPDATE ou DELETE, o SQL
Server verifica as condições mais rapidamente se houver um índice, caso contrário ele faz uma
varredura seqüencial da tabela [table scan].

Se uma coluna é muito usada para ordenar valores (com ORDER BY), essa ordenação é mais
eficiente se ela tiver um índice.

Se uma coluna é usada para fazer junção de duas tabelas, essas junções podem ser feitas mais
eficientes se ela estiver indexada.

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.
Para criar um Índice usamos o comando CREATE INDEX.

Alguns Exemplos:

CREATE INDEX Idx_Clientes_Nome ON Clientes(Nome)

CREATE INDEX idx_ProdutoS_Descricao ON Produtos(Descricao) On SECUNDARY_DIGIDATA

CREATE INDEX Idx_Pedidos_DataPed ON Pedidos(DataPed) On SECUNDARY_DIGIDATA


Apostila de MS SQL Server Pág.: 26 / 80

Criando Índices com Wizard


Clicando sobre o nó Table, em seguida procedendo da mesma maneira com o nó que representa a
tabela onde criaremos o índice, selecione e clique em seguida com o botão direito do mouse sobre o nó
Index. A caixa de dialogo New Index combinada com a caixa de dialogo Select collumns proverá todo o
processo. Ainda, observe nas tabelas de referência dessas ciaxas de dialogos as definições para cada
propriedade envolvida.

Caixa de dialogo New Index – Aba General


Apostila de MS SQL Server Pág.: 27 / 80

Propriedade Definição

Naturalmente o nome do objeto Index, no padrão desejável


Index Name
Idx_NomeTabela_NomeCampos

NonClusterd ou Clustered. Nesse caso não, uma vez que somente um


índice clusterizado pode existir em uma tabela.
Um índice clusterizado ordena fisicamnente uma tabela pela coluna ou
colunas indicadas, aasim, como naturalmente a criação da chave primária
Index Type (indicando a locuna ID_PRODUTO) gerou um índice clusterizado, não há
mais possibilidade.
Um índice clusterizado é desejável por não necessitar de uma tabela
extra para o índice, economizando espaço em mídia e pelo fato de ser
mais rápido já que os daados serão ordenados ficamente na tabela.

A partir do botão Add, podemos escolher as colunas que irão compor o


Index Key Columns
Índice.

Caixa de dialogo Selct Colummns


Apostila de MS SQL Server Pág.: 28 / 80

Aspectos Importantes na Criação de Índices


Base de dados para serém eficientes, necessitam de índices e sobretudo, de bons índices. Algumas
características observadas na caixa de dialgo New Index, especificamente na Aba Options concorrem
para isso. Veja na tabela sobre definições algumas dessas características.

Caixa de Dialogo New Index – Aba Options


Apostila de MS SQL Server Pág.: 29 / 80

Propriedade Definição

Automatically Mantém estatísiticas úteis na execução de futuros Seclects. Desejável,


recompute statistics mas com o inconviniente de gerar dados extas na base.

Não provocar lock de registros quando sendo utilizado index para


Use row locks when obtenção de daods. A prática de uso de lock é raro nos modelos de
accessing the index negócios atuais (uso de banco de dados) pois impacta a concorrência
de dados, sobretudo nos modelos que atemdem a web.

Armazena resultados na base temporária para recuperação mais rápida


Stored intermediate
imediatamente após sua execução. Isso pode ajuda na performance de
sort result in tempdb
uma seleção subsequente.

Define o percentual de uso das páginas de índices. O aconselhável é


80%, determinando uma sobra de 20% em cada página de índice.
Essa sobra de espaço, prove solução para quando da entrada de um
Set fill factor novo registro, que provocaria a divisão da página de índice em duas,
acomodando esse valor, que devido ao critério de indexação deveria
estar nessa página. Isso retarda mas não evita em definitivo a
fragmentação pela divisão de páginas de índices cheias.
Apostila de MS SQL Server Pág.: 30 / 80

Tabelas Particionadas
A maneira mais simples de entender este conceito é através de um exemplo. Imagine que
você tenha que armazenar em uma tabela todas as notas fiscais emitidas por uma cadeia
nacional de “fast food” em suas centenas de lojas pelo Brasil. A tabela deve ficar grande,
não? Agora imagine o trabalho que as operações do dia-a-dia realizam nesta tabela. Não só
Inserções, Consultas e Alterações, mas também operações de Backup, Ordenação,
Desfragmentação…

Agora pense na seguinte solução: Armazenar as notas fiscais referentes a cada mês em
uma partição desta tabela. Algo como ter um caderninho para controle de cada mês. Não
fica bem mais fácil? Na maior parte do tempo, você só manipulará os dados do mês atual.
Você pode até manter a partição do mês atual como “read-write” e as outras como “read-
only”. Talvez você não precise de backups diários das partições relativas a meses anteriores,
o que reduzirá drasticamente a janela de backup!

Ilustração de Tabela Particionada

Aumentando o Desempenho com múltiplos discos


Agora uma afirmação que pode causar espanto. Pode ser intuitivo pensar que é vantajoso,
do ponto de vista de desempenho, colocar cada partição em um disco físico separado, não
é mesmo?. A princípio, temos a impressão que estaremos utilizando todos os discos ao
mesmo tempo, o que melhora o desempenho. Pois não é bem assim... Apesar dos ganhos
de desempenho serem claros nas operações que acabamos de discutir em tabelas
particionadas, o SQL Server executa operações de ordenação em uma partição de cada vez.
Em outras palavras: somente um disco seria utilizado por vez, o que reduziria o
desempenho.
A maneira mais eficiente de utilizar múltiplos discos é configurando volumes distribuídos em
vários discos, em estruturas RAID. Desta forma, mesmo quando uma operação de
ordenação é realizada numa única partição, todos os discos da estrutura RAID são utilizados
em paralelo. Interessante, não?
1. Criar a seguinte Tabela:

CREATE TABLE LANCAMENTO_CONTABIL (


ID_LANCAMENTO_CONTABIL INT NOT NULL,
DATA_LANCAMENTO DATETIME,
DATA_FATO DATETIME,
ID_CONTA_CONTABIL INT,
VALOR MONEY
)

2. Criar a função de particionamento com DataType DATETIME como parâmetro

CREATE PARTITION FUNCTION


PF_Tabela_Lancamento_Contabil(DATETIME) AS RANGE RIGHT
FOR VALUES (
'2006-07-01',
'2006-10-01',
'2007-01-01',
'2007-04-01')

3. Adicionar 10 FILEGROUPS ao Banco de Dados

ALTER DATABASE DBA ADD FILEGROUP FG_TAB_LancContab_QBASE


ALTER DATABASE DBA ADD FILEGROUP FG_TABLancContab _Q1
ALTER DATABASE DBA ADD FILEGROUP FG_TABLancContab _Q2
ALTER DATABASE DBA ADD FILEGROUP FG_TABLancContab _Q3

4. Implementar a Partition Scheme PS_Tabela_Lancamento_Contabil, com a Partition


Function PF_Tabela_Lancamento_Contabil como parâmetro

CREATE PARTITION SCHEME


PS_TabelaXPTOQuarterly AS PARTITION PFTabelaXPTOQuarterly TO
(
FG_TAB_LancContab_QBASE
FG_TABLancContab _Q1,
FG_TABLancContab _Q2,
FG_TABLancContab _Q3 )

• Nesta situação, o primeiro FG tem todos os dados desde Abril 2006 até Julho 2006.
• Os seguintes FG’s tem a data que correspondente ao valor de cada partition.
• O último FG tem todos os dados com data superior a Abril 2008.
Apostila de MS SQL Server Pág.: 31 / 80

Linguagem SQL

Inserindo Dados

O comando INSERT insere linhas em uma tabela. A forma mais simples do comando insert somente uma
linha de dados. Nesse caso, são informados os valores de todas as colunas da tabela, na ordem em que
elas foram definidas na tabela. Também é possível inserir dados parciais de apenas algumas colunas
desde que as mesmas não estejam definidas como NOT NULL.

INSERT INTO nome_tabela (colunas) values (valores)

Tabela de Clientes

ID_Cliente Nome CNPJ Tipo Status Data Credito


1 MADEIRAS SAMAN 0002002/0001 J 1 25/06/2003 1.505
2 CAR VEICULOS 10025600/001 J 1 12/04/2005 1.112
3 CARLOS PEDREIRA 052116852-85 F 1 12/04/2004 500.00
9 FERNADA FERRAZ 011452369-85 F 1 11/02/2002 250.00
10 DANIEL SILVA 014548987-20 F 1 16/03/2001 150.00
11 FRAN ADESIVOS 2005006/1000 J 0 05/04/2005 50.00
12 SAPATOS E CIA. 10060085/100 J 1 05/05/2003 900.50
13 CALÇADOS VARTA 2002550/0001 J 0 12/07/2001 874.60
21 SALE ADVOGADOS 00010003/555 J 1 04/06/2004 20.00
22 PAULA MEDEIROS 003254896-84 F 0 01/06/2002 10.00

Tabela de Pedidos

ID_PEDIDO ID_CLIENTE DATAPED


1 1 10/05/2007
2 2 10/05/2007
3 1 25/05/2007
4 3 01/06/2007
5 9 04/06/2007
6 9 27/06/2007
7 10 10/07/2007
8 2 13/07/2007
9 10 15/07/2007
Apostila de MS SQL Server Pág.: 32 / 80

Tabela de Produtos

ID_PRODUTO DESCRIÇÃO PRECOCOMPRA SALDO


1 CANETA 0.19 20
2 LAPIS 0.10 112
3 BORRACHA 0.05 42
5 PAPEL LISO 5.60 23
7 PAPEL A4 5.80 22
10 COLA 1.19 3
11 GRAMPO 1.52 52
12 COPO PLASTICO 1.06 14
21 CADERNO 2.26 16
22 FICHAS 2.42 120

Tabela de Itens

ID_PEDIDO ID_PRODUTO QUANTIDADE PRECOVENDA


1 1 2 2,50
1 2 16 1,75
2 2 10 1,75
3 3 11 4,00
3 7 8 0,25
3 1 45 2,50
4 2 14 1,75
4 7 9 0,25
4 1 10 2,50
5 3 18 4,00
Apostila de MS SQL Server Pág.: 33 / 80

Atualizando Dados

Os dados em uma tabela pode ser modificada utilizando o comando UPDATE. O comando update não
adiciona novos registros a uma tabela, e nem remove os registros, simplesmente atualiza os dados
existentes. A forma mais simples da instrução update é a sua utilização para atualizar uma única coluna
em uma tabela. Tanto uma única linha de dados como numerosos registros podem ser atualizados ao
atualizar uma única coluna em uma tabela.

UPDATE clientes set tipo = 'J'


WHERE id_cliente= 1

Excluindo Dados

O comando delete é utilizado para remover linhas inteiras de dados de uma tabela. O comando delete
não é utilizado para remover valores de colunas especificas, um registro completo, incluindo todas as
colunas é removido. A instrução delete deve ser usada com cautela, ela funciona muito bem. Para
excluir um único registro ou registro selecionados de uma tabela, a instrução delete deve ser utilizada
com a seguinte sintaxe:

DELETE FROM clientes


WHERE ID_CLIENTE = 5
Apostila de MS SQL Server Pág.: 34 / 80

A Sintaxe SELECT

O comando SELECT recupera dados de uma ou mais tabelas, é a instrução utilizada para construir
consultas no banco de dados. A cláusula FROM é a cláusula obrigatória e sempre deve ser utilizada em
conjunção com a instrução SELECT.
Há quatro cláusulas, que são partes valiosas de uma instrução SELECT, A sintaxe mais simples para
recuperar dados dentro de um banco de dados:

SELECT listas_de_colunas
FROM listas_de_tabelas
WHERE condições

A lista_de_colunas especifica quais colunas serão retornadas como resultado, separadas por vírgula 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.

O comando SELECT pode ser utilizado para mostrar o conteúdo de variáveis, valores literais, etc...
Exemplo, execute o comando:

SELECT @@version

Comandos Select

SELECT, o camando que representa a Data Query Language (DQL) em que SQL, é a instrução utilizada
para construir consultas no banco de dados. A cláusula FROM é a cláusula obrigatória e sempre deve ser
utilizada em conjunção com a instrução SELECT.
Há quatro cláusulas, que são partes valiosas de uma instrução SELECT:

SELECT
FROM
WHERE
ORDER BY

Exemplo 01:

SELECT * FROM clientes

Exemplo 02:

SELECT id_cliente, nome, cnpj, status, tipo, data


FROM clientes
Apostila de MS SQL Server Pág.: 35 / 80

Agora adicione uma condição à mesma consulta.

SELECT id_cliente, nome, cnpj, status, tipo, data


FROM clientes
WHERE id_cliente = 2

Operadores Aritméticos Permitidos

(+) adição (-)subtração (*)multiplicação (/)divisão

Funções

COUNT
A função COUNT é utilizada para contar linhas ou valores de uma coluna que não tem valor null. A
função COUNT quando utilizada com uma consulta retorna valor numérico.

SELECT COUNT (*) FROM CLIENTES

SUM
É utilizada para retornar um total nos valores de uma coluna para um grupo de linhas.

SELECT SUM (CREDITO) FROM CLIENTES

MAX
A função MAX é utilizada para retornar o valor máximo para valores de uma coluna em um grupo de
linhas.

SELECT MAX (CREDITO) FROM CLIENTES

MIN
A função MIN retorna o valor mínimo de uma coluna para um grupo de linhas.

SELECT MIN (CREDITO) FROM CLIENTES

AVG
A função AVG retorna o valor médio não ponderado de uma coluna para um grupo de linhas.

SELECT AVG (CREDITO) FROM CLIENTES


Apostila de MS SQL Server Pág.: 36 / 80

Duas Formas Possíveis de Select (com e sem ALIAS)

SELECT Cl.nome,
Cl.credito,
Pe.DataPed,
Sum(It.Quantidade * It.PrecoVenda) As Total

FROM Clientes Cl, Pedidos Pe, Itens It

WHERE Cl.id_cliente = Pe.id_cliente


AND Pe.id_pedido = It.id_pedido

GROUP BY Cl.nome, Cl.credito, P.DataPed

ou

SELECT Clientes.nome,
Clientes.credito,
Pedidos.DataPed,
Sum(Itens.Quantidade * Itens.PrecoVenda) As Total

FROM Clientes, Pedidos, Itens

WHERE Clientes.id_cliente = Pedidos.id_cliente


AND Pedidos.id_pedido = Itens.id_pedido

GROUP BY Clientes.nome, Clientes.credito, Pedidos.DataPed


Apostila de MS SQL Server Pág.: 37 / 80

Operadores Lógicos
São aqueles operadores que utilizam palavras-chave de SQL para fazer comparações em vez de
símbolos. Os operadores lógicos abordados são:

IS NULL
Utilizado para comparar um valor com um valor null. No exemplo, o campo crédito não tem valor.

SELECT * FROM CLIENTES WHERE HISTORICO IS NULL

BETWEEN
É utilizado para procurar valores que estão dentro de um conjunto de valores, dado o valor mínimo e o
valor máximo. No exemplo, o campo valor deve estar entre 20 e 50.

SELECT * FROM CLIENTES WHERE credito BETWEEN 20 AND 50

IN
É utilizado para comparar um valor com uma lista de valores literais que foi especificada. No exemplo, o
campo crédito deveria ser um dos valores da lista.

SELECT * FROM CLIENTES WHERE crédito IN (20, 30, 50)

LIKE
É utilizado para comparar um valor com valores semelhantes utilizando operadores curinga (%)
porcentagem ou (_) sublinhado.
-Exemplolo: Localiza quaisquer valores que comecem com PAB

SELECT * FROM CLIENTES WHERE nome LIKE ‘PAB%’

-Exemplo: Localiza quaisquer valores que contenham ABL a partir da segunda casa e terminem com
quaisquer valores.

SELECT * FROM CLIENTES WHERE nome LIKE ‘_AND%'


Apostila de MS SQL Server Pág.: 38 / 80

EXISTS
É utilizado para procurar a presença de uma linha em uma tabela específica que atenda a certos
critérios. Veja como pesquisar para ver se id_cliente 982 está na tabela clientes.

SELECT * FROM CLIENTES


WHERE EXISTS ( Select id_cliente From clientes Where id_cliente = 982)

NOT EXISTS
É utilizado para procurar a não ocorrência de uma linha em uma tabela específica que atenda a certos
critérios. Veja como pesquisar para ver se existe clientes que não compraram. Logo não ocorrem na
tabela pedidos.

SELECT * FROM CLIENTES WHERE NOT EXISTS ( Select id_cliente From Pedidos)
Apostila de MS SQL Server Pág.: 39 / 80

INNER JOINS
Um INNER JOIN conecta duas ou mais tabelas segundo uma condição de junção. O INNER JOIN retorna
os registros que forem encontrados nas tabelas e respeitarem as condições de busca.Para esse exemplo
vamos adicionar uma nova tabela em nosso banco:

CREATE TABLE Cidades(


ID_Cidade int NOT NULL PRIMARY KEY,
CidadeNome varchar (50) NOT NULL,
Estado char (2) NOT NULL
)

ALTER TABLE CLIENTES Add Id_Cidade(INT) NULL

SELECT Clientes.Nome, Cidades.CidadeNome, Cidades.Estado


FROM Clientes INNER JOIN Cidades ON Clientes.ID_Cidade = Cidades.ID_Cidade

OUTER JOINS
Como podemos reparar no INNER JOIN, somente as linhas que possuem dados nas duas colunas do
relacionamento são retornadas. Caso uma das colunas não possua valor (tenha null), este registro não
participará da junção do SELECT.
Isto pode não uma determinada pergunta. Você pode estar querendo saber, por exemplo, quais os
clientes que você tem cadastrado, e, se houver a informação, o nome da cidade destes.

LEFT OUTER JOINS


Neste caso, você precisa de um OUTER JOIN. Um OUTER JOIN traz todas as linhas de uma determinada
tabela, tendo ou não relacionamento completo, e as linhas da segunda tabela que satisfizerem o
relacionamento. Vamos construir o exemplo dito antes:

SELECT Clientes.Nome, Cidades.CidadeNome, Cidades.Estado


FROM Clientes LEFT OUTER JOIN Cidades ON Clientes.ID_Cidade = Cidades.ID_Cidade;

Nome CidadeNome Estado


Cliente1 Rio de Janeiro RJ SP
Cliente2 São Paulo NULL
Cliente3 NULL MG
Cliente4 São Paulo
Apostila de MS SQL Server Pág.: 40 / 80

RIGHT OUTER JOINS


Se quiséssemos trazer todas as cidades, e os clientes que existirem nelas, faríamos:

SELECT Clientes.Nome, Cidades.CidadeNome, Cidades.Estado


FROM Clientes RIGHT OUTER JOIN Cidades ON Clientes.ID_Cidade = Cidades.ID_Cidade

Nome CidadeNome Estado


Cliente1 Rio de Janeiro RJ
Cliente2 São Paulo SP
Cliente4 São Paulo MG
NULL Vitória ES

Que esteja bem claro que a palavra LEFT ou RIGHT refere-se apenas à ordem escrita das tabelas,
vamos ver um outro exemplo de trazer todos os clientes e as cidades destes:

SELECT Clientes.Nome, Cidades.CidadeNome, Cidades.Estado


FROM Cidades RIGHT OUTER JOIN Clientes ON Clientes.ID_Cidade = Cidades.ID_Cidade

Nome CidadeNome Estado


Cliente1 Rio de Janeiro RJ
Cliente2 São Paulo SP
Cliente3 NULL NULL
Cliente4 São Paulo MG

FULL OUTER JOINS

E podemos, ainda, juntar os dois modos: ou seja, fazer um LEFT e RIGHT OUTER JOIN ao mesmo
tempo. Isto, na, verdade, se chama FULL OUTER JOIN. E o exemplo está a seguir:

SELECT Clientes.Nome, Cidades.CidadeNome, Cidades.Estado


FROM Cidades FULL OUTER JOIN Clientes
ON Clientes.ID_Cidade = Cidades.ID_Cidade;

Nome CidadeNome Estado


Cliente1 Rio de Janeiro RJ
Cliente2 São Paulo SP
Cliente4 São Paulo MG
NULL Vitória ES
Cliente3 NULL NULL
Apostila de MS SQL Server Pág.: 41 / 80

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 podem ser acessadas (para leitura ou
modificação), o que é útil no caso de controle de acesso,

Uma consulta SELECT que é usado muito frequentemente 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 usada para exportar dados para outras aplicações.

Criando uma visão


Vamos criar uma visão no banco de dados Aluno, usando a tabela Clientes. Essa visão vai mostrar o
código, nome e histórico de clientes de pessoas jurídicas.
Para criar uma visão use o comando CREATE VIEW.

CREATE VIEW VIEWcase AS


SELECT Clientes.Nome,
Clientes.Credito,
'Avaliação'=
Case
When Credito Between 0 and 100 then 'Regular'
When Credito Between 101 and 200 then 'Bom'
Else 'Ótimo'
End

FROM Clientes

CREATE VIEW VIEWClientes AS


SELECT Clientes.ID_Cliente,
Clientes.Nome,
Clientes.Historico
FROM Clientes

WHERE (Tipo = 'J')


Apostila de MS SQL Server Pág.: 42 / 80

CREATE VIEW VIEWCube AS


SELECT Produtos.Descricao, Pedidos.Dataped,
SUM(Itens.Quantidade) as Quantidade
FROM Pedidos
INNER JOIN ITENS ON Pedidos.ID_Pedido = Itens.ID_Pedido
INNER JOIN PRODUTOS ON Itens.ID_Produto = Produtos.ID_Produto
GROUP BY Produtos.Descricao,
Pedidos.Dataped

WITH Cube

Obs:
O operador CUBE é utilizado junto com a cláusula Group By para produzir linhas adicionais de resumo.
Ele produzirá linhas superagregadas utilizando cada possível combinação das colunas na cláusula Group
By, produzirá médias parciais e somas parciais mas também colunas de referência cruzada para retornar
linhas adicionais de resumo.

CREATE VIEW VIEWROLLUP AS


SELECT Produtos.Descricao, Pedidos.Dataped,
SUM(Itens.Quantidade) as Quantidade
FROM Pedidos
INNER JOIN ITENS ON Pedidos.ID_Pedido = Itens.ID_Pedido
INNER JOIN PRODUTOS ON Itens.ID_Produto = Produtos.ID_Produto
GROUP BY Produtos.Descricao,
Pedidos.Dataped
WITH ROLLUP

Obs:
Assim como o operador Cube, o RollUp funciona em conjunto com a cláusula Group By, geralmente
utilizado para produzir médias em execução ou somas em execução aplicando a função agregada para
cada coluna que consta na cláusula Group By.
Apostila de MS SQL Server Pág.: 43 / 80

Stored Procedure
Um procedimento armazenado [stored procedure] é 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. Eles
também aumentam o desempenho de várias operações, pois são executados no servidor e pré-
compilados, ao contrário de comandos SQL que devem ser interpretados no momento da execução.
Para criar um procedimento, use o comando CREATE PROCEDURE. Exemplo o procedimento abaixo
recebe um parâmetro (@nome) e mostra todos os clientes cujo nome contenha o nome informado:

CREATE PROCEDURE ProcIncCliente (


@ID_Cliente Int,
@Nome Varchar(50),
@Cnpj Char(14),
@Tipo Char(1),
@Status Bit,
@Data DateTime,
@Historico Text,
@Foto Image,
@Credito Money) AS

BEGIN

INSERT Into
Clientes(ID_Cliente , Nome, Cnpj, Tipo, Status, Data, Historico, Foto, Credito)
Values(
@ID_Cliente, @Nome, @Cnpj, @Tipo, @Status, @Data, @Historico, @Foto ,@Credito
)

END
Apostila de MS SQL Server Pág.: 44 / 80

CREATE PROCEDURE ProcIAltCliente(


@ID_Cliente Int,
@Nome Varchar(50),
@Cnpj Char(14),
@Tipo Char(1),
@Status Bit,
@Data DateTime,
@Historico Text,
@Foto Image,
@Credito Money
) AS

BEGIN

Begin Transaction

Update Clientes Set


Clientes.Nome = @Nome,
Clientes.Cnpj = @Cnpj,
Clientes.Tipo = @Tipo,
Clientes.Status = @Status,
Clientes.Data = @Data,
Clientes.Historico = @Historico,
Clientes.Foto = @Foto,
Clientes.Credito = @Credito

Where Clientes.ID_Cliente = @ID_Cliente

If @@Error = 0
Begin
Commit Transaction
Return (0)
End
Else
Begin
Rollback Transaction
Return (1)
End
END
Apostila de MS SQL Server Pág.: 45 / 80

CREATE PROCEDURE ProcExcCliente(@ID_Cliente Int) As


Declare @Msg Varchar (255),
@Erro int
BEGIN

Delete From Clientes


Where Clientes.ID_Cliente = @ID_Cliente

set @Erro = @@Error

If @Erro <> 0
begin
Select @Msg = 'Operação Não Realizada devido ao seguinte erro: '
+ Convert (Varchar (255), @Erro)
Raiserror (@Msg, 10, 1)
End

END

CREATE PROCEDURE ProcVendaProduto(


@DataIni DateTime,
@DataFim DateTime,
@Valor Money) As

BEGIN

Select Produtos.Descricao,
Sum(Itens.Quantidade * Itens.Precovenda) As Total
From Produtos INNER JOIN Itens
On Produtos.ID_Produto = Itens.ID_Produto
INNER JOIN Pedidos
On Pedidos.ID_Pedido = Itens.ID_Pedido
Where Pedidos.DataPed BetWeen @DataIni And @DataFim
Group By Produtos.Descricao
Having Sum(Itens.Quantidade * Itens.Precovenda) > @Valor
Order By Produtos.Descricao

END
Apostila de MS SQL Server Pág.: 46 / 80

CREATE PROCEDURE ProcVendasMesAno(


@DataIni DateTime,
@DataFim DateTime) AS

BEGIN

Select Convert(Varchar(15), Datepart(yy,Pedidos.Dataped)) + '-' +


Convert(Varchar(15), Datepart(mm,Pedidos.Dataped)) AS 'Ano_Mes',
Sum(Itens.Quantidade * Itens.Precovenda) AS Total, edidos.DataPed
From Itens INNER JOIN Pedidos
On Itens.ID_Pedido = Pedidos.ID_Pedido
Where Pedidos.Dataped Between @Dataini And @DataFim
Group By Convert(Varchar(15), Datepart(Mm,Pedidos.Dataped)) + '-' +
Convert(Varchar(15), Datepart(Yy,Pedidos.Dataped)), Pedidos.DataPed
Order By Convert (Varchar(15), Datepart(Mm,Pedidos.Dataped)) + '-' +
Convert(Varchar(15), Datepart(Yy,Pedidos.Dataped))

END
Apostila de MS SQL Server Pág.: 47 / 80

CREATE PROCEDURE ProcCursor AS

Declare cursorX Cursor for Select Produtos.* From Produtos


Declare @ID_Produto int,
@descricao varchar(25),
@precocompra money,
@saldo int

BEGIN

open cursorx

Create Table #tempProduto( ID_Produto int,


Descricao varchar(25),
PrecoCompra money,
Saldo int
)

fetch cursorx into @ID_Produto, @descricao, @precocompra, @saldo

while (@@fetch_status = 0)
begin
if @saldo > 1
begin
Insert Into #tempProduto
values(@ID_Produto,
@descricao,
@precocompra,
@saldo)
end
fetch cursorx into @ID_Produto, @descricao, @precocompra, @saldo
end

close cursorx

Deallocate cursorx

select * from #tempProduto

END
Apostila de MS SQL Server Pág.: 48 / 80

CREATE PROCEDURE ProcCursorTabTemp AS

Declare cursorX Cursor for


Select Clientes.Nome,
Sum(Itens.Quantidade * Itens.PrecoVenda) as Total
From Clientes INNER JOIN Pedidos
On Pedidos.ID_Cliente = Clientes.ID_Cliente
INNER JOIN Itens
On Itens.ID_Pedido = Pedidos.ID_Pedido
Group By Clientes.Nome

Declare @nome varchar(35), @total Money

BEGIN

open cursorx

Create Table #tempPedidosCliente(Nome varchar(35), Total money)

fetch cursorx into @nome, @total

While (@@fetch_status = 0)
begin
if @total > 1
begin
Insert Into #tempPedidosCliente Values(@nome, @total)
end
fetch cursorx into @nome, @total
end

close cursorx

Deallocate cursorx

Select * From #tempPedidosCliente


END
Apostila de MS SQL Server Pág.: 49 / 80

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 e DELETE numa tabela.
Geralmente gatilhos são utilizados para reforçar restrições de integridade que não podem ser tratadas
pelos recursos mais simples, como regras, restrições, a opção NOT NULL etc.
Um gatilho também pode ser usado para calcular e armazenar valores automaticamente em outra
tabela.
Vamos criar um gatilho, chamado ValidaCredito, que será ativado por uma operação INSERT na tabela
dbo.clientes.

CREATE TRIGGER ValidaCredito ON Clientes FOR Insert AS


Declare @ValorCredito money, @IDCliente int
BEGIN
Select @ValorCredito = Inserted.Credito, @IDCliente = Inserted.ID_Cliente
From Inserted
If @ValorCredito > 10000
Update Clientes set Clientes.Credito = 10000 Where Clientes.ID_Cliente = @IDCliente
END
Apostila de MS SQL Server Pág.: 50 / 80

CREATE TRIGGER AtualizaSaldoInc ON Itens FOR INSERT AS


DECLARE @QTD INT,
@COD INT,
@SALDO INT,
@NRO INT,
@Descricao varchar(255),
@msg varchar(255)
BEGIN

SELECT @QTD = INSERTED.QUANTIDADE, @COD = INSERTED.ID_PRODUTO,


@NRO = INSERTED.ID_PEDIDO
FROM INSERTED

SELECT @SALDO = PRODUTOS.SALDO, @DESCRICAO = PRODUTOS.DESCRICAO


FROM PRODUTOS WHERE PRODUTOS.ID_PRODUTO = @COD

IF @SALDO >= @QTD


UPDATE PRODUTOS SET PRODUTOS.SALDO = PRODUTOS.SALDO - @QTD
WHERE PRODUTOS.ID_PRODUTO = @COD
ELSE
BEGIN
SELECT @MSG = 'INI Não aceito, pois saldo do produto ' + @descricao
+ ' é: ' + Convert (Varchar(255), @saldo)
+ ' não atendendo a necessidade. FIM'

Raiserror (@msg, 14, 1)

Rollback
END
END

CREATE TRIGGER AtualizaSaldoExc ON Itens FOR DELETE AS


DECLARE @Qtd INT, @Cod INT
BEGIN
SELECT @Qtd = Deleted.Quantidade, @Cod = Deleted.ID_Produto
FROM DELETED

UPDATE Produtos SET Saldo = Saldo + @Qtd


WHERE ID_PRODUTO = @Cod
END
Apostila de MS SQL Server Pág.: 51 / 80

CREATE TRIGGER AtualizaSaldoAlt ON ITENS FOR UPDATE AS


DECLARE @QTDNovo INT,
@CODNovo INT,
@QTDAnterior INT,
@CODAnterior INT,
@SALDO INT,
@Descricao varchar(25),
@Msg varchar(255)
BEGIN
SELECT @QTDNovo = INSERTED.QUANTIDADE,
@CODNovo = INSERTED.ID_PRODUTO
FROM INSERTED

SELECT @QTDAnterior = DELETED.QUANTIDADE,


@CODAnterior = DELETED.ID_PRODUTO
FROM DELETED

UPDATE PRODUTOS SET


PRODUTOS.SALDO = PRODUTOS.SALDO + @QTDAnterior
WHERE PRODUTOS.ID_PRODUTO = @CODAnterior

SELECT @SALDO = PRODUTOS.SALDO,


@DESCRICAO=PRODUTOS.DESCRICAO
FROM PRODUTOS
WHERE PRODUTOS.ID_PRODUTO = @CODNovo

IF @SALDO >= @QTDNovo


UPDATE PRODUTOS SET
PRODUTOS.SALDO = PRODUTOS.SALDO - @QTDNovo
WHERE PRODUTOS.ID_PRODUTO = @CODNovo
ELSE
BEGIN
SELECT @MSG = 'INI Não aceito, pois saldo do produto ' + @Descricao
+ ' é: ' + Convert (Varchar(255), @saldo)
+ ' não atendendo a necessidade. FIM'
Raiserror (@Msg, 14, 1)
Rollback
END
END
Apostila de MS SQL Server Pág.: 52 / 80

Controle de Transação

Controlando Transação Simples


Begin
Begin Transaction
Insert Into Produtos(Descricao, Saldo, PrecoCompra)
Values('Novo Produto - 01', 1200, 12.78)
Insert Into Produtos(Descricao, Saldo, PrecoCompra)
Values('Novo Produto - 02', 400, 23.78)
If @@Error = 0
Begin
Print 'Registro inserido com sucesso.'
Commit Transaction
End
Else
Begin
Print 'Registro não incluído.'
Rollback Transaction
End
End

Controlando Transações com Savepoints(Circunstancial)

Begin
Begin Tran
Save Tran Trans1
Insert Into Produtos(Descricao, Saldo, PrecoCompra)
Values('Novo Produto', 1200, 12.78)
If @@Error = 0
Begin
Print 'Produto não incluído.'
Rollback Tran Trans1
End
Save Tran Trans2
Insert Into Produtos(Descricao, Saldo, PrecoCompra)
Values('Novo Produto', 1200, 12.78)
If @@Error = 0
Begin
Print 'Cor não incluído.'
Rollback Tran Trans2
End
Commit Tran
End
Apostila de MS SQL Server Pág.: 53 / 80

Outros Objetos
Default

CREATE DEFAULT DefautGetData as GetData()


CREATE DEFAULT DefautISigla as 'RJ'

Rule

CREATE RULE Sigla as @Valor = 'RJ' / 'ES' / 'MG'


CREATE RULE Sigla2 as @Valor in ('RJ', 'ES', 'MG' )
CREATE RULE Faixa as @Valor >= 1 and @Valor <= 1000

Criando Login

No SQL SERVER Login é um conjunto de caracteres composto de LoginName, password database


default, default language e UserName solicitado para os usuários que por algum motivo necessitam
acessar algum sistema de banco de dados. Geralmente os sistemas computacionais solicitam um login e
uma senha para a liberação do acesso.

Usando comandos DDL

CREATE LOGIN Digidata_Login


WITH PASSWORD = '123',
DEFAULT_DATABASE = digidata,
DEFAULT_LANGUAGE = Português

Usando system procedure

SP_AddLogin ' Digidata_Login ',' 123',' digidata '


Apostila de MS SQL Server Pág.: 54 / 80

Criando Login com Wizard

Escolha do nome de Login, senha, banco de dados padrão e linguagem


Apostila de MS SQL Server Pág.: 55 / 80

Escolha do BD default, UserName e Papeis de Sistema

Criando Usuário

Usando comandos DDL

CREATE USER Digidata_User


FOR LOGIN Digidata_Login

Usando system procedure

SP_AddUser ' Digidata_Login',' Digidata_User'


Apostila de MS SQL Server Pág.: 56 / 80

Criando Usuário com Wizard

Escolha do Login, Nome do Usuário


Apostila de MS SQL Server Pág.: 57 / 80

Escolha dos Objetos de BD e permissões

Concedendo Permissões aos Usuários

Para conceder ou revogar permissões a um usuário, é mais fácil usar:

GRANT ALL TO Digidata_User


REVOKE ALL FROM Digidata_User

GRANT create table TO Digidata_User


REVOKE create table FROM Digidata_User

GRANT select ON clientes TO Digidata_User


REVOKE select ON clientes TO Digidata_User
Apostila de MS SQL Server Pág.: 58 / 80

Criando Role

Usando comandos DDL

CREATE ROLE Digidata_Role AUTHORIZATION Digidata_User

Usando system procedure

SP_Addrole Digidata_Role

Adicionando o User a Role

EXEC SP_Addrolemember Digidata_Role, Digidata_User

Adicionando privilégios a Role

GRANT SELECT ON Clientes TO Digidata_Role


GRANT CREATE TABLE TO Digidata_Role
DENY CREATE TABLE TO Digidata_Role
Apostila de MS SQL Server Pág.: 59 / 80

Criando Role com Wizard

Escolha do RoleName,
Apostila de MS SQL Server Pág.: 60 / 80

Selecionando os objetos e permissões 1/3


Apostila de MS SQL Server Pág.: 61 / 80

Selecionando os objetos e permissões 2/3


Apostila de MS SQL Server Pág.: 62 / 80

Selecionando os objetos e permissões 3/3


Apostila de MS SQL Server Pág.: 63 / 80

Criando BackUp e Restore

Fazer um backup consiste em copiar o banco de dados para um local seguro.


Uma cópia de backup deve ser feita na medida do possível em outra máquina da rede, para uma fita
magnética ou outro meio magnético. O backup copia tudo o que esta dentro do banco de dados,
incluindo o log de transação.
O log de transação é um registro serial de todas as modificações feitas no banco de dados. Esse log é
usado no processo de restauração para fazer todas as alterações que ocorrem no banco de dados desde
o ultimo backup.
A restauração do banco de dados, quando bem sucedida, retorna o banco ao estado em que estava no
momento da execução do backup. Se durante a execução de backup alguam transação não tiver sido
concluída,ela será desfeita para garantir a consistência da base de dados.
O SQL Server 2005 permite a confecção de dois tipos de backup: o backup completo e o diferencial. O
backup completo, como o nome diz, é uma fotografia exata de todo o banco de dados. O backup
diferencial é uma cópia das alterações feitas no banco de dados, desde a realização do ultimo backup
completo.

Criando backup completo


Apostila de MS SQL Server Pág.: 64 / 80

Criando backup diferencial


Apostila de MS SQL Server Pág.: 65 / 80

Efetuando o Restore full e diferencial


Apostila de MS SQL Server Pág.: 66 / 80

Efetuando um Restore pontual


Apostila de MS SQL Server Pág.: 67 / 80

Registrar Servidores
Arquitetura Distribuída do SQL Server
O SQL Server utiliza uma arquitetura na qual vários servidores distribuídos podem ser acessados a partir
de um único servidor. Para que isto seja possível, estes servidores devem ser configurados como Linked
Servers.

Para executarmos esta atividade, você deve criar na sua máquina um linked server apontando para o a
máquina de um colega (sugestão: caso queira executar a atividade em uma mesma máquina, faça uma
segunda instalação do SQL Server, dando à nova instância que será criada um nome diferente do
padrão 'SQLEXPRESS'). A configuração de um Linked Server pode ser feita usando a stored procedure
sp_addlinkedserver ou através do SQL Server Management Studio Express, selecionando a opção de
menu 'New Linked Server':
Apostila de MS SQL Server Pág.: 68 / 80

A janela de diálogo 'New Linked Server' será exibida. Na página 'General' defina o nome e o tipo do
servidor. Na página 'Security' defina mapeamentos de usuários entre os servidores local e remoto, caso
necessário; e defina como proceder para logins que não foram mapeados (sugestão: use a opção 'Be
made using the login´s current security context').

Para acessar dados no servidor remoto, devemos referenciar o nome do servidor, o banco de dados, o
esquema e o nome da tabela. Uma seleção na relação 'Rel' do banco de dados 'BD' do servidor 'SERVER\
SQLEXPRESS' teria a seguinte sintaxe em SQL:

select * from [NomeServidor\SQLEXPRESS].NomeBanco.Esquema.NomeTabela

-Como exemplo poderíamos considerar:

select * from [Servidor01\SQLEXPRESS].BancoCurso.dbo.Clientes


Apostila de MS SQL Server Pág.: 69 / 80

Conhecendo o SQL Server 2005 Express Edition


Antes de mais nada, vamos esclarecer uma coisa. O SQL Server 2005 Express Edition (SQL Server Express) não é o
SQL Server 2005 propriamente dito. O SQL Server Express é uma plataforma de banco de dados baseada nas
tecnologias do SQL Server 2005 e chega para substituir o MSDE 2000. Ele é um produto gratuito e possui
características de rede e segurança que o diferenciam das demais edições do SQL Server 2005.
Neste artigo pretendo fazer uma introdução básica sobre o SQL Server Express 2005, falando sobre suas principais
características e fazendo uma comparação com o atual MSDE 2000.
Esta edição do SQL Server Express tem como grande promessa uma superior facilidade de utilização com um
processo de instalação simples e robusto e com uma ferramenta gráfica (SQL Express Manager), que permitirá
realizar a adminsitração do servidor de uma forma simples e prática. Esta ferramenta gráfica ainda esta em
desenvolvimento e será disponibilizada como um download gratuíto no site da Microsoft.
O SQL Server Express foi desenvolvido tendo em mente duas utilizações básicas: A primeira, como um servidor de
produtos, especialmente como um Web Server ou Database Server. O segundo, como um cliente stand-alone,
onde a aplicação não precise depender de uma rede para obter acesso aos dados.

O Engine
O SQL Server Express usa o mesmo engine que as demais edições do SQL Server 2005, mas por ser uma edição
digamos, light, possui algumas limitações. O engine suporta 1CPU, 1GB RAM e banco de dados com até 4GB. Uma
mudança significativa em relação ao MSDE 2000 é que o engine do SQL Express não possui a limitação de usuários
concorrentes, conhecida como “Concurrent Workload Governor” onde a performance do MSDE 2000 é
extremamente prejudicada na medida em que as conexões concorrentes de usuários aumentam. Para saber mais
sobre esta limitação do MSDE 2000, clique aqui.
O SQL Server Express até pode ser instalado em máquinas multiprocessadas mas somente 1 CPU será reconhecida
pelo engine. Como consequência, características como execução de consultas em paralelo não é suportado pelo
SQL Server Express.
O limite de 1GB RAM é apenas para o buffer pool. O buffer pool é usado para o armazenamento de páginas de
dados e outras informações. A memória necessária para o gerenciamento de conexões, locks e outros não estão
incluídos neste limite de 1GB. Sendo assim, o SQL Express pode ser instalado normalmente em máquinas com
mais de 1GB, mas ele nunca usará mais que 1GB para o buffer pool. AWE ou /3GB não é suportado.
O limite de 4GB para o banco de dados é aplicado apenas para o arquivo de dados. Entretanto, não existe limite
para o número de banco de dados que você pode colocar no servidor.
O SQL Server Express suporta instalação side-by-side com outras versões do SQL Server, podendo coexistir na
mesma máquina junto com instalações do SQL Server 2000, SQL Server 2005 ou MSDE 2000. Suporta um número
máximo de 50 instâncias na mesma máquina desde que cada instância seja unicamente identifica, ou seja, você
pode realizar até 50 instalações do SQL Express desde que cada instância tenha um nome diferente. Por padrão o
SQL Server Express é instalado com uma named instance chamada SQLEXPRESS.

Ferramentas
Diferente do MSDE 2000 que não possui ferramenta gráfica, o SQL Server Express possuirá uma ferramenta gráfica
chamada SQL Server Management Studio Express (SSMSE). Esta, ainda em fase de desenvolvimento, mas já
disponível para download público, será uma versão ligth do atual SQL Server Management Studio disponível nas
demais edições do SQL Server 2005 e permitirá uma fácil administração dos bancos de dados.
O SSMSE suportará conexões para SQL Server Express e outras edições do SQL Server 2005, SQL Server 2000 e
MSDE 2000. Uma janela de conexão guiará o usuário através da seleção de uma instância e o método de
autenticação a ser utilizado, suportando conexões locais ou remotas. Diversas funcionalidades de gerenciamento
de banco de dados estarão disponíveis através do menu de contexto (botão direito) e wizards. Entre elas podemos
citar, criar e modificar banco de dados, tabelas, usuários e logins. O Query Editor do SSMSE também permitirá o
desenvolvimento e execução de instruções T-SQL e scripts.
Apostila de MS SQL Server Pág.: 70 / 80

Figura 01
Apostila de MS SQL Server Pág.: 71 / 80

Suporte a Rede
Embora o usuário possa habilitar o suporte a protocolos como TCP/IP e Named Pipes , por padrão o SQL Server
Express é instalado apenas com suporte a shared memory. Isto faz com que por default o SQL Server Express
funcione apenas localmente na máquina onde foi instalado e não suporte conexões de clientes em uma rede. Para
suportar conexões de clientes remotos, é necessário habilitar o suporte a rede no SQL Server Express. Para
habilitar o suporte a rede, você tem as seguintes opções:

-Usar o SQL Server Configuration Manager para habilitar os protocolos necessários (normalmente TCP/IP) e iniciar
o serviço SQL Server Browser.

A figura abaixo mostra o uso do SQL Server Configuration Manager para habilitar protocolos de rede.

Você pode acessar a funcionalidade descrita acima, clicando em Iniciar / Programas / Microsoft SQL Server
2005 / Configuration Tools / SQL Server Configuration Manager no menu suspenso do seu Windows.

Figura 02

O SQL Browser é um novo serviço do SQL Server 2005 que identifica as portas que as named instances estão
usando. Este serviço vem desativado por default e deve ser ativado para que a comunicação entre um cliente
remoto e um servidor SQL Server Express funcione corretamente.

Complementando a configuração necessária, observe a Figura 03, onde a propriedade Enabled é habilitada
(Yes). Observe ainda a Figura 04 onde as propriedades Active e Enabled também devem estar habilitadas (Yes).
Apostila de MS SQL Server Pág.: 72 / 80

Figura 03

Figura 04
Apostila de MS SQL Server Pág.: 73 / 80

Por último, acessando o utilitário Microsoft SQL Server Management Studio Express, clique no nó Logins
escolhendo em seguida o login SA (naturalmente com o botão direito do mouse) acessando Propriedades no
menu suspenso. A Figura abaixo será exibida, devendo ser observado em Login name a opção SQL Server
Authentication. Defina um valor para password e pronto.

Figura 05
Apostila de MS SQL Server Pág.: 74 / 80

Funcionalidades
O SQL Server Express suporta a maioria das funcionalidades do SQL Server 2005. A tabela abaixo mostra algumas
características e componentes suportados.

Stored Procedures
SQL Computer Manager
Views
Replication (as a subscriber only)
Triggers
Advanced Query Optimizer
Cursors
SMO / RMO
Sqlcmd and osql utilities
Integration with Visual Studio 2005
Snapshot Isolation Levels
Service Broker (as a client only)
Native XML support, including XQuery and XML Schemas
SQL CLR
T-SQL language support
Multiple Active Result Sets (MARS)
Tabela 01

A tabela abaixo destaca os principais componentes do SQL Server 2005 que não são suportados nesta versão do
SQL Express Edition:

- Reporting Services
- Notification Services
- Analysis Services
- SQL Agent
- Full text search
- DTS
- OLAP Services / Data Mining
- English Query

A tabela seguinte também destaca algumas características do SQL Server 2005 e do SQL Server 2000 que não são
suportadas nesta versão do SQL Express:

Novas características do SQL Server 2005 Características do SQL Server 2000

Dedicated Administrator Connection SqlMail and SQLiMail


Database mirroring Fail-over clustering
Online restore Distributed partitioned views
Database snapshot VIA protocol support
Parallel index operations Log shipping
Mirrored media sets Parallel DBCC
Scale up partitioning Parallel Create Index
Address Windowing Extensions (AWE) Enhanced Read Ahead and Scan
Hot-add memory Indexed views (materialized views)
Native HTTP Partitioned

Tabela 02
Apostila de MS SQL Server Pág.: 75 / 80

Exercícios Extras
Variações do Comando Select

Subqueries (Exists, Not Exists, In e Not In)

Select Clientes.Nome From Clientes Where Exists


(Select * From Pedidos Where Clientes.ID_Cliente = Pedidos.ID_Cliente)

Select Clientes.Nome From Clientes Where Not Exists


(Select * From Pedidos Where Clientes.ID_Cliente = Pedidos.ID_Cliente)

Select Produtos.Descricao From Produtos Where Produtos.ID_Produto In


(Select Itens.ID_Produto From Itens Where Itens.Quantidade > 100 )

Select Produtos.Descricao From Produtos Where Produtos.ID_Produto Not In


(Select Itens.ID_Produto From Itens Where Itens.Quantidade > 100 )

Obtendo Dados pela União de Tabelas ou Views (Union)


Select Clientes.Nome, Clientes.Cnpj From Clientes
Union
Select Fornecedores.Nome, Fornecedores.Cnpj From Fornecedores

Obtendo Melhor Performance com o Operador Like


Select Clientes.Nome From Clientes Where Clientes.Nome Like 'Mar%'
Pode alcançar melhor performance se substituida por:
Select Clientes.Nome From Clientes Where
Clientes.Nome >= 'Mar' And Clientes.Nome Like 'Mar%'
Apostila de MS SQL Server Pág.: 76 / 80

Criar as seguintes tabelas e Índices

Associado
Create Table Associado(
Id Int Not Null,
Nome Varchar(50) Not Null,
Cidade Varchar(25) Not Null,
Estado Char(2) Not Null,
Data DateTime)

Especialidade
Create Table Especialidade(
Id Int Not Null,
Descricao Varchar(25) Not Null)

Associado_Especialidade
Create Table Associado_Especialidade(
Id Int Not Null,
AssociadoID Int Not Null,
EspecialidadeID Int Not Null)

Nota 1:
Entidades Associado e Especialidade referem-se as tabelas que identificam os agentes do projeto. Já
Associado_Especialidade, armazena os relacionamentos possíveis entre associados e especialidades.

Nota 2:
Quanto a chave primária, para Associado e Especialidade, os respectivos campos iniciados com Id
compõem a chave primária; e para a tabela Associado_Especialidade, que numa visão clássica, as
duas colunas, a saber, AssociadoID e EspecialidadeID iriam compor a chave primária. Mas numa visão
mais atualizada, cada entidade deve ter um atributo que defina sua chave primária, logo o campo ID é
inserido neste contexto para servir de chave primária para esta entidade.

Nota 3:
Finalizando a estrutura, observa-se que as colunas AssociadoID e EspecialidadeID da tabela
Associado_ Especialidade, são individualmente chave estrangeira, respectivamente com referência as
tabelas Associado e Especialidade.

Nota 4:
Adicionar 4 registros a tabela Associado, 4 registros a tabela Especialidade e pelo menos 8 registros
na tabela Associado_Especialidade.

Nota 5:
Criar índices para os campos nome, cidade e estado da tabela Associado e índice para o campo
descricao da tabela Especialidade.
Apostila de MS SQL Server Pág.: 77 / 80

Obs.: Usar a seguinte nomenclatura: Idx_campo_tabela

CREATE INDEX idx_Nome_Associado ON Associado(Nome)

CREATE INDEX idx_Cidade_Associado ON Associado(Cidade)

CREATE INDEX[idx_Estado_Associado ON Associado(Estado)

CREATE INDEX idx_Descricao_Especialidade ON Especialidade(Descricao)

Criar as Seguintes Views

-View que retorne a quantidade de cadastros de Associados por mês

Select Convert(Varchar(15), Datepart(mm,A.Data)) + '-' +


Convert(Varchar(15), Datepart(yy,A.Data)) AS 'Mes-Ano',
Count(A.nome) As Qtd
From Associado A
Group by Convert(Varchar(15), Datepart(mm,A.Data)) + '-' +
Convert(Varchar(15), Datepart(yy,A.Data))

-View que retorne quantas especialidades tem cada associado, com mais de uma especialidade.
Select A.Nome,
Count(AESP.Id_Associado) As Qtd
From Associado A INNER JOIN Associado_Especialidade AESP
On A.Id_Associado = AESP.AssociadoID
Group by A.Nome
Having Count(AESP.AssociadoID) > 1
Apostila de MS SQL Server Pág.: 78 / 80

Criar as Seguintes Procedures


-Criar uma procedure para a inclusão de associados, possibilitando alteração e exclusão. Também
implementar tratamento de erros (exception) e controle de Transação.

Create procedure Proc_Manut_Associados(


@Id Int, @nome Varchar(50),
@cidade Varchar(25), @estado Char(2),
@data DateTime, @operacao Char(1)
) As

Declare @Msg Varchar(255), @Erro int

BEGIN
If @operacao = 'I'
Begin
Insert Into Associado(Id, nome, cidade, estado, data)
Values(@Id, @nome, @cidade, @estado, @data)

set @Erro = @@Error


If @Erro <> 0
Begin
Select @Msg = 'Operação não realizada devido ao seguinte erro: '
+ Convert(Varchar(255),@Erro)
Raiserror(@Msg,10,1)
End
End
Else If @operacao = 'A'
Begin
Update Associado Set
Associado.Nome = @nome, Associados.Cidade = @cidade,
Associado.Estado = @estado, Associados.Data = @data,
Where Associado.Id = @id

set @Erro = @@Error


If @erro <> 0
Begin
Select @Msg = 'Operação não realizada devido ao seguinte erro: '
+ Convert(Varchar(255),@Erro)
Raiserror(@Msg,10,1)
End
End
Else
Begin
Delete Associado
Where Associado.Id = @id

set @Erro = @@Error


If @erro <> 0
Begin
Select @Msg = 'Operação não realizada devido ao seguinte erro: '
+ Convert(Varchar(255),@Erro)
Raiserror(@Msg,10,1)
End
End
END
Apostila de MS SQL Server Pág.: 79 / 80

-Criar uma Procedure que retorna a quantidade de associados que tenham especialidades por estado.
Esta Procedure deverá prover um parâmetro para escolha do estado.

CREATE Procedure Proc_QtdeAssociados_Estado(@estado char(2)) As


Begin
Select Count(Associado.Id)
From Associado INNER JOIN Associado_Especialidade
On Associado.Id = Associado_Especialidade.AssociadoID
Where Associado.estado = @estado
End
Apostila de MS SQL Server Pág.: 80 / 80

Criar as Seguintes Triggers

-Criar Trigger que dispare uma exceção, quando da inclusão ou alteração na tabela especialidades,
provocar um conteúdo para o campo descrição com menos de três caracteres.

CREATE TRIGGER Trig_Valida_Descricao ON Especialidade FOR INSERT, UPDATE AS


Declare @Tam int
Begin
Select @Tam = Convert(int , DataLength ( Inserted.Descricao))
From Inserted
If @Tam < 3
Begin
Raiserror ('Erro' ,10,1)
Rollback
End
End

-Criar uma Trigger que limite o total de especialistas de uma especialidade(Descricao) em no máximo 4
(quatro), por Estado.

Create Trigger Trig_Controla_Limite_Especialistas on Associado_Especialidade


For Insert, Update AS

Declare @total Numeric, @estado Char(2)

Begin
Select @estado = Associado.Estado
From Associados , Inserted
Where Associado.Id = Inserted.Id

Select @total = Count(Associado.Estado)


From Associado
INNER JOIN Associado_Especialidade
On Associados.Id = Associado_Especialidade.AssociadoID
INNER JOIN Inserted
On Associado_Especialidade. EspecialidadeID = Inserted.EspecialidadeID
Where Associado.Estado = @estado

If @total > 4
Begin
Raiserror('Minha Mensagem.....',10,1)
End
End

Você também pode gostar