101
Curso Microsoft SQL Server 2008 Utilizando a Linguagem Transact SQL

Apostila SQL Server 2008

Embed Size (px)

DESCRIPTION

Apostila SQL server Nilson Borges

Citation preview

Page 1: Apostila SQL Server 2008

Curso Microsoft

SQL Server 2008

Utilizando a Linguagem Transact SQL

Page 2: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 2 de 101

ÍNDICE

1. INTRODUÇÃO............................................................................................................................. 4

2. CONHECENDO O MICROSOFT SQL SERVER 2008 .............................................................. 5

3. PREPARANDO PARA INSTALAR O SQL SERVER 2008 ....................................................... 6

3.1. USANDO O SQL SERVER COM APLICATIVOS CLIENTE/SERVIDOR ..................................................... 8 3.2. DECIDINDO ENTRE COMPONENTES DO SQL SERVER ....................................................................... 9 3.3. FERRAMENTAS DO SQL SERVER 2008 (CATEGORIAS) .................................................................. 9 3.4. REQUISITOS DE HARDWARE DO SQL SERVER 2008 .......................................................... 12

3.4.1. REQUISITOS DE PROCESSADOR ..................................................................................... 12 3.4.2. REQUISITOS DE MEMÓRIA .............................................................................................. 12 3.4.3. REQUISITOS DE DISCO RÍGIDO ...................................................................................... 12 3.5. SQL SERVER MANAGEMENT STUDIO ............................................................................... 13 3.6. OS DATABASES DO SQL-SERVER ........................................................................................ 15

4. CRIAÇÃO DE UM DATABASE ................................................................................................ 21

4.1. Criando um Banco de Dados com a utilização do SQL SERVER Management Studio .............. 21 4.2. Criação de um Banco de Dados através de Scripts .................................................................. 23 4.3. CARACTERÍSTICA DE UM DATABASE ................................................................................ 24

5. CRIAÇÃO DE TABELAS .......................................................................................................... 24

5.1. Datatypes do SQL Server........................................................................................................ 25 Nulabilidade ................................................................................................................................. 27 Constraints: Integridade ............................................................................................................... 27 Primary Key(Chave Primária): ..................................................................................................... 27 Foreign Key(Chave Estrangeira): ................................................................................................. 28 AutoNumeração ............................................................................................................................ 29 5.2. Criação de Tabelas no Banco de Dados criado anteriormente com a utilização de scripts ....... 30 5.3. Alterando a estrutura de uma tabela ....................................................................................... 32 5.4. Criando um Diagrama ........................................................................................................... 33

6. INSERT (INSERE REGISTRO) ................................................................................................ 35

7. UPDATE (ALTERA VALOR DO REGISTRO)............................................................................ 36

8. DELETE (EXCLUSÃO DE REGISTROS) ................................................................................... 38

9. APRESENTANDO O SISTEMA INFONEW ................................................................................ 39

9.1 OS OBJETIVOS GERAIS DO INFONEW SÃO: ...................................................................... 39

PARTE 1 – MANTER DADOS A RESPEITO DOS CLIENTES DA EMPRESA .................................................. 39 PARTE 2 – ANÁLISE DO CREDITO DO CLIENTE .................................................................................... 40 PARTE 3 – MANTER DADOS A RESPEITO DOS PRODUTOS A SEREM VENDIDOS ...................................... 40 PARTE 4 – MANTER E GERENCIAR OS PEDIDOS DE COMPRA FEITOS PELOS CLIENTES ........................... 41 PARTE 5 – MANTER DADOS A RESPEITO DOS FUNCIONÁRIOS .............................................................. 41

9.2 DIAGRAMA COM RELACIONAMENTOS DO SISTEMA INFONEW .................................... 42

10. SELECT (CONSULTA) ............................................................................................................... 43

10.1 ORDER BY (ORDEM DE RETORNO) ............................................................................................ 44 10.2 ALIAS (APELIDO) ..................................................................................................................... 45 10.3 WHERE (RESTRIÇÕES) .............................................................................................................. 46 10.4 BETWEEN (CONDIÇÃO COM UMA FAIXA DE VALORES) .............................................................. 47 10.5 LIKE (COMPARAÇÃO COM UMA PARTE DE UMA LITERAL)............................................................ 48

Page 3: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 3 de 101

10.6 DISTINCT (VALORES ÚNICOS) ............................................................................................. 49

11. FUNÇÕES DE AGRUPAMENTO ............................................................................................... 50

11.1 COUNT (CONTADOR DE REGISTROS) ......................................................................................... 50 11.1.1 GROUP BY (Agrupamento de dados) .................................................................................. 51

11.2 SUM (SOMATÓRIA DE VALORES) ................................................................................................ 52 11.3 AVG (MÉDIA DE VALORES) ....................................................................................................... 53 11.4 MIN, MAX (MENOR E MAIOR VALOR) ........................................................................................ 54

12. HAVING (CONDIÇÃO DO AGRUPAMENTO)......................................................................... 55

13. IN (CONDIÇÃO COM VALORES FIXOS) ................................................................................ 56

14. SUBQUERIES (PESQUISA DENTRO DE UM COMANDO) .................................................... 57

15. JOIN (RELACIONAMENTO DE TABELAS) ............................................................................ 59

15.1 INTRODUÇÃO A JOINS: ............................................................................................................... 59 15.2 TIPOS DE JOINS ...................................................................................................................... 59

15.2.1 Usando Inner Joins: ........................................................................................................... 59 15.2.2 Usando Outer Joins: .......................................................................................................... 60 15.2.3. Usando Cross Joins: .......................................................................................................... 62

15.4 COMBINAÇÃO DE MAIS DE 2 TABELAS ........................................................................................ 64

16. CRIANDO VISÕES (VIEW) ........................................................................................................ 65

17. CRIANDO FUNCTION (UDF :FUNCÕES DEFINIDAS PELO O USUÁRIO )........................ 67

18.1 DEFININDO UMA FUNCTION UDF: ............................................................................................... 68 18.2 TIPOS DE FUNCTION: ................................................................................................................. 70

18.2.1. Funções Scalar valued: ..................................................................................................... 70 18.2.2. Funções Table Valued: ...................................................................................................... 72 18.2.3. Funções Multi-Statement Table Valued: ............................................................................. 75

18. CRIANDO STORED PROCEDURE (PROCEDIMENTOS) ...................................................... 77

19. CRIANDO TRIGGERS (GATILHOS ) ....................................................................................... 91

CONSIDERAÇÕES FINAIS .......................................................................................................... 100 REFERÊNCIAS BIBLIOGRÁFICAS: ............................................................................................ 101

Page 4: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 4 de 101

1. INTRODUÇÃO

Veremos nesta apostila de forma simplificada os comandos de

manipulação e consultas de dados, bem como suas clausulas, operadores e

funções. Para isso estaremos utilizando o gerenciador de banco de dados

Microsoft SQL Server 2008.

O comando Transact-SQL é uma linguagem estruturada para consultas,

utilizada no banco de dados da Microsoft, o SQL Server 2008.

Veja em seguida uma lista dos comandos Transact – SQL.

DCL – Data Control Language – Linguagem de Controle de Dados.

GRANT Concede permissões.

DENY Nega permissões.

REVOKE Revoga a concessão ou a negação de permissão.

DDL- Data Definition Language- Linguagem de Definição de dados.

CREATE Cria objeto no sistema.

ALTER Altera a estrutura dos objetos.

DROP Elimina objetos do sistema.

DML- Data Manipulation Language – Linguagem de Manipulação de Dados.

SELECT Lê dados de tabelas e views.

INSERT Insere dados em tabelas.

UPDATE Altera dados da tabela.

DELETE Exclui dados das tabelas.

BACKUP Realiza backup de dados.

RESTORE Restaura dados de um backup

BULK INSERT Realiza a inclusão de grande quantidade de dados em uma tabela.

Page 5: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 5 de 101

2. Conhecendo o Microsoft SQL Server 2008

O Microsoft SQL Server 2008 é um gerenciador de Banco de Dados que

pode ser implementado em sistemas de duas ou mais camadas. Para a

implementação de sistemas ele contém a linguagem Transact-SQL que segue

o padrão SQL-92. Ele possui as estruturas adequadas para que você crie e

gerencie sistemas de Banco de Dados OLTP (On-Line Transaction Processing)

Processamento Baseado em Transações e Banco de Dados OLAP (On-Line

Analytical Processing) Processamento Baseado em Análise dos Dados,

sistema de Tomada de Decisão (DW).

Além de o software oferecer mecanismos suficientes para que você

possa implementar sistemas íntegros e consistentes com relação aos seus

dados, ele oferece algumas ferramentas gráficas e alguns assistentes que

facilitam o gerenciamento do sistema. Com estas ferramentas você poderá:

Criar e configurar Databases e seus objetos;

Transformar dados que estão em um determinado formato em outro e

transferir dados que estão em um determinado sistema para o SQL

Server 2008 e vice-versa;

Implementar replicação dos dados entre dois ou mais servidores;

Realizar Transações distribuídas em dois ou mais servidores;

Criar tarefas que devem ser executadas automaticamente com base em

horários ou na ocorrência de erros;

Implementar a segurança de acesso aos dados, limitando as atividades

dos usuários dentro do database;

Realizar cópias de segurança dos seus dados para que, se algum

problema acontecer no sistema, essas cópias possam ser restauradas,

evitando assim perda de informações;

Transformar dados n o formato XML;

Gerenciar os processos realizados pelo próprio SQL Server 2008;

Controlar locks;

Analisar o processamento de pesquisas para ajustar a performance

delas;

Realizar o “debug” de suas stored procedures;

Page 6: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 6 de 101

Trabalhar com várias instances do SQL SERVER 2008 no mesmo

servidor;

Criar Databases com collations diferentes uns dos outros;

Criar as colunas das tabelas, do tipo caractere, com collations

diferentes;

Trabalhar com datatypes Unicode, etc.

3. PREPARANDO PARA INSTALAR O SQL SERVER

2008

O SQL SERVER 2008 está disponível em várias edições, cada qual

adequada a uma tarefa ou um ambiente específico. É importante entender

as diferenças entre as edições disponíveis, de modo que você possa

selecionar a mais apropriada para suas necessidades:

Datacenter ( *x86, *x64 e *IA64): Compilado no SQL Server 2008 R2

Enterprise, o SQL Server 2008 R2 Datacenter oferece uma plataforma de

dados de alto desempenho que possui os mais altos níveis de

escalabilidade para grandes cargas de trabalho de aplicativo, virtualização,

consolidação e gerenciamento da infraestrutura de banco de dados de uma

organização, ajudando a dimensionar o ambiente de missão crítica de forma

econômica.

Enterprise ( *x86, *x64 e *IA64): O SQL Server 2008 R2 Enterprise oferece

uma plataforma de dados abrangente que fornece segurança interna,

disponibilidade e escalabilidade, combinado com ofertas de business

intelligence, ajudando a habilitar os mais altos níveis de serviço para cargas

de trabalho de missão crítica.

Page 7: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 7 de 101

Standard (*x86 e *x64): O SQL Server 2008 R2 Standard oferece um

gerenciamento de dados completo e plataforma de business intelligence

para departamentos e organizações pequenas executarem seus aplicativos,

ajudando a habilitar o gerenciamento de banco de dados efetivo com

recursos de TI mínimos.

SQL Server Developer (*x86, *x64 e *IA64): O SQL Server Developer

permite aos desenvolvedores criarem qualquer tipo de aplicativo com base

no SQL Server. Ele inclui todas as funcionalidades do SQL Server

Datacenter, mas é licenciado para ser usado como um sistema de teste e

desenvolvimento, e não como um servidor de produção. O SQL Server

Developer é a opção ideal para quem deseja desenvolver e testar

aplicativos. Você pode atualizar o SQL Server Developer para uso em

produção.

SQL Server Workgroup (*x86 e *x64): O SQL Server Workgroup é ideal

para executar bancos de dados de local de ramificação fornecendo um

gerenciamento de dados confiável e uma plataforma de relatórios que inclui

sincronização remota segura e recursos de gerenciamento.

SQL Server Web (*x86, *x64): O SQL Server Web é uma opção de

propriedade de baixo custo total para hosts e sites que fornece recursos de

escalabilidade e gerenciabilidade para propriedades da Web de pequeno a

grande porte.

SQL Server Express (*x86 e *x64): A plataforma de banco de dados do

SQL Server Express tem sua base no SQL Server. Ele também substitui

o Microsoft Desktop Engine (MSDE). Por ser integrado ao Visual Studio, o

SQL Server Express facilita o desenvolvimento de aplicativos controlados

por dados que sejam ricos em recursos, seguros para armazenamento e

rápidos na implantação.

* Nota: x86: Windows 32 bits , x64: Windows 64 Bits e IA64: Windows 64 bits

Itanium

Page 8: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 8 de 101

SQL Server Express com Advanced Services (*x86 e *x64): O SQL

Server Express é gratuito e pode ser redistribuído por ISVs (sujeito a contrato).

O SQL Server Express é ideal para aprendizagem e criação de aplicativos para

desktop e servidores pequenos. Esta edição é a melhor escolha para

fornecedores de software independente, desenvolvedores não profissionais e

interessados que criam aplicativos cliente. Se precisar de recursos mais

avançados de banco de dados, o SQL Server Express pode ser perfeitamente

atualizado para versões mais sofisticadas do SQL Server

Compact 3.1 (*x86) e Compact 3.5 SP1 (*x86): SQL Server Compact 3.5

é um banco de dados incorporado gratuito, ideal para construir aplicativos

autônomos e ocasionalmente conectados para dispositivos móveis, desktops e

clientes Web em todas as plataformas Windows.

3.1. Usando o SQL Server com aplicativos cliente/servidor

Você pode instalar apenas os componentes clientes do SQL Server em

um computador que executa aplicativos cliente/servidor que se conectam

diretamente a uma instância do SQL Server. A instalação dos componentes

cliente é também uma boa opção se você administra uma instância do SQL

Server em um servidor de banco de dados ou se planeja desenvolver

aplicativos no SQL Server.

A opção de componentes clientes instala os seguintes recursos do SQL

Server: ferramentas de prompt de comando, ferramentas do Reporting

Services, componentes de conectividade, modelos de programação,

ferramentas de gerenciamento, ferramentas de desenvolvimento e os Manuais

On-line do SQL Server.

Page 9: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 9 de 101

3.2. Decidindo entre componentes do SQL Server

Utilize a página Seleção de Recursos do Assistente para Instalação do

SQL Server para selecionar os componentes que deseja incluir em uma

instalação do SQL Server. Por padrão, nenhum dos recursos na árvore está

selecionado.

Use as informações nas tabelas a seguir para determinar o conjunto de

recursos mais adequado às suas necessidades.

3.3. Ferramentas do SQL SERVER 2008 (Categorias)

Mecanismo de Banco de Dados: O Mecanismo de Banco de Dados é o serviço

principal para armazenamento, processamento e segurança de dados. O Mecanismo

de Banco de Dados fornece acesso controlado e processamento rápido de transações

para atender aos requisitos dos aplicativos de consumo de dados mais exigentes

dentro de sua empresa. O Mecanismo de Banco de Dados também fornece suporte

rico para sustentar alta disponibilidade.

Analysis Services-Dados Multidimensionais: O Analysis Services suporta

OLAP, permitindo ao usuário projetar, criar e gerenciar estruturas multidimensionais

que contenham dados agregados de outras fontes de dados, como bancos de dados

relacionais.

Analysis Services - Mineração de Dados: O Analysis Services permite a você

projetar, criar, e visualizar modelos de mineração de dados. Estes modelos de

mineração podem ser construídos a partir de outras fontes de dados utilizando uma

diversidade de algoritmos de mineração de dados padrão da indústria.

Integration Services : O Integration Services é uma plataforma para construir

soluções para integração de dados de alto desempenho, inclui também pacotes que

fornecem processamento de extração, transformação, e carregamento (ETL) para

armazenamento de dados.

Page 10: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 10 de 101

Replicação: A replicação é um conjunto de tecnologias para copiar e distribuir

dados e objetos de um banco de dados para outro e, em seguida, sincronizar os

bancos de dados para manter a consistência. Ao usar a replicação, é possível

distribuir dados para diferentes locais e para usuários remotos e móveis através de

redes locais e de longa distância, conexões dial-up, conexões sem fio e a Internet.

Reporting Services: O Reporting Services fornece às corporações a

funcionalidade de relatórios online possibilitando criar relatórios que se conectam a

conteúdos de várias fontes de dados, permite também, publicar os relatórios em

diversos formatos e além disso centralizar o gerenciamento de segurança e de

assinaturas.

SQL Server Service Broker: O Service Broker auxilia os desenvolvedores a

construir aplicativos de banco de dados evolutivos e seguros. Esta nova tecnologia do

Mecanismo de Banco de Dados fornece uma plataforma de comunicação baseada em

mensagens que permite a componentes de aplicativos independentes funcionarem

como um todo. O Service Broker inclui infra-estrutura para programação assíncrona

que pode ser usada em apenas um banco de dados ou apenas uma instância, e

também para aplicativos distribuídos.

Ferramentas de

gerenciamento

Descrição

SQL Server

Management Studio

O SQL Server Management Studio é um ambiente integrado

para acessar, configurar, gerenciar, administrar e desenvolver

componentes do SQL Server. O Management Studio permite

que desenvolvedores e administradores com todos os níveis

de conhecimento usem o SQL Server. Internet Explorer 6

SP1 ou uma versão posterior é requerido para a instalação do

Management Studio.

Page 11: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 11 de 101

SQL Server

Configuration Manager

O SQL Server Configuration Manager fornece gerenciamento

básico de configuração para serviços, protocolos do servidor,

protocolos do cliente e aliases do cliente do SQL Server

SQL Server Profiler O SQL Server Profiler fornece uma interface gráfica do

usuário para monitorar uma instância do Mecanismo de

Banco de Dados ou do Analysis Services.

Orientador de

Otimização do

Mecanismo de Banco

de Dados

O Orientador de Otimização do Mecanismo de Banco de

Dados ajuda a criar conjuntos de índices, exibições

indexadas e partições ideais.

Business Intelligence

Development Studio

O Business Intelligence Development Studio é um IDE para

soluções do Analysis Services, Reporting Services e do

Integration Services. Internet Explorer 6 SP1 ou uma versão

posterior é requerido para a instalação do BI Development

Studio.

Componentes de

conectividade

Instala componentes para comunicação entre clientes e

servidores, e bibliotecas de rede para DB-Library, ODBC e

OLE DB.

Page 12: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 12 de 101

3.4. REQUISITOS DE HARDWARE DO SQL SERVER 2008

Ao planejar uma instalação do SQL SERVER 2008, você deve

garantir que o computador em que pretende instalar esse programa atenda aos

requisitos míninos de hardware e seja adequado às suas necessidades atuais

e futuras. Se as especificações mínimas não forem atendidas, poderá haver

falha na instalação de alguns ou de todos os componentes.

3.4.1. REQUISITOS DE PROCESSADOR

O processador no computador em que você pretende instalar o SQL

SERVER deve ser compatível com Intel Pentium III ou superior e possuir

velocidade de 1 GHz ou superior.

A Microsoft recomenda usar um processador de 2 GHz ou superior.

3.4.2. REQUISITOS DE MEMÓRIA

O SQL-Server 2008 necessita de no mínimo de 512 Mb de memória,

além da necessária para o sistema para o sistema operacional.

A Microsoft recomenda pelo menos 1 Gigabyte (GB).

O SQL SERVER 2008 Express Edition requer no mínimo de 192 MB de

memória. A Microsoft recomenda pelo menos 512 MB.

3.4.3. REQUISITOS DE DISCO RÍGIDO

Os componentes de banco de dados do SQL SERVER 2008 requerem

entre 150 e 746 MB de espaço em disco, dependendo das opções especificas

escolhidas. Uma instalações típicas requer 637 MB de espaço em disco.

Se você optar por instalar o SQL SERVER 2008 Analysis Services, será

necessário espaço em disco adicional de 35 MB.

Se você optar por instalar o SQL SERVER 2008 Reporting Services,

será necessário um espaço em disco adicional de 40 MB.

Page 13: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 13 de 101

Recurso Requisito de espaço em

disco

Mecanismo de Banco de Dados e arquivos de dados,

Replicação e Pesquisa de Texto Completo

711 MB

Analysis Services e arquivos de dados 345 MB

Reporting Services e Gerenciador de Relatórios 304 MB

Integration Services 591 MB

Componentes do cliente (exceto os Manuais Online e as

ferramentas do Integration Services)

1.823 MB

Manuais Online do SQL Server 157 MB

3.5. SQL SERVER MANAGEMENT STUDIO

Para entrar no SQL SERVER Management Studio :

Ir na Barra de Tarefas

Clicar no Botão Iniciar

Todos os Programas

Microsoft SQL Server 2008

SQL Server Management Studio

Figura 1: Tela de abertura do SQL SERVER Management Studio

Page 14: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 14 de 101

Depois de aberto aparecerá a tela a seguir:

Figura 2: Tela do SQL SERVER Management Studio

Com o SQL SERVER Management Studio, você executa a maioria das

tarefas de administração de banco de dados do SQL SERVER 2008. Você

deve conhecer bem essa ferramenta para gerenciar adequadamente os

sistemas do SQL SERVER 2008

O SQL SERVER Management Studio fornece os seguintes recursos

para administradores:

Uma ferramenta integrada de gerenciamento e desenvolvimento

baseada no ambiente de desenvolvimento do Microsoft Visual

Studio.

Gerenciamento total de banco de dados relacionais, bancos de

dados do Analysis Services, Reporting Services, SQL Server

Integration Services (SSIS) e banco de dados do SQL Móbile.

Page 15: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 15 de 101

Object Explorer( Explorador de objetos), que é um painel gráfico

do SQL SERVER Management Studio que você pode usar para a

configuração de servidores, bem como para o gerenciamento e o

desenvolvimento de banco de dados.

Editores de consultas para gerenciamento e desenvolvimento

baseado em script. Os editores são fornecidos para consultas

Transact-SQL, MDX, DMX e XMLA.

Gerenciamento de scripts baseados em projeto, no qual scripts de

criação e gerenciamento de banco de dados podem ser

armazenados como um único projeto e gerenciados por meio de

um painel do Solution Explorer (Explorador de Soluções) no SQL

Server Management Studio.

O SQL SERVER Management Studio usa o Microsoft Visual

Studio Framework e inclui a funcionalidade do Visual Studio ao

criar consultas ou scripts, suporte a controle de origem para o

armazenamento e a manutenção de cópias de scripts, conforme o

seu desenvolvimento.

3.6. OS DATABASES DO SQL-SERVER

Uma vez instalado o SQL Server são criadas automaticamente quatro

databases:

a) master

b) model

c) tempdb

d) msdb

Page 16: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 16 de 101

Depois, o poderemos criar e instalar nossos próprios bancos de dados

livremente, os quais serão os bancos de dados de usuário. 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. O catálogo de

sistema, por exemplo, consiste unicamente de tabelas armazenadas no banco

de dados master.

A figura a seguir ilustra os bancos de dados no SQL Server.

Vejamos a função de cada um dos bancos de sistema.

MASTER

Controla os bancos de dados de usuários e a operação do SQL Server,

por isso os dados armazenados em suas tabelas são críticos e deve-se sempre

manter backup atualizado. Ocupa inicialmente cerca de 17 Mbytes, mantendo:

a) contas de login;

b) processos em andamento;

c) mensagens de erro do sistema;

d) databases armazenados no servidor;

e) espaço alocado a cada database;

f) locks ativos;

g) databases disponíveis e dispositivos de dump;

h) procedimentos de sistema, que são primariamente utilizados para

administração.

System tables

master

System tables

model

System tables

tempdb

System tables

msdb

System tables

SAU02

System tables

SAU05

Bancos de

dados de

usuário

Bancos de

dados do

sistema

Page 17: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 17 de 101

O banco de dados master contém 13 tabelas de uso compartilhado

com o sistema, conhecidas como Catálogo do Sistema ou Dicionário de Dados,

que são:

1. syscharsets - códigos de página que estabelecem quais caracteres

estão disponíveis e sua ordem de classificação;

2. sysconfigures - variáveis de ambiente configuráveis;

3. syscurconfigs - variáveis de ambiente configuráveis;

4. sysdatabases - bancos existentes no servidor;

5. sysdevices - referência física aos dispositivos e bancos do servidor;

6. syslanguages - entrada para as línguas conhecidas pelo servidor;

7. syslocks - quais são os locks ativos;

8. syslogins - contas de usuários;

9. sysmessages - mensagens de erro do sistema;

10.sysprocesses - processos em andamento

11.sysremotelogins - contas de acesso remoto, para conexão entre dois

servidores;

12.sysservers - servidores remotos;

13.sysusages - espaço em disco disponibilizado para cada banco de dados

(relaciona-se com sysdatabases e sysdevices).

MODEL

Fornece um protótipo (template) para um novo banco de dados.

Contém as tabelas de sistema que serão inseridas em cada banco de dados de

usuário. As seguintes implementações podem ser realizadas neste database:

a) tipos definidos pelo usuário (user datatypes), regras (rules), padrões

(defaults), stored procedures;

b) usuários que terão acesso a todos os bancos adicionados ao sistema

(administradores);

c) privilégios padrão, notadamente aos usuários guest (guest accounts);

Page 18: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 18 de 101

O tamanho padrão deste banco é de 1 Mbyte, e sua estrutura básica

pode ser vista na figura a seguir; as 18 tabelas mostradas serão sempre

criadas em novos bancos de dados.

Este conjunto de 18 tabelas é conhecido como Catálogo do Banco de

Dados, e suas funções são as seguintes (note que todas possuem o prefixo

sys):

1. sysalternates - possui uma linha para cada usuário mapeado para um

banco de dados de usuário;

2. syscolumns - possui uma linha para cada coluna em uma tabela ou

view, e para cada parâmetro em uma stored procedure;

3. syscomments - possui uma ou mais linhas para cada view, regra (rule),

padrão (default), trigger e stored procedure que contenha uma

declaração de definição;

4. sysdepends - uma linha para cada procedure, view, ou tabela que seja

referenciada por uma procedure, view ou trigger;

5. sysindexes - uma linha para cada clustered index, nonclustered index, e

tabela sem índices, mais uma linha extra para cada tabela com

informações de textos ou imagens;

6. syskeys - uma linha para cada chave estrangeira (foreign), primária

(primary) ou comum (common);

7. syslogs - armazena o transaction log;

8. sysobjects - uma linha para cada tabela (table), visão (view), stored

procedure, regra (rule), trigger, padrão (default), log e objeto temporário

(somente tempdb);

sysalternates syskeys sysindexes sysdepends syscomments syscolumns

syslogs systypes syssegments sysprotects sysprocedures sysobjects

sysusers syssubscriptions syspublications sysarticles sysconstraints sysreferences

Page 19: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 19 de 101

9. sysprocedures - uma linha para cada visão (view), stored procedure,

regra (rule), trigger, padrão (default);

10.sysprotects - mantém as informações de permissões de usuário;

11.syssegments - uma coluna para cada segmento;

12.systypes - uma linha para cada datatype definido pelo usuário ou

fornecido pelo sistema;

13.sysusers - uma linha para cada usuário permitido no database;

14.sysreferences - uma linha para cada constraint de integridade

referencial criada (PK-FK, Chave primária, chave estrangeira);

15.sysconstraints - informações sobre cada constraint criada;

As últimas três tabelas são usadas para manter informações sobre

replicação de dados.

16.sysarticles - contém a article information para cada artigo criado para

replicação;

17.syspublications - contém uma linha para cada publicação criada;

18.syssubscriptions - contém uma linha para cada subscrição de um

subscription server.

TEMPDB

Providencia um espaço de armazenamento para tabelas e outras

ações temporárias ou intermediárias, tais como resultados que envolvam a

cláusula GROUP BY, ORDER BY, DISTINCT e cursores (CURSORS). Possui

as seguintes características:

a) criado automaticamente no DEVICE MASTER (atenção, DEVICE e

DATABASE são coisas diferentes);

b) seu conteúdo é apagado quando o usuário fecha a conexão, exceto

para tabelas temporárias globais;

c) quando o banco é parado (stoped) seu conteúdo é apagado

completamente;

d) seu tamanho padrão é de 2 Mbytes.

e) pode ser colocado em memória RAM.

Page 20: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 20 de 101

MSDB

Providencia suporte ao serviço SQL Executive Service (o qual fornece

serviços de schedulle de tarefas, replicação, gerenciamento de alertas). Possui

as seguintes tabelas de sistema:

a) sysalerts - armazena informações sobre todos os alertas definidos por

usuários;

b) sysoperators - informações sobre os operadores;

c) sysnotifications - relaciona quais operadores devem receber quais

alertas;

d) systasks - mantém informações sobre todas as tarefas definidas por

usuários;

e) syshistory - informações a respeito de quando um alerta e uma tarefa

foram executados, se com sucesso ou falha, identificação do operador,

data e hora da execução;

f) sysservermessages - mensagens sobre as operações

relacionadas ao servidor.

Page 21: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 21 de 101

4. CRIAÇÃO DE UM DATABASE

Um database é uma estrutura lógica dentro da qual são criados os

sistemas de banco de dados. Ele é formado por dois tipos de arquivos. Um

dos tipos armazena dados deste sistema e o outro armazena transações deste

sistema (inclusões,alterações e exclusões realizadas em seus dados).

Os arquivos de dados ficam organizados em grupos de arquivos e o

primeiro grupo criado automaticamente no momento da criação do database

chama-se PRIMARY.

4.1. Criando um Banco de Dados com a utilização do SQL

SERVER Management Studio

Figura 5: Tela do SQL Server Management Studio para Criação de um Banco

Page 22: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 22 de 101

Figura 6: Tela do SQL Server Management Studio para Criação de um Banco

Abaixo estão as informações das clausulas do comando de criação de

um Database:

Nome: É o nome lógico do arquivo.

DataFile: E o arquivo físico do Banco de Dados.

Transaction Log: E o arquivo lógico do Banco de Dados.

Filename: É o nome físico do arquivo. Deve ser especificado o seu

diretório de criação.

Initial size: É o tamanho inicial do arquivo.

Filegrowth: É o valor por meio do qual o arquivo aumenta de tamanho

automaticamente.

Maximum File Size: É o tamanho máximo de o Arquivo Físico e/ ou

Lógico pode asumir

Page 23: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 23 de 101

4.2. Criação de um Banco de Dados através de Scripts

Exemplo:

Criação de um Banco de Dados Chamado Bookselva

Obs: Antes da criação do Banco de Dados é necessária a criação de uma

pasta na unidade C:\ em nosso exemplo a pasta chama-se BANCO

Create database Bookselva

On primary

(

name='BookSelvaBD',

filename='c:\banco\bookselva.mdf',

size= 50 MB,

maxsize= 500 MB,

filegrowth= 5 MB

)

log on

(

name='bookselvalog',

filename='c:\banco\bookselva.ldf',

size= 20 MB,

maxsize= 200 MB,

filegrowth= 2 MB

)

Para verificar se o banco foi criado corretamente

Sp_helpdb bookselva

Page 24: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 24 de 101

4.3. CARACTERÍSTICA DE UM DATABASE

A Microsoft sugere como tamanho do arquivo lógico do Banco de Dados

entre 35% a 40 % do tamanho do arquivo de dados, mas este valor é apenas

sugestivo pois para definição do tamanho do arquivo lógico depende de outros

fatores principalmente o número de transações que este Banco irá receber.

Este valores valem somente se este Banco for Transacional.

Abaixo estão as informações clausulas do comando de criação de um

Database:

Nome: É o nome lógico do arquivo.

Filename: É o nome físico do arquivo. Deve ser especificado o seu

diretório de criação.

Size: É o tamanho limite que o arquivo pode alcançar.

Filegrowth: É o valor por meio do qual o arquivo aumenta de tamanho

automaticamente.

5. Criação de Tabelas

São objetos que vão conter os dados de um sistema. Uma tabela é um

objeto bidimensional formado por linhas e colunas. As colunas, ou campos, são

atributos do assunto por ela armazenada e as linhas ou registros formam um

conjunto completo de todos os atributos.

Cada coluna da sua tabela deve ter um “datatype” tipo de dados , que é

o formato no qual os dados serão armazenados no disco. Cada tipo de dados

ocupa um espaço limitado dentro do disco e pode armazenar uma deyerminada

faixa de valor. O SQL Server 2008 possuem vários tipos de datatypes que

podem ser utilizados em colunas das tabelas ou em variáveis de memória.

Possui também regras para garantir a integridade e a consistência dos

dados de uma aplicação, é necessário utilizar:

Datatypes

Nulabilidade

Autonumeração

Constraints

o PK (Primary Key)

o FK (Foreign Key)

Page 25: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 25 de 101

5.1. Datatypes do SQL Server

Datatypes são os tipos de dados que o SQL Server aceita. Eles existem

para que possamos definir o tipo de conteúdo de um campo de tabela ou de

uma variável, dentre outras coisas. Lembro a você que não estou colocando

todos os tipos, somente aqueles que usamos “de verdade”, no dia-a-dia.

Existem tipos que armazenam números inteiros ou decimais, datas,

texto, valores binários, além de tipos especiais.

Confira abaixo alguns tipos de datatypes:

Char(n): quando o campo for do tipo alfanumérico e com tamanho fixo,

o n quer dizer limitação, o valor máximo de caracteres;

Varchar(n) : quando o campo for do tipo alfanumérico e com tamanho

não é fixo, o n quer dizer limitação, o valor máximo de caracteres;

Int: quando o campo for numero com valor inteiro.

Decimal (p,s): quando o campo for números com valores decimais, o

valor de p é o numero de algarismos e o s é valor dos algarismos

decimais (algarismos após a virgula).

Money, smallmoney :quando o campo for valores monetários.

Money (8 bytes) é quando a quantidade de dinheiro é muito (ex.: loteria), e

smallmoney (4 bytes) é quando a quantidade de dinheiro é pequena.

Datetime e SmallDatetime:quando o campo for do tipo data ou hora.

Datetime (8 bytes) é utilizado no intervalo de 01/01/1753 a 31/12/9999

Smalltime (4 bytes) é utilizado no intervalo de 01/01/1900 a 06/06/2079

Bit :determina se o valor é verdadeiro, falso ou nulo.

Page 26: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 26 de 101

TIPOS NUMÉRICOS

NOME TAMANHO (BYTES)

MENOR VALOR

MAIOR VALOR

ARMAZENA

BIGINT 8 -263 263 - 1 INTEIRO

INT 4 -231 231 - 1 INTEIRO

SMALLINT 2 -215 215 - 1 INTEIRO

TINYINT 1 0 255 INTEIRO

DECIMAL(C, D)

VARIÁVEL -1038 1038 - 1 DECIMAL EXATO, ONDE C INDICA

NÚMERO DE POSIÇÕES E D O NÚMERO DE CASAS DECIMAIS

NUMERIC(C, D)

VARIÁVEL -1038 1038 - 1 DECIMAL EXATO, ONDE C INDICA

NÚMERO DE POSIÇÕES E D O NÚMERO DE CASAS DECIMAIS

MONEY 8 -263 263 - 1 MONETÁRIO - EQUIVALE A UM

DECIMAL COM 8 CASAS DECIMAIS

SMALLMONEY 4 -231 231 - 1 MONETÁRIO - EQUIVALE A UM

DECIMAL COM 4 CASAS DECIMAIS

FLOAT(D) 4 OU 8 -1.79 X 10308

1.79 X 10308

PONTO FLUTUANTE, ONDE D INDICA O NÚMERO MÁXIMO DE CASAS

DECIMAIS, ENTRE 0 E 53

REAL 4 -3.4 X 1038

3.4 X 1038 PONTO FLUTUANTE - EQUIVALENTE AO

FLOAT(24)

TIPOS TEXTO

NOME TABELA LIMITE

(CARACTERES) TAMANHO

(CARACTERES) ARMAZENA

CHAR(N) ASCII 8000 EXATAMENTE N CARACTERES, ONDE N

INDICA O TAMANHO DO CAMPO

VARCHAR(N) ASCII 8000 ATÉ N CARACTERES, ONDE N

INDICA O TAMANHO DO CAMPO

NCHAR(N) UNICODE 4000 EXATAMENTE N CARACTERES, ONDE N

INDICA O TAMANHO DO CAMPO

NVARCHAR(N) UNICODE 4000 ATÉ N CARACTERES, ONDE N

INDICA O TAMANHO DO CAMPO

TEXT ASCII 231 - 1 ATÉ 231 - 1 CARACTERES

NTEXT UNICODE 231 - 1 ATÉ 231 - 1 CARACTERES

TIPOS DATA

NOME TAMANHO (BYTES)

MENOR VALOR

MAIOR VALOR

PRECISÃO ARMAZENA

DATETIME 8 1753-01-01

00:00:00.000 9999-12-31

23:59:59.997 3.33 ms DATA/HORA

SMALLDATETIME 4 1900-01-01 00:00:00

2079-06-06 23:59:00

1 MINUTO, SENDO QUE ATÉ 29.998ms

ARREDONDA PARA MENOS E ACIMA DISSO

PARA O PROXIMO MINUTO.

DATA/HORA

Page 27: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 27 de 101

Nulabilidade

Nulabilidade: Significa se o campo declarado pode ser ou não nulo.

Para fazer tal declaração é necessário definir o campo com a clausula:

o Not null (não permite valor nulo,preenchimento obrigatório do

campo)

o Null (permite valor nulo, preenchimento não obrigatório do

campo)

Constraints: Integridade

Primary Key(Chave Primária):

Fazendo parte das regras de modelagem de dados relacional, uma

chave primária é uma regra que deve sempre ser colocada em uma coluna ou

um conjunto de colunas de uma tabela, para que o sistema não aceite dados

repetitivos nesses campos, tornando-se possível a identificação da unicidade

de cada registro de uma tabela.

.

Exemplo:

Constraint PK_Cliente Primary Key (Cód_Cli)

Detalhes sobre o uso das Constraints Primary Key(PK)

Em uma tabela é possível ter apenas uma constraint primary key

A constraint primary key pode ser composta de mais de uma coluna,

inclusive de datatypes diferentes

As constraints primary key não aceitam valores repetidos, e para manter

a unicidade dos dados, O SQL SERVER 2008 cria, nessas colunas,

índices únicos.

As colunas que fazem parte da constraint primary key não podem

receber valores nulos.

Page 28: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 28 de 101

Foreign Key(Chave Estrangeira):

As colunas que estiverem relacionando duas tabelas serão chamadas de

chave estrangeira. Uma coluna só pode ser chave estrangeira se na tabela

com a qual está se relacionando essa coluna for chave primária. Ou seja,

suponha que na tabela Nota Fiscal relaciona-se com a tabela Cliente por meio

da coluna Cod_Cli . Na tabela Nota Fiscal a coluna Cod_Cli só poderá ser

chave estrangeira se na tabela Cliente a coluna Cod_Cli for chave primária.

Exemplo:

Constraint FK_NotaFiscal Foreign Key(Cód_Cli)

References Cliente(Cod_Cli)

On delete cascade

Detalhes sobre o uso das Constraints Foreign Key(FK)

Em uma tabela é possível ter várias uma constraint foreign key

A constraint foreign key pode ser composta de mais de uma coluna,

inclusive de datatypes diferentes

Se a chave primária da referida chave estrangeira for composta, a chave

estrangeira também deve ser composta das mesmas colunas, na

mesma sequência de criação.

As constraints foreign key aceitam valores repetidos.

O SQL SERVER 2008 não cria índice automaticamente nas colunas que

formam chave estrangeira

As colunas que fazem parte da constraint foreign key podem receber

valores nulos.

As constraints foreign key podem referenciar apenas tabelas do mesmo

Database

A instrução on delete cascade permite a exclusão do dado se o mesmo

estiver relacionado em outra tabela, excluirá o registro na tabela

realcionada.

Page 29: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 29 de 101

AutoNumeração

Identidade para um banco de dados é a forma de identificar cada linha

de uma tabela como única.

Para manter a integridade e a consistência dos dados, é necessário ter

uma forma de identificá-los como únicos dentro de uma tabela. E para tanto,

utilizam-se a chave primária. As chaves primárias normalmente são colocadas

em uma coluna que numera os registros dentro de uma tabela.

A coluna Cod_Cli da tabela Cliente deve receber valores únicos.

Para solucionar a questão sobre valores únicos nos registros o SQL

SERVER 2008 disponibiliza uma propriedade do campo como IDENTITY, onde

fará a autonumeração na coluna onde for especificada.

Para criar uma tabela com a propriedade identity, observe o exemplo

apresentado em seguida:

Use bookselva

Create table Email

(

Cod_email int identity not null,

Descricao_email varchar(40) not null,

provedor_email varchar(40) not null,

Cod_Cli int not null,

Constraint PK_email

Primary Key(Cod_email)

)

Para verificar se a tabela foi criado corretamente

Select * from email

Ou

Comando para verificar a estruturas das tabelas

Sp_help email

Page 30: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 30 de 101

5.2. Criação de Tabelas no Banco de Dados criado

anteriormente com a utilização de scripts

Use bookselva

Create table Cliente

(

Cod_Cli int identity not null,

Nome_Cli varchar(40) not null,

End_Cli varchar(30) not null,

Bai_Cli varchar(20) not null,

Cid_Cli varchar(20) not null,

Uf_Cli char(3) not null,

Tel_Cli varchar(15) null,

Constraint PK_Cliente

Primary Key(Cod_Cli)

)

Create Table NotaFiscal

(

Num_Nota int identity not null,

Cod_Cli int not null,

Serie_Nota varchar(10) not null,

Emissao_Nota smalldatetime null,

Vtot_Nota SmallMoney not null,

Constraint PK_NotaFiscal

Primary Key(Num_Nota),

Constraint FK_Cliente

Foreign Key(Cod_Cli)

References cliente(Cod_Cli)

On delete cascade

)

Page 31: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 31 de 101

Create Table Produto

(

Cod_Prod int identity not null,

Nome_Prod varchar(50) not null,

Qtd_Estoque int not null,

Val_Prod decimal(8,2) not null,

Constraint PK_Prod

Primary Key(Cod_Prod)

)

Create Table ItensNota

(

Num_Nota int not null,

Cod_Prod int not null,

Qtd_Vend int not null,

Val_Vend decimal(8,2) not null,

Constraint PK_ItensNota

Primary Key(Num_Nota,Cod_Prod),

Constraint FK_Itens1Nota

Foreign Key(Num_Nota)

References NotaFiscal(Num_Nota)

On delete cascade ,

Constraint FK_Itens2Nota

Foreign Key(Cod_Prod)

References Produto(Cod_Prod)

On delete cascade

)

Page 32: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 32 de 101

5.3. Alterando a estrutura de uma tabela

Existem outras alterações que pode-se realizar na estrutura das tabelas,

como por exemplo, acrescentar outras colunas a uma determinada tabela,

retirar colunas e alguns casos pode até alterar certas características das

colunas de uma tabela. Essas alterações feitas na estrutura de uma tabela

podem ser realizadas mesmo que a tabela esteja com dados.

Para adicionar um novo campo em uma tabela

Alter table Cliente

Add Sexo_cli char(1) not null

Para definir como chave estrangeira um campo já existente

Alter table Email

Add constraint FK_Email

Foreign Key(Cod_Cli)

References cliente(Cod_Cli)

Para alterar um datatype de campo em uma tabela

Alter table Cliente

Alter column Sexo_cli varchar(10) null

Para retirar um campo em uma tabela

Alter table Cliente

Drop column Sexo_cli

Page 33: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 33 de 101

5.4. Criando um Diagrama

O SQL SERVER Management Studio permite que você crie um

diagrama das tabelas para verificar os relacionamentos das tabelas isso se

houver relacionamentos. Devido a este fato diagramas só poderão ser criados,

após a criação de todas as tabelas com seus devidos relacionamentos.

Para criar um Diagrama com o SQL SERVER Management Studio faça

a seguintes operações:

Expanda seu database no exemplo o BookSelva

clique com o botão direito sobre a pasta ” Database Diagrams “e escolha

a opção “New Database Diagram” como mostra a figura abaixo:

Figura 7: Tela do SQL Server Management Studio criando um Diagrama

Page 34: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 34 de 101

Em seguida aparecerá a primeira tela do onde você deverá escolhar as tabelas

que irão compor seu diagrama.

Selecionar as tabelas Cliente, Itens, NotaFiscal e Produto.

Figura 8: Tela do SQL Server Management Studio criando um Diagrama

Depois clicar no botão ADD logo em seguida irá surgir a tela a seguir

com o relacionamento das tabelas.

Pronto o diagrama das tabelas.

Figura 9: Tela do SQL Server Management Studio criando um Diagrama

Page 35: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 35 de 101

6. INSERT (Insere registro)

Definição: O comando INSERT insere um novo registro em uma tabela

Sintaxe:

INSERT INTO <tabela> [<campos>] VALUES <valores>

Exemplos:

Adotando-se que a ordem dos campos da tabela cliente seja (Cod_Cli,

Nome_Cli, End_Cli, Bai_Cli, Cid_Cli, Uf_Cli, Tel_Cli) temos:

/*insere os valores (1,„Nilson Borges‟, Av.Paulista,929‟, ‟Cerqueira César‟, ‟São

Paulo‟, ‟SP‟, ‟3285-0202‟) na tabela CLIENTES */

INSERT INTO CLIENTE VALUES (’Nilson Borges’,

‘Av.Paulista,929’, ’Cerqueira César’, ’São Paulo’, ’SP’,

’3285-0202’)

ou

INSERT INTO CLIENTE ( Nome_Cli, End_Cli, Bai_Cli, Cid_Cli,

Uf_Cli,Tel_Cli)

VALUES(’Nilson Borges’, ‘Av.Paulista,929’, ’Cerqueira

César’, ’São Paulo’, ’SP’, ’3285-0202’)

OBS: O valor cod_cli não é necessário inserir pois foi

definido como identity que é autonumeração e seu

preenchimento é automático

/*insere os valores (1,„WEP2525‟,‟2004/08/12‟,250.89) na tabela

NOTAFISCAL*/

INSERT INTO NOTAFISCAL VALUES (1, ‘WEP2525’,

’2004/08/12’,250.89)

Ou

INSERT INTO NOTAFISCAL (Cod_Cli, Serie_Nota, Emissao_Nota,

Vtot_Nota)

VALUES (1, ‘WEP2525’, ’2004/08/12’,250.89)

Page 36: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 36 de 101

7. UPDATE (Altera valor do registro)

Definição: O comando UPDATE altera campos de um ou vários registros

de uma tabela.

Sintaxe: UPDATE <tabela> SET <campo> = <expressão> [WHERE

<condição>];

Exemplos:

/* atualiza o campo NOME_CLI para „Juliana Costa‟ do registro da

tabela CLIENTE para o Cód_Cli igual a 1 */

UPDATE CLIENTE SET Nome_Cli = 'Juliana Costa'

WHERE Cod_Cli = 1

/* atualiza o campo valor total para 125.75 do registros da tabela

NOTAFISCAL onde o campo Emissão_nota for maior que

10/08/2004 */

UPDATE NOTAFISCAL SET Vtot_Nota = 125.75

WHERE Emissao_nota > „2004/08/10‟

/* atualiza o campo valor total da tabela NOTAFISCAL com um

acréscimo de 12% em todos os campos onde a emissão for

menor do que 20/08/2004

UPDATE NOTAFISCAL SET Vtot_Nota = Vtot_Nota*1.12

WHERE Emissao_nota < „2004/08/20‟

Page 37: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 37 de 101

Operadores de Comparação

Operador Descrição

= Igual a

<> Diferente

> Maior que

>= Maior ou igual a

< Menor que

<= Menor ou igual a

Exercício

1) Atualize o campo Cid_Cli da tabela Cliente para „Santo André‟ para os registros dos

clientes do campo UF_Cli igual a SP.

2) Atualize o campo Cod_Cli da tabela NotaFiscal para 3 para os registros das Notas

Fiscais com valor total abaixo de 130.00.

3) Atualiza o campo VTot_Nota com um desconto de 23% para o registros das Notas

Fiscais com valor total diferente de 581.20

Page 38: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 38 de 101

8. DELETE (Exclusão de registros)

Definição: O comando DELETE exclui um ou mais registros de uma tabela

Sintaxe: DELETE [FROM] <tabela> [WHERE <condição>];

Exemplo:

/* exclui todos os registros da tabela NotaFiscal onde o campo

Cod_Cli é igual a 1 */

DELETE FROM NOTAFISCAL WHERE Cod_Cli = 1

/* exclui todos os registros da tabela CLIENTE onde o campo

Nome_Cli é igual a „João Pedro‟*/

DELETE FROM CLIENTE WHERE Nome_Cli = „João Pedro‟

Exercícios

1) Excluir todas as NotasFiscais onde a Data de Emissão é superior a 15/08/2004

2) Excluir todas as NotasFiscais onde o valor total seja menor ou igual a 4520.21

3) Excluir todos os clientes onde moram no Estado de Minas Gerais.

4) Excluir todos os clientes onde moram na Cidade de São Roque.

5) Excluir todas as NotasFiscais que menos a do Cliente de Código igual a 2.

Page 39: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 39 de 101

9. APRESENTANDO O SISTEMA INFONEW

O objetivo deste sistema fictício é criar um ambiente OLTP(On Line Transaction

Process) para que vocês coloquem em prática os tópicos que serão vistos nos

próximos capítulos desta apostila. O Sistema INFONEW deve gerenciar as

operações comerciais de uma suposta empresa.

9.1 Os objetivos gerais do INFONEW são:

Parte 1: Manter dados a respeito dos Clientes:

Parte 2: Realizar análise de crédito de cada Cliente

Parte 3: Manter dados a respeito dos produtos a serem vendidos

Parte 4: Manter e gerenciar os pedidos de compra feitos por esses clientes.

Parte 5: Manter dados a respeito dos Funcionários

Parte 1 – Manter Dados a Respeito dos Clientes da Empresa

Manter dados a respeito dos clientes envolve armazenar todas as

informações a respeito de cada cliente para que ele possa ser encontrado

facilmente num momento de necessidade.

Nessa empresa, um cliente pode possuir vários tipos de endereço, por

exemplo, endereço residencial, de faturamento, de entrega, de cobrança, etc...,

e o sistema tem que ser capaz de armazenar qualquer quantidade e qualquer

tipo de endereço para cada cliente individualmente. Cada endereço deve ser o

mais completo possível, contendo além do nome da rua, do bairro, número do

prédio, o nome da cidade e do estado dessa cidade.

É necessário saber também dados a respeito do cônjuge de cada cliente

(se ele tiver um cônjuge), pois no cálculo do crédito para cada clientes, a renda

do cônjuge pode ser considerada.

Page 40: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 40 de 101

É necessário também que o sistema consiga armazenar qualquer

quantidade de telefone que o cliente possa informar e qualquer quantidade de

e-mails.

Assim que um cliente é cadastrado no sistema, deve ser atribuído a ele

um tipo de cliente, ou seja, uma classificação de acordo com a sua renda

mensal.

Parte 2 – Análise do Credito do Cliente

Inicialmente, quando um cliente é cadastrado no sistema, é atribuído a

ele um tipo de cliente, ou seja, uma classificação de acordo com a sua renda.

O cálculo do limite de crédito deve ser uma aplicação que poder ser executada

periodicamente, para todos os clientes de uma só vez ou para um cliente

especifico. Esse cálculo deve levar em consideração o tipo do cliente, a renda

do cônjuge, a soma total de pedidos realizados no ano corrente e o atraso

médio nos pagamentos das parcelas.

Esse valor que limita o crédito do cliente deve ser levado em

consideração sempre antes de realizar uma venda para cada cliente.

Parte 3 – Manter Dados a Respeito dos Produtos a Serem Vendidos

Cada produto disponível para venda deve ser classificado por um tipo para

que seja possível realizar totalizações em estoque, produzindo dados

gerenciais. Por exemplo, o sistema deve ser capaz de fornecer informações

como:

Quantidade de cada produto vendido num determinado período.

Quantidade de um determinado tipo de produto vendida em um

determinado período.

Tipo de produto vendido em cada região de cada cidade.

Tipo de produto vendido em cada região de cada estado.

Controle de quantidade em estoque de cada produto.

Controle de quantidade em estoque de cada tipo de produto.

Tipos de produto que são mais vendidos.

Tipos de produto menos vendidos.

Page 41: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 41 de 101

Parte 4 – Manter e Gerenciar os Pedidos de Compra Feitos pelos

Clientes

Cada pedido de compra pode ser pago á vista ou ser parcelado.

O sistema deve ser capaz de fornecer informações a respeito de cada

pedido de um determinado usuário. Essas informações são:

Data e valor do primeiro pedido do cliente.

Parcelas em atraso de um pedido.

Valor original de cada parcela.

Valor de cada parcela com juros e multa.

O sistema deve ser capaz de informar os produtos que cada cliente já

comprou, e os produtos que cada um nunca comprou.

A cada venda realizada o sistema deve ser capaz de calcular o valor

total de cada pedido e dar baixa em estoque a cada produto vendido.

O sistema deve aceitar devolução de produtos comprados pelos clientes

se o referido pedido estiver em aberto. E essa devolução deve recolocar o

produto em estoque e retirar o valor do pedido a ser pago pelo cliente.

Parte 5 – Manter Dados a Respeito dos Funcionários

O sistema deve ser capaz de armazenar dados a respeito dos

funcionários e dos dependentes que cada funcionário possui.

Cada funcionário deve receber, alem de um salário fixo, bônus mensais

de acordo com os produtos que ele vender.

O desempenho de cada funcionário será medido por pontos que ele

recebe mensalmente. De acordo com essa pontuação, seu bônus pode ser

acrescido de determinados valores.

Todas as vezes que o salário fixo de cada funcionário for alterado, o

sistema deve armazenar no histórico o salário anterior, o atual e a data da

alteração.

Page 42: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 42 de 101

9.2 DIAGRAMA COM RELACIONAMENTOS DO SISTEMA

INFONEW

Page 43: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 43 de 101

10. SELECT (Consulta)

Descrição: Este comando faz a seleção dos dados de uma ou mais

tabelas.

Sintaxe: SELECT <campo> FROM <tabela>

Exemplos:

SELECT COD_CLI, NOME_CLI,SEXO_CLI FROM CLIENTE

SELECT COD_CLI, NUM_LANC, DATA_CREDCLI, CRED_CLI

FROM CREDITO

SELECT COD_PROD, NOME_PROD, VAL_UNITPROD FROM

PRODUTO

SELECT COD_FUNC, NOME_FUNC, SAL_FUNC FROM

FUNCIONARIO

Para listar todos os campos da tabela, utilizamos o operador "*"

(asterisco)

SELECT * FROM CLIENTE

SELECT * FROM CREDITO

SELECT * FROM PRODUTO

SELECT * FROM FUNCIONARIO

Page 44: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 44 de 101

10.1 ORDER BY (Ordem de retorno)

Definição: A cláusula ORDER BY determina a ordem de apresentação do

resultado de uma pesquisa de forma ascendente ou descendente.

Sintaxe:

SELECT <campo> FROM <tabela> [WHERE <condição>]

ORDER BY <campo_ordenacao> [ASC/DESC]

Exemplos:

/* seleciona todos os registros da tabela CLIENTES ordenando o

retorno pelo campo CODIGO em ordem ascendente */

SELECT * FROM CLIENTE ORDER BY COD_CLI ASC

/* seleciona todos os registros da tabela CLIENTES ordenando o

retorno primeiro pelo campo CODIGO em ordem descendente e

depois pelo campo NOME em ordem ascendente */

SELECT * FROM CLIENTES ORDER BY COD_CLI DESC,

NOME_CLI ASC

Page 45: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 45 de 101

10.2 ALIAS (Apelido)

Definição: Literal que identifica um campo, uma função ou uma tabela

Sintaxe:

SELECT (<campo> ou <função>) <alias do retorno>

FROM <tabela> <alias da tabela>

Exemplos:

/* seleciona o valor do campo NOME da tabela CLIENTES */

SELECT NOME_CLI AS "NOME DO CLIENTE"

FROM CLIENTE

Observe que a coluna Nome_Cli passou a chamar Nome do Cliente

/* listar o código do cliente, nome do cliente ,renda do CLIENTE e

renda do CLIENTE com acréscimo de 37% */

SELECT COD_CLI,NOME_CLI,RENDA_CLI,RENDA_CLI*1.37

FROM CLIENTE

Observe que está mostrando uma coluna com nome (No column name)

para não aparecer está coluna é necessário criar um alias para a coluna

conforme código abaixo.

SELECT COD_CLI,NOME_CLI,RENDA_CLI,RENDA_CLI*1.37

AS "RENDA COM AUMENTO"

FROM CLIENTE

Page 46: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 46 de 101

10.3 WHERE (Restrições)

Descrição: Com esta cláusula é possível fazermos restrição dos registros

a serem manipulados, como veremos posteriormente ela também poderá

ser usados para outros comandos do SQL.

Sintaxe: SELECT <campo> FROM <tabela> WHERE <condição>

Exemplo:

/*serão listados todos os registro da tabela CLIENTES onde o

campo Cod_Cli for igual a 1 */

SELECT * FROM CLIENTE WHERE COD_CLI = 1

/*serão listados todos os registros da tabela PEDIDO onde o

campo Data_Ped for superior a 01/02/2001 E cod_sta= 1*/

SELECT * FROM PEDIDO WHERE DATA_PED > „2001/02/01‟

AND COD_STA=1

/*serão listados todos os registros da tabela CLIENTE onde o

campo Nome_Cli for igual à Daniel Souza OU Clientes do sexo

Feminino */

SELECT * FROM CLIENTE WHERE NOME_CLI = 'DANIEL

SOUZA' OR SEXO_CLI=‟F‟

Obs: Não esqueça que na clausula where utiliza-se os operadores de

comparação: maior, menor, igual, diferente, maior ou igual e menor ou

igual.

Page 47: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 47 de 101

10.4 BETWEEN (Condição com uma faixa de valores)

Definição: O operador BETWEEN determina a faixa de valores aceito de

uma pesquisa. Este comando substitui os operadores „>=‟ e „<=‟.

Sintaxe: SELECT <campo> FROM <tabela>

WHERE <campo> BETWEEN <valor_inicial> AND <valor_final>

Exemplos:

/* seleciona todos os registros da tabela CLIENTE onde o campo

Cod_Cli estiver entre 1 e 5 */

SELECT * FROM CLIENTE

WHERE COD_CLI BETWEEN 1 AND 5

/* seleciona todos os registros da tabela PEDIDO onde o campo

Data_Ped estiver entre „05/10/2003‟ a „02/10/2004‟ */

SELECT * FROM PEDIDO

WHERE DATA_PED BETWEEN '2003/10/05' AND

„2004/10/02'

/*seleciona todos os registros da tabela PRODUTO onde o campo

Val_UnitProd estiver entre 500 e 1000 */

SELECT * FROM PRODUTO WHERE VAL_UNITPROD BETWEEN

500 AND 1000

Page 48: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 48 de 101

10.5 LIKE (Comparação com uma parte de uma literal)

Definição: O operador LIKE faz a comparação somente com uma parte de

uma literal, desconsidera tudo que possa vir antes ou depois do valor

passado. O caracter „%‟ significa qual à parte a ser desconsiderada

Sintaxe: SELECT <campo> FROM <tabela>

WHERE <campo> LIKE <[%]parte_literal[%]>

Exemplos:

/* seleciona todos os registros da tabela CLIENTES onde o campo

Nome_Cli terminar com a literal SOUZA */

SELECT * FROM CLIENTE

WHERE NOME_CLI LIKE „%SOUZA‟

/* seleciona todos os registros da tabela CLIENTE onde o campo

Nome_Cli começar com a letra A */

SELECT * FROM CLIENTE

WHERE NOME_CLI LIKE „A%‟

/* seleciona todos os registros da tabela CLIENTE onde o campo

Nome_Cli não possuir o sobrenome OLIVEIRA dentro do seu conteúdo */

SELECT * FROM CLIENTE WHERE NOME_CLI NOT

LIKE „%OLIVEIRA%‟

/* seleciona todos os registros da tabela CLIENTE onde o campo

Nome_Cli possui a primeira letra entre A ou E ou Z */

SELECT * FROM CLIENTE WHERE NOME_CLI

LIKE „[A,E,Z]%‟

/* seleciona todos os registros da tabela CLIENTE onde o campo

Nome_Cli possui a primeira letra entre A a D */

SELECT * FROM CLIENTE WHERE NOME_CLI

LIKE „[A-D]%‟

Page 49: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 49 de 101

10.6 DISTINCT (Valores únicos)

Definição: O operador DISTINCT elimina todas as replicações,

significando que somente dados distintos serão apresentados como

resultado de uma pesquisa.

Sintaxe: SELECT DISTINCT <campo> FROM <tabela> [WHERE

<condição>]

Exemplos:

/* seleciona todos os valores do campo Código do Cliente, valor

do pedido da tabela PEDIDO sem repetição dos códigos do cliente

*/

SELECT DISTINCT COD_CLI,VAL_PED FROM PEDIDO

/* seleciona todos os valores do campo data do pedido , valor do

pedido, da tabela Pedido sem repetição da data do pedido*/

SELECT DISTINCT DATA_PED,VAL_PED FROM PEDIDO

Page 50: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 50 de 101

11. FUNÇÕES DE AGRUPAMENTO

COUNT (CONTAR)

SUM (SOMAR)

AVG (MÉDIA)

MAX (MÁXIMO)

MIN (MÍNIMO)

11.1 COUNT (Contador de registros)

Definição: A função COUNT retorna a quantidade de registros

correspondentes a uma pesquisa.

Sintaxe: SELECT COUNT(*) FROM <tabela> [WHERE <condição>]

Exemplos:

/* seleciona a quantidade de registros da tabela Clientes */

SELECT COUNT(*) AS “TOTAL CLIENTES” FROM CLIENTE

/* seleciona a quantidade de registros da tabela pedidos onde o

campo data_ped estiver entre 02/12/2008 a 03/08/2010 */

SELECT COUNT(*)AS ”QUANTIDADE PEDIDOS” FROM PEDIDO

WHERE DATA_PED BETWEEN „2008/12/02‟ AND

„2010/08/03‟

/* seleciona a quantidade de telefones que cada cliente possui */

SELECT COD_CLI,COUNT(COD_CLI) AS “TOTAL TELEFONE”

FROM FONE

GROUP BY COD_CLI

Page 51: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 51 de 101

11.1.1 GROUP BY (Agrupamento de dados)

Definição: A cláusula GROUP BY agrupa todas as linhas de retorno de

uma pesquisa que possuírem o valor de seus campos iguais.

Sintaxe

SELECT (<campo_agrupamento> e/ou <funcao_agrupamento>)

FROM <tabela> [WHERE <condição>]

GROUP BY <campo_agrupamento>

Exemplo:

/* seleciona a quantidade de telefones que cada cliente possui

agrupado por cliente */

SELECT COD_CLI,COUNT(COD_CLI) AS “TOTAL TELEFONE”

FROM FONE

GROUP BY COD_CLI

/* seleciona a quantidade de emails que cada cliente possui

agrupado por cliente */

SELECT COD_CLI,COUNT(COD_CLI) AS “TOTAL EMAIL”

FROM EMAIL

GROUP BY COD_CLI

/* seleciona a quantidade de parcelas que cada pedido possui

agrupado pedido */

SELECT NUM_PED, COUNT(NUM_PED) AS “QUANT.PARCELAS”

FROM PARCELA

GROUP BY NUM_PED

Page 52: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 52 de 101

11.2 SUM (Somatória de valores)

Definição: A função SUM faz a somatória dos valores de um campo.

Sintaxe: SELECT SUM(<campo>) FROM <tabela> [WHERE <condição>]

Exemplos:

/* seleciona a somatória dos valores do campo Renda_Cli da

tabela Clientes */

SELECT COD_CLI, SUM(RENDA_CLI) AS ”RENDA CLIENTE”

FROM CLIENTE

GROUP BY COD_CLI

/* seleciona a somatória dos valores do campo Val_UnitProd da

tabela PRODUTO*/

SELECT COD_PROD, SUM(VAL_UNITPROD)AS ”VALOR TOTAL

PRODUTOS” FROM PRODUTO

GROUP BY COD_PROD

Page 53: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 53 de 101

11.3 AVG (Média de valores)

Definição: A função AVG faz a média dos valores de um campo.

Sintaxe: SELECT AVG(<campo>) FROM <tabela> [WHERE <condição>]

Exemplos:

/* seleciona a média dos valores do campo Renda_Cli da tabela

Clientes */

SELECT COD_CLI, AVG(RENDA_CLI) AS ”RENDA CLIENTE”

FROM CLIENTE

GROUP BY COD_CLI

/* seleciona a média dos valores do campo Val_UnitProd da

tabela PRODUTO*/

SELECT COD_PROD, AVG(VAL_UNITPROD)AS ”VALOR TOTAL

PRODUTOS” FROM PRODUTO

GROUP BY COD_PROD

Page 54: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 54 de 101

11.4 MIN, MAX (Menor e maior valor)

Definição: As funções MIN e MAX retornam respectivamente o menor e o

maior valor encontrado para um campo.

Sintaxe: SELECT MIN(<campo>) FROM <tabela> [WHERE <condição>]

SELECT MAX(<campo>) FROM <tabela> [WHERE <condição>]

Exemplos:

/* seleciona o menor do valor do campo Renda_Cli da tabela

Clientes */

SELECT MIN(RENDA_CLI) AS ”MENOR RENDA” FROM

CLIENTE

/* seleciona o maior do valor do campo Val_UnitProd da tabela

PRODUTO*/

SELECT MAX(VAL_UNITPROD) AS ”MAIOR PRODUTO” FROM

PRODUTO

Page 55: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 55 de 101

12. HAVING (condição do agrupamento)

Definição: A cláusula HAVING faz com que o resultado da pesquisa seja

feito sob determinada condição. A condição HAVING está para a cláusula

GROUP BY da mesma forma que a cláusula WHERE está para o

comando SELECT

Sintaxe:

SELECT (<campo> ou <função>) FROM <tabela>

[WHERE <condição1>]

GROUP BY <campo>

HAVING <condição2>

Exemplos:

/* seleciona o campo Código Funcionário e a quantidade de

registros da tabela Dependentes agrupados pelo campo Cod_Func

onde o valor do campo Quantidade de Dependentes deve possuir

mais de 1 ocorrência */

SELECT COD_FUNC, COUNT(COD_FUNC) AS “TOTAL”

FROM DEPENDENTE

GROUP BY COD_FUNC HAVING COUNT(COD_FUNC) > 1

/* seleciona o campo RENDA, o menor e o maior valor do campo

RENDA da tabela CLIENTE agrupados pelo campo CODIGO onde

o valor do campo CODIGO deve possuir média superior a 450 */

SELECT COD_CLI, MIN(RENDA_CLI) AS “MINIMO”,

MAX(RENDA_CLI) AS “MÁXIMO” FROM CLIENTE GROUP BY

COD_CLI

HAVING AVG(RENDA_CLI) > 450

Page 56: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 56 de 101

13. IN (Condição com valores fixos)

Definição: O operador IN determina os valores fixos aceitos de uma

pesquisa.

Sintaxe:

SELECT <campo> FROM <tabela>

WHERE <campo> IN (<lista_de_valores>)

Exemplos:

/* seleciona todos os registros da tabela CLIENTE onde o campo

CODIGO for igual a 1 ou 2 ou 3 ou 4 */

SELECT * FROM CLIENTE

WHERE COD_CLI IN (1,2,3,4)

/* seleciona todos os registros da tabela PEDIDO onde o campo

NUMERO for igual a 45 ou 50 */

SELECT * FROM PEDIDO

WHERE NUM_PED IN (45,50)

/* seleciona todos os registros da tabela TIPOCLI onde o campo

CODIGO for igual a 1 ou 3 ou 5 ou 6*/

SELECT * FROM TIPOCLI

WHERE COD_TIPOCLI IN (1, 3, 5, 6)

/* seleciona todos os registros da tabela TIPOCLI onde o campo

NOME for igual a OURO

SELECT * FROM TIPOCLI

WHERE NOME_TIPOCLI IN („OURO‟)

Page 57: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 57 de 101

14. SUBQUERIES (Pesquisa dentro de um comando)

Definição: O conceito de SUBQUERIES possibilita criar um consulta

(comando SELECT) dentro de um outro comando(SELECT, INSERT,

UPDATE, DELETE).

Sintaxe:

Não existe uma sintaxe fixa, mas existem algumas restrições:

- deve estar sempre entre parênteses;

- não pode ser usada na cláusula ORDER BY;

- a subquery não pode conter ORDER BY, COMPUTE ou SELECT

INTO

- a subquery não pode, em hipótese alguma, retornar mais de uma

coluna no caso de comparação por valores ou listas;

- a subquery deve usar a função EXISTS se fizer um SELECT *;

- não pode usar na lista de colunas do SELECT uma coluna do tipo

IMAGE ou TEXT.

Exemplos:

/* seleciona todos os registros da tabela CLIENTE onde o campo

RENDA for maior ou igual ao maior valor da média do campo

RENDA */

SELECT * FROM CLIENTE

WHERE RENDA_CLI > = (SELECT AVG(RENDA_CLI)

FROM CLIENTE )

/* seleciona todos os registros da tabela PRODUTOS o campo

VALOR UNITARIO é maior do o menor valor do campo VALOR

DO PEDIDO */

SELECT * FROM PRODUTO WHERE VAL_UNITPROD >

(SELECT MIN(VAL_PED) FROM PEDIDO)

Page 58: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 58 de 101

/* seleciona todos os registros da tabela CLIENTE onde exibe os

clientes de não possuem telefone */

SELECT * FROM CLIENTE

WHERE COD_CLI NOT IN (SELECT COD_CLI FROM FONE)

/* seleciona todos os registros da tabela CLIENTE onde exibe os

clientes que possuem email */

SELECT * FROM CLIENTE

WHERE COD_CLI IN (SELECT COD_CLI FROM EMAIL)

/* seleciona todos os registros da tabela CLIENTE onde exibe os

clientes que fizeram pedidos e foi atendido pelo funcionário 6 */

SELECT * FROM CLIENTE

WHERE COD_CLI IN (SELECT COD_CLI FROM PEDIDO

WHERE COD_FUNC=6)

/* seleciona todos os registros da tabela cliente onde exibe os

dados dos clientes que são casados e que possui email */

SELECT * FROM CLIENTE WHERE COD_CLI IN (SELECT

COD_CLI FROM CONJUGE WHERE COD_CLI IN (SELECT

COD_CLI FROM EMAIL))

/* seleciona todos os registros da tabela cliente onde exibe os

dados dos clientes que são solteiros, que não possui email e não

possui telefone e cliente do sexo Feminino */

SELECT * FROM CLIENTE WHERE COD_CLI NOT IN (SELECT

COD_CLI FROM CONJUGE WHERE COD_CLI NOT IN (SELECT

COD_CLI FROM EMAIL WHERE COD_CLI NOT IN (SELECT

COD_CLI FROM FONE))) AND SEXO_CLI=‟F‟

Alguns casos podem ser resolvidos tanto por SUBQUERIES como por

JOINS, outros apenas por SUBQUERIES.

Page 59: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 59 de 101

15. JOIN (Relacionamento de tabelas)

15.1 Introdução a Joins:

Um join é uma operação que permite você consultar duas ou mais

tabelas para produzir um result set que incorpora linhas e colunas de cada

tabela. Seu join ocorre em colunas das tabelas que são comuns em ambas às

tabelas.

Quando na execução de um join de tabelas, o SQL Server compara os

valores das colunas especificas, linha a linha e ele usa o resultado da

comparação para combinar os valores qualificando para novas linhas.

São quatro tipos de joins: inner joins, outer joins, cross joins e self joins.

15.2 TIPOS DE JOINS

Inner Join

Outer Join

Cross Join

Self Join

15.2.1 Usando Inner Joins:

Inner joins combinam tabelas pela comparação em colunas que são

comuns a ambas as tabelas. SQL Server retorna somente linhas que atendem

as condições do join.

Quando usar joins considere os seguintes fatos e diretrizes:

Inner Joins são DEFAULT SQL Server. Você pode abreviar a clausula

INNER JOIN para JOIN.

Especifique as colunas que você gostaria de mostrar no seu result set

pela inclusão do qualified name da coluna na listas do select.

Inclua a clausula Where para restringir as linhas que são retornadas no

result set.

Page 60: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 60 de 101

Não use um valor nulo como uma condição join porque valores nulos não

são avaliados igualmente com um outro.

INNER JOIN

Este é simples, o mais entendível e o mais comum. Esta consulta retornará

todos os registros da tabela esquerda (tabela A) que têm correspondência com

a tabela direita (tabela B). Podemos escrever este JOIN da seguinte forma:

Exemplos:

SELECT CLIENTE.COD_CLI,CLIENTE.NOME_CLI,

EMAIL.EMAIL_CLI

FROM CLIENTE INNER JOIN EMAIL

ON CLIENTE.COD_CLI =EMAIL.COD_CLI

15.2.2 Usando Outer Joins:

Você usa um outer join para ver linhas que normalmente não atendem a

uma condição de join.

Operador do Outer join é um sinal de (*) antes ou depois da condição de

igualdade, ou usando a palavra chave LEFT OUTER JOIN, RIGHT

OUTER JOIN.

Left ou Right outer joins, combinam linhas a partir de duas tabelas que

atenda a uma condição de join, mais qualquer das linhas que não atendam ou

da tabela do lado esquerdo ou da tabela do lado direito como especificado na

clausula JOIN. Linhas que não atendem a condição join mostram null no result

set.

Page 61: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 61 de 101

Você também pode usar full outer joins para mostrar toas às linhas nas

tabelas join, indiferentemente das tabelas terem atendido quaisquer dos

valores.

Quando utilizar left ou right outer joins, considere os seguintes fatos ou

diretrizes:

SQL Server retorna somente linhas únicas quando você usa left ou right

outer joins.

Use um left outer join para mostrar todas as linhas a partir da primeira

tabela nomeada. Se você inverter a ordem no qual as tabelas estão

listadas na clausula FROM, a declaração produz o mesmo resultado

como um right outer join.

Não use um valor nulo como condição de join porque valores nulos são

avaliados igualmente com um outro.

Voce pode abreviar o LEFT OUTER JOIN ou RIGHT OUTER JOIN

como LEFT JOIN ou RIGHT JOIN.

Você pode usar outer joins entre duas tabelas somente.

LEFT JOIN

Esta consulta retorna todos os registros da tabela esquerda (tabela A) e

as correspondências que existirem com a tabela direita (tabela B). O código

ficará da seguinte forma:

SELECT CLIENTE.COD_CLI,CLIENTE.NOME_CLI,

EMAIL.EMAIL_CLI

FROM CLIENTE LEFT JOIN EMAIL

ON CLIENTE.COD_CLI =EMAIL.COD_CLI

Page 62: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 62 de 101

RIGHT JOIN

Esta consulta retornará todos os registros da tabela direita (tabela B) e

as correspondências que existirem com a tabela esquerda (tabela A). O código

ficará da seguinte forma:

SELECT CLIENTE.COD_CLI,CLIENTE.NOME_CLI,

EMAIL.EMAIL_CLI

FROM CLIENTE RIGHT JOIN EMAIL

ON CLIENTE.COD_CLI =EMAIL.COD_CLI

15.2.3. Usando Cross Joins:

Cross join mostra combinação de todas as linhas das tabelas unidas.

Nenhuma coluna comum será necessária para fazer um cross join.

Quando você usa cross joins, SQL Server produz um produto cartesiano

no qual o numero de linhas no resultado seja igual ao numero de segunda

tabela. Por exemplo, se são 8 linhas na primeira tabela e 9 linhas na outra

tabela SQL Server retorna um total de 72 linhas.

OUTER JOIN

Este JOIN também é conhecido como FULL OUTER JOIN ou FULL

JOIN. Esta consulta retornará todos os registros das duas tabelas e juntando

também os registros correspondentes entres as duas tabelas. O código ficará

da seguinte forma:

SELECT CLIENTE.COD_CLI,CLIENTE.NOME_CLI, EMAIL.EMAIL_CLI

FROM CLIENTE CROSS JOIN EMAIL

Page 63: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 63 de 101

15.3 Exemplos de JOIN (Relacionamento de tabelas)

/* seleciona o campo CODIGO, NOME da tabela CLIENTE e o

campo EMAIL DO CLIENTE da tabela EMAIL */

SELECT CLIENTE.COD_CLI,CLIENTE.NOME_CLI,

EMAIL.EMAIL_CLI

FROM CLIENTE INNER JOIN EMAIL

ON CLIENTE.COD_CLI =EMAIL.COD_CLI

OU

SELECT C.COD_CLI,C.NOME_CLI,

E.EMAIL_CLI

FROM CLIENTE C INNER JOIN EMAIL E

ON C.COD_CLI =E.COD_CLI

(Exemplos com a utilização de alias)

/*Utilizando o exemplo anterior agora queremos listar todos os

clientes possui ou não email, para fazer tal consulta é necessário a

utilização do comando OUTER JOIN */

SELECT CLIENTE.COD_CLI,CLIENTE.NOME_CLI,

EMAIL.EMAIL_CLI

FROM CLIENTE LEFT OUTER JOIN EMAIL

ON CLIENTE.COD_CLI = EMAIL.COD_CLI

/*Utilizando o exemplo anterior agora queremos fazer todas as

combinações possíveis de cliente com email, para fazer tal

consulta é necessário a utilização do comando CROSS JOIN */

SELECT CLIENTE.COD_CLI,CLIENTE.NOME_CLI,

EMAIL.EMAIL_CLI

FROM CLIENTE CROSS JOIN EMAIL

Page 64: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 64 de 101

15.4 Combinação de mais de 2 tabelas

/* seleciona o campo CODIGO, NOME da tabela CLIENTE

NOME_RUA, NOME_BAIRRO da tabela ENDEREÇO e

NOME_CID da tabela CIDADE, NOME_EST da tabela ESTADO */

SELECT CLIENTE.COD_CLI,CLIENTE.NOME_CLI,

ENDERECO.NOME_RUA,ENDERECO.NOME_BAIRRO,

CIDADE.NOME_CID

FROM CLIENTE INNER JOIN ENDERECO

ON CLIENTE.COD_CLI =ENDERECO.COD_CLI

INNER JOIN CIDADE

ON CIDADE.COD_CID = ENDERECO.COD_CID

INNER JOIN ESTADO

ON ESTADO.SIGLA_EST = CIDADE.SIGLA_EST

OU

SELECT CL.COD_CLI,CL.NOME_CLI,E.NOME_RUA,

E.NOME_BAIRRO,CI.NOME_CID

FROM CLIENTE CL JOIN ENDERECO E

ON CL.COD_CLI =E.COD_CLI

JOIN CIDADE CI

ON CI.COD_CID =E.COD_CID

INNER JOIN ESTADO ES

ON ES.SIGLA_EST = CI.SIGLA_EST

Page 65: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 65 de 101

16. CRIANDO VISÕES (VIEW)

As views nada mais são do que instruções SELECT já pré-definidas

e armazenadas no banco. É um objeto do SQL Server utilizado para dar

nome a uma query. Este conceito pode parecer simples, e é, mas pode-se

resolver muitos problemas com as views.

Uma view não é um programa, portanto dentro dela você só pode

escrever o comando Select. Você pode colocar dentro de uma view o

comando select feito com as seguintes critérios:

Consultas com união (Join)

Consultas com união (Union)

Consultas com Group By com função de totalização

Consultas com subconsultas (Subquery)

Consultas com Order By apenas com Top.

Uma view não pode ter um select com order by sem a clausula Top. Uma

view não recebe parâmetros de entrada.

Para criar uma view, utilizamos o comando CREATE VIEW. Sua

sintaxe:

Sintaxe:

CREATE VIEW <view_name> AS

<instrução_SELECT>

Exemplos:

/* Criar uma view que seleciona todos os registros da tabela

CLIENTE onde o campo CODIGO for igual a 1 ou 2 ou 3 ou 4 */

CREATE VIEW V_CLIENTE AS

SELECT * FROM CLIENTE

WHERE COD_CLI IN (1,2,3,4)

Para testar a View digite somente o código abaixo

SELECT * FROM V_CLIENTE

Page 66: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 66 de 101

Suponha que necessitamos liberar o acesso aos dados da tabela

Funcionário, mas não podemos liberar o acesso aos dados da coluna Salário

(Sal_Func). Para solucionar esta questão, você poderia criar uma View sobre

essa tabela e liberar para o usuário acesso à tabela apenas por meio da view:

/* Criar uma view Funcionário da situação relatada anteriormente */

CREATE VIEW V_FUNC AS

SELECT COD_FUNC,NOME_FUNC,

SEXO_FUNC,END_FUNC

FROM FUNCIONARIO

Para testar a View digite somente o código abaixo

SELECT * FROM V_FUNC

Outro ponto importante sobre as views: não podemos utilizar a

cláusula ORDER BY na definição da view. Como uma exceção: quando se

utiliza TOP para limitar os registros:

-- Isto é uma definição válida de uma view

CREATE VIEW V_PEDIDO

AS

SELECT TOP 50 NUM_PED,COD_CLI,DATA_PED

FROM PEDIDO

ORDER BY DATA_PED

Para testar a View digite somente o código abaixo

SELECT * FROM V_FUNC

Não podemos utilizar as cláusulas COMPUTE, COMPUTE BY e INTO dentro

de uma view

Page 67: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 67 de 101

17. CRIANDO FUNCTION (UDF :FUNCÕES DEFINIDAS PELO O

USUÁRIO )

Nas linguagens de programação as funções quebram grandes

tarefas de processamento de dados em pequenas partes. Conjuntos

complexos de funções podem ser divididos em pequenas unidades lógicas

mais facilmente gerenciáveis. Qualquer código que deve executar uma tarefa

lógica específica, quando incorporado a uma função, pode ser chamado de

dentro de um programa sem a necessidade de repetir o código responsável por

aquela tarefa várias vezes.

Uma função definida pelo usuário (UDF) é um módulo de instruções

Transact-SQL que pode ou não possuir argumentos e que retorna um

resultado. Por exemplo, uma função pode informar o valor de uma parcela

mensal a partir de uma taxa de juros informada, calcular a distância entre dois

pontos, selecionar uma lista de empregados que pertencem a um

departamento, etc.

Uma UDF é muito parecida com uma stored procedure, ou seja,

possui instruções que controlam o fluxo do programa e a manipulação dos

dados.

Uma UDF difere de uma stored procedure nos seguintes aspectos:

Não permite qualquer alteração no estado global da sessão, por

exemplo, como a mudança do banco de dados.

Não permite a utilização de parâmetros com a clásula OUTPUT.

Não pode ser usada com a opção “FOR XML” para obtenção do

resultado. Portanto, a opção “FOR XML” pode ser utilizada

apenas em stored procedures.

Erros do Transact-SQL que causam o cancelamento da instrução,

e então continuam na próxima instrução de um módulo (como em

triggers e stored procedures) são tratados de modo diferente

dentro de uma função. Em uma função, os erros encontrados em

instruções Transact-SQL interrompem seu processamento.

Page 68: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 68 de 101

Entretanto, se você necessita de procedimentos que retornam

resultados, uma UDF é frequentemente a melhor escolha para uma aplicação

SQL, pelo simples fato de poder ser chamada a partir de uma instrução SQL.

18.1 Definindo uma function UDF:

Antes de poder definir uma UDF, deve-se determinar suas

características, tais como, seu nome, sua vinculação ou não aos objetos

referenciados, o número e tipos de dados dos parâmetros que ela terá, e

finalmente, os tipos de valores retornados. Você então executa a instrução

CREATE FUNCTION para criar a UDF. Caso após definir a função, você venha

a descobrir que qualquer uma das características não são apropriadas, você

poderá usar a instrução ALTER FUNCTION para alterar as informações

utilizadas em sua definição.

Você não poderá fazer uso da instrução ALTER FUNCTION para

modificar o tipo de uma função, ou seja, uma função do tipo scalar valued para

uma função do tipo table valued ou vice-versa. Similarmente, você não poderá

utilizar a instrução ALTER FUNCTION para modificar uma função do tipo inline

para uma função multi-statement ou vice-versa. Entretanto, você poderá

remover funções UDF com a instrução DROP FUNCTION.

É necessário ter permissão sobre a instrução CREATE FUNCTION

para criar, alerar ou excluir UDFs. Outros usuários, além do criador da UDF,

devem ter as permissões apropriadas antes de poder utilizá-la em instruções

Transact-SQL. Para criar ou alterar tabelas com CHECK constraint, cláusula

DEFAULT ou uma computed column, que façam referências a UDFs, o usuário

deve ter a permissão de REFERENCES sobre a função.

As instruções válidas em uma função incluem:

A instrução DECLARE poderá ser utilizada para definer as variáveis e

cursores que serão locais para a função.

Page 69: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 69 de 101

As atribuições de valores para objetos locais da função são permitidas

com a utilização da opção SET para variáveis locais do tipo table e

scalar.

Operações com cursores locais que são declarados, abertos, fechados e

liberados dentro da função. A instrução FETCH que retorna dados para

o cliente não é permitida. Apenas a instrução FETCH que atribui valores

para variáveis locais e que utilizam a cláusula INTO são permitidas.

São permitidas as instruções de controle de fluxo (tais como IF..ELSE,

WHILE, RETURN, GOTO, BREAK, and CONTINUE).

As instruções SELECT que contenham expressões que atribuam valores

para variáveis que são locais para a função.

As instruções UPDATE, INSERT, and DELETE que modificam variáveis

do tipo table que são locais para a função.

A instrução EXECUTE com chamadas para extended stored procedures.

As seguintes regras se aplicam quando uma UDF faz chamadas a uma

extended stored procedure:

A extended stored procedure não pode retornar dados para o cliente. Se

a stored procedure retorna dados, a execução da função chamadora

falhará.

A extended stored procedure pode se reconectar ao SQL Server;

entretanto, a chamada a extended stored procedure deve fazer parte da

mesma transação que a função que a chamou

As funções que chamam extended stored procedure são marcadas

como funções nondeterministic. (Veja abaixo no ítem determinismo da

função).

A extended stored procedure é executada no contexto de segurança da

conta de usuário do Microsoft Windows® sob a qual o SQL Server está

rodando. O criador da stored procedure deve considerer isso quando

atribuir direitos de EXECUTE para os usuários.

Page 70: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 70 de 101

18.2 Tipos de Function:

O SQL Server 2000 implementa três tipos de UDFs assim conhecidas:

Scalar valued functions

In-line table valued functions

Multi-statement table valued functions

18.2.1. Funções Scalar valued:

Uma função definida pelo usuário do tipo scalar valued retorna um

único valor em resposta a cada uma das chamadas à função. Uma função é do

tipo scalar valued se a cláusula de retorno especifica um tipo de dado scalar do

SQL Server. Funções do tipo Scalar valued podem ser definidas com a

utilização de múltiplas instruções Transact-SQL.

Exemplo 1:

CREATE FUNCTION F_Volume

(@Altura decimal (4,1), @Largura decimal (4,1), @Profund

decimal (4,1))

RETURNS decimal (12,3) –- tipo de dado de retorno

AS

BEGIN

RETURN (@Altura * @Largura * @Profund)

END

A cláusula RETURNS, no exemplo anterior, especifica que um

decimal scalar_data_type sera retornado pela função. A cláusula RETURNS

pode ser qualquer um dos tipos de dados conhecidos como scalar_data_types

do SQL Server exceto timestamp, text, ntext, or image.

Para as funções do tipo scalar valued, utiliza-se a instrução

RETURN com um argumento. O valor desse argumento é retornado como o

resultado da função. O tipo de dado do argumento passado com a instrução

RETURN deve poder ser implicitamente convertido para o tipo de dado do

valor de retorno da função.

Page 71: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 71 de 101

Nas chamadas às funções do tipo scalar, deve-se utilizar ou o formato

de nome nome_do_usuário.nome_da_função ou nome do banco de dados

nome do usuário. nome_da_função

Você não pode usar o nome da função isoladamente; essa restrição

existe para diferenciar as chamadas às UDFs das chamadas às funções do

SQL Server. Nós poderíamos chamar a função que definimos anteriormente da

seguinte forma:

Para testar a Function

Select dbo.F_Volume(12.2,10.6,10.0)

Exemplo 2 :

Função onde calcula o fatorial de um número inteiro qualquer.

CREATE FUNCTION F_CalcFact ( @N int )

RETURNS float

AS

BEGIN

DECLARE @R float

SET @R = 1

DECLARE @I int

SET @I = 1

WHILE @I <= @N

BEGIN

SET @R = @R * @I

SET @I = @I + 1

END

RETURN @R

END

Para testar a Function para o fatorial de 5

select dbo.calcfact(5)

Page 72: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 72 de 101

Exemplo 3:

Função onde calcula o comprimento de uma circunferência.

CREATE FUNCTION F_PERIMETRO

(

@Raio decimal (5,2)

)

RETURNS decimal float –- tipo de dado de retorno

AS

BEGIN

RETURN (2 * @Raio * 3.1416 )

END

Para testar a Function com raio de 9 cm

select dbo.f_perimetro(9.5)

18.2.2. Funções Table Valued:

Para funções do tipo inline table valued, a cláudula RETURNS é

seguida da palavra TABLE sem uma lista de colunas. As funções do tipo inline

table valued retornam valores apresentados como se extraídos de tabelas e

são definidas com uma única instrução SELECT em sua construção. As

colunas, incluindo os tipos de dados retornados pela função, são derivados da

lista da instrução SELECT que define a função.

Page 73: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 73 de 101

Exemplos

1) Escreva uma função que retorna todos os dados do funcionário cujo código deve ser recebido como parâmetro. CREATE FUNCTION F_Funcionario(@Cod_Func int)

RETURNS TABLE

AS

RETURN(SELECT * FROM Funcionario

WHERE Cod_Func = @Cod_Func)

Para testar SELECT * FROM F_Funcionario(11)

2) Escreva uma função que retorna todos os dados do funcionário.

CREATE FUNCTION F_Funcionario( )

RETURNS TABLE

AS

RETURN(SELECT * FROM Funcionario)

Para testar SELECT * FROM F_Funcionario( )

3) Escreva uma função que recebe o código do cliente como parâmetro e

retorna a Codigo do cliente e a renda familiar , incluindo na sua renda o salário

do seu conjuge se ele for casado.*/

CREATE FUNCTION F_RendaTodosCliConj

( @COD_CLI INT )

RETURNS TABLE

AS RETURN

(SELECT Cliente.Cod_Cli, Cliente.Renda_Cli +

Conjuge.Renda_Conj AS Renda

FROM Cliente LEFT JOIN Conjuge

ON Cliente.Cod_Cli = Conjuge.Cod_Cli

WHERE CLIENTE.Cod_Cli =@COD_CLI)

Page 74: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 74 de 101

Para Testar

SELECT * FROM F_RendatodosCliConj(1)

SELECT * FROM F_RendatodosCliConj(2)

SELECT * FROM F_RendatodosCliConj(4)

4) Escreva uma função que retorna a renda salarial de todos os cliente,

incluindo na renda de cada um o salário do seu cônjuge daqueles que são casados. CREATE FUNCTION F_RendaTodosCliConj()

RETURNS TABLE

AS

RETURN

(SELECT Cliente.Cod_Cli,

Cliente.Renda_Cli + Conjuge.Renda_Conj AS Renda

FROM Cliente LEFT JOIN Conjuge

ON Cliente.Cod_Cli = Conjuge.Cod_Cli)

Para testar SELECT * FROM F_RendatodosCliConj()

5) Escreva uma função de recebe o número de um pedido como parâmetro e

retorna o código do funcionário que atendeu este pedido e o valor e data de vencimento de cada parcela deste pedido.

CREATE FUNCTION F_PedPar

(@Num_Ped int)

RETURNS TABLE

AS

RETURN (SELECT Funcionario.Cod_Func,

Parcela.Val_Venc,

Parcela.Data_Venc

FROM Funcionario INNER JOIN Pedido

ON Funcionario.Cod_Func = Pedido.Cod_Func

INNER JOIN Parcela

ON Pedido.Num_Ped = Parcela.Num_Ped

WHERE Pedido.Num_Ped = @Num_Ped)

Para testar

SELECT * FROM F_PedPar(1)

Page 75: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 75 de 101

18.2.3. Funções Multi-Statement Table Valued:

Se a cláusula RETURNS especificar uma tabela com suas colunas e

tipos de dados, a função será do tipo multi-statement table valued.

Exemplo:

Esta função retorna uma tabela de juros compostos.

CREATE FUNCTION dbo.GetInterest( @NumPeriods int,

@PercentInterest money )

RETURNS @InterestTable TABLE

(

Num int,

I money

)

AS

BEGIN

DECLARE @N int

SET @N = 0

DECLARE @ITot money

SET @ITot = 1

WHILE @N < @NumPeriods

BEGIN

SET @N = @N + 1

SET @ITot = @ITot * (1 + (@PercentInterest /

100))

INSERT INTO @InterestTable VALUES(@N, @ITot)

END

RETURN

END

A cláusula RETURNS no exemplo acima define uma variável local

de retorno do tipo table chamada @InterestTable, e também define a

estrutura da tabela com a definição das colunas.

Page 76: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 76 de 101

As instruções no corpo da função inserem linhas na variável table

local @InterestTable para construir a tabela que será o resultado

retornado pela função.

Note que a instrução RETURN não tem argumento. O valor da

variável local do tipo table definida sera o valor retornado pela função.

A seguir temos um exemplo de como chamar a função do tipo multi-

statement table valued:

Para testar

SELECT * FROM GetInterest(240,11)

No exemplo estamos gerando uma tabela de juros com 240 períodos com juros

de 11%

Opcionalmente, chamadas às funções do tipo table valued poderão ser seguida

de um alias para a tabela. Pode-se também utilizar um alias para se referir às

colunas que são retornadas pela função nas cláusulas SELECT e WHERE.

Page 77: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 77 de 101

18. CRIANDO STORED PROCEDURE

(PROCEDIMENTOS)

Stored Procedures: são conjuntos de instruções, armazenados em

bancos de dados, que realizam operações com os demais dados do banco.

São úteis em um programa por várias razões, uma delas é para se evitar a

necessidade de ler os dados do banco, fazer as operações neles e depois

gravar novamente. Outra é pela possibilidade que trazem de se balancear o

processamento entre o servidor de banco de dados e o servidor da aplicação

que acessa o banco.

Um procedimento armazenado (procedure) é uma coleção salva de

instruções Transact-SQL ou uma referência a um método CLR (Common

Language Runtime) Microsoft .NET Framework que pode usar e retornar

parâmetros fornecidos pelo usuário. Os procedimentos podem ser criados para

uso permanente ou temporário em uma sessão, procedimento temporário local,

ou uso temporário em todas as sessões, procedimento temporário global.

Os procedimentos armazenados também podem ser criados para

serem executados automaticamente quando uma instância do SQL Server é

iniciada.

Em seguida vamos concatenar o valor do parâmetro com uma string

e colocar a string completa dentro de uma variável. Por fim, iremos executar

esta instrução com o comando EXECUTE() do SQL Server. O código desta

Stored Procedure é mostrado abaixo:

/* Esta Procedure vai fazer um Select Dinâmico em alguma Tabela */

CREATE PROCEDURE ST_SQL_DINAMICO @NOME_TABELA

VARCHAR(50)

AS

BEGIN

/* Declarando a Variável que conterá a instrução */

DECLARE @INSTR_SQL VARCHAR(500)

Page 78: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 78 de 101

/* Contatenando a instrução com o Nome da Tabela */

SET @INSTR_SQL = "SELECT * FROM " + @NOME_TABELA

/* EXECUTANDO A INSTRUÇÃO DINAMICAMENTE */

EXECUTE(@INSTR_SQL)

END

Para executar esta Stored Procedure basta indicar qual é o nome da

tabela:

EXEC ST_SQL_DINAMICO "Infonew.dbo.Cliente"

Muito bem, vimos como funciona a execução dinâmica de instruções do

SQL Server. Mas quais são os pontos negativos da execução dinâmica?

Em exemplos como o citado acima não há grandes problemas. O SQL

Server só vai ter um pouco de trabalho para fazer o parser da instrução

em tempo de execução, compilar e colocar o plano de execução no

procedure cache a cada vez que esta Stored Procedure for executada. Se

esta Stored Procedure for executada muitas vezes podemos contornar o

problema acima utilizando a system Stored Procedure sp_executesql no

lugar do EXECUTE(). Para mais informações sobre a sp_executesql

procurem na documentação oficial do SQL Server, o Books Online, que

contém uma boa descrição de seus parâmetros e alguns exemplos de

uso. Outro inconveniente da execução dinâmica é o retorno de dados. Se

desejarmos fazer alguma manipulação nos dados retornados por uma

execução dinâmica, devemos fazer uso de uma tabela temporária que

será preenchida com o retorno da execução. Esta tabela temporária vai

armazenar o último resultado da(s) instrução(es) dinâmica(s) e deve

conter a mesma quantidade e tipos de dados das colunas que o

resultado.

Page 79: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 79 de 101

Sintaxe CREATE { PROC | PROCEDURE } [schema_name.]

procedure_name [ ; number ]

[ { @parameter [ type_schema_name. ] data_type }

[ VARYING ] [ = default ] [ OUT | OUTPUT ]

[READONLY]

] [ ,...n ]

[ WITH <procedure_option> [ ,...n ] ]

[ FOR REPLICATION ]

AS { <sql_statement> [;][ ...n ] |

<method_specifier> }

[;]

<procedure_option> ::=

[ ENCRYPTION ]

[ RECOMPILE ]

[ EXECUTE AS Clause ]

<sql_statement> ::=

{ [ BEGIN ] statements [ END ] }

<method_specifier> ::=

EXTERNAL NAME assembly_name.class_name.method_name

Argumentos schema_name

É o nome do esquema ao qual o procedimento pertence.

procedure_name

É o nome do novo procedimento armazenado. Os nomes de

procedimento devem estar de acordo com as regras para identificadores e

devem ser exclusivos no esquema.

Recomendamos fortemente que você não use o prefixo sp_ no nome

de procedimento. Este prefixo é usado pelo SQL Server para designar

procedimentos armazenados de sistema.

Page 80: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 80 de 101

Para obter mais informações, consulte Criando procedimentos

armazenados (Mecanismos de Banco de Dados).

Os procedimentos temporários locais ou globais podem ser criados

usando um sinal numérico (#) antes de procedure_name (#procedure_name)

para procedimentos temporários locais e dois sinais numéricos para

procedimentos temporários globais (##procedure_name). Nomes temporários

não podem ser especificados para procedimentos armazenados CLR.

O nome completo para um procedimento armazenado ou um

procedimento armazenado temporário global, incluindo ##, não pode exceder

128 caracteres. O nome completo para um procedimento armazenado

temporário local, incluindo #, não pode exceder 116 caracteres.

; number

É um inteiro opcional usado para agrupar procedimentos do mesmo

nome. Esses procedimentos agrupados podem ser descartados juntos usando

uma instrução DROP PROCEDURE. Por exemplo, um aplicativo chamado

ordens poderia usar procedimentos chamados orderproc;1, orderproc;2 e assim

por diante.

A instrução orderproc de DROP PROCEDURE descarta o grupo

inteiro. Se o nome tiver identificadores delimitados, o número não deverá ser

incluído como parte do identificador; use o delimitador apropriado somente no

procedure_name.

Os procedimentos armazenados numerados têm as seguintes

restrições:

Page 81: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 81 de 101

@ parameter

É um parâmetro no procedimento. Um ou mais parâmetros podem

ser declarados em uma instrução CREATE PROCEDURE. O valor de cada

parâmetro declarado deve ser fornecido pelo usuário quando o procedimento é

chamado, a menos que um padrão para o parâmetro seja especificado ou o

valor seja definido como igual a outro parâmetro. Um procedimento

armazenado pode ter no máximo 2.100 parâmetros. Se o procedimento

contiver parâmetros com valor de tabela, e faltar um parâmetro na chamada,

um padrão de tabela vazia será transmitido.

Especifique um nome de parâmetro usando um sinal de arroba (@)

como o primeiro caractere. O nome do parâmetro deve estar em conformidade

com as regras de identificadores. Os parâmetros são locais para o

procedimento; os mesmos nomes de parâmetro podem ser usados em outros

procedimentos. Por padrão, os parâmetros só podem assumir o lugar de

expressões constantes; eles não podem ser usados no lugar de nomes de

tabela, nomes de coluna ou nomes de outros objetos de banco de dados. Para

obter mais informações, consulte EXECUTE (Transact-SQL).

Para procedimentos armazenados CLR, char, varchar, text, ntext,

image, cursor, tipos de tabela definidos pelo usuário e table não podem ser

especificados como parâmetros. Para obter mais informações sobre a

correspondência entre tipos CLR e tipos de dados de sistema do SQL Server,

consulte Mapeando dados de parâmetro CLR.

Para obter mais informações sobre tipos de dados de sistema SQL

Server e sua sintaxe, consulte Tipos de dados (Transact-SQL).

Se o tipo de dados do parâmetro for do tipo de dados CLR definido

pelo usuário, será necessário ter a permissão EXECUTE para o tipo.

Page 82: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 82 de 101

Se type_schema_name não for especificado, o Mecanismo de

Banco de Dados do SQL Server fará referência a type_name na seguinte

ordem:

Tipos de dados de sistema do SQL Server.

O esquema padrão do usuário atual no banco de dados atual.

O esquema dbo no banco de dados atual.

Para procedimentos armazenados numerados, o tipo de dados não pode ser

xml ou um tipo de dados CLR definido pelo usuário.

VARYING

Especifica o conjunto de resultados com suporte como um parâmetro de

saída. Este parâmetro é construído dinamicamente pelo procedimento

armazenado e seu conteúdo pode variar. Aplica-se somente a parâmetros

cursor.

DEFAULT

É um valor padrão para o parâmetro. Se um valor default for definido, o

procedimento poderá ser executado sem especificar um valor para aquele

parâmetro. O padrão deve ser uma constante ou pode ser NULL. Se o

procedimento usar o parâmetro com a palavra-chave LIKE, poderá incluir os

seguintes caracteres curinga: % _ [] and [^].

OUTPUT

Indica que o parâmetro é um parâmetro de saída. O valor desta opção

pode ser retornado para a instrução EXECUTE de chamada. Use parâmetros

OUTPUT para retornar valores ao chamador do procedimento. Parâmetros text,

ntexte image não podem ser usados como parâmetros OUTPUT, a menos que

o procedimento seja CLR. Um parâmetro de saída que usa a palavra-chave

OUTPUT pode ser um espaço reservado de cursor, a menos que o

procedimento seja CLR. Um tipo de tabela definido pelo usuário não pode ser

especificado como um parâmetro OUTPUT de um procedimento armazenado.

Page 83: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 83 de 101

READONLY

Indica que o parâmetro não pode ser atualizado ou modificado no corpo

do procedimento. Se o tipo de parâmetro for um tipo de tabela definido pelo

usuário, deverá ser especificado READONLY.

RECOMPILE

Indica que o Mecanismo de Banco de Dados não armazena em cache

um plano para esse procedimento e o procedimento é compilado em tempo de

execução. Esta opção não pode ser usada quando FOR REPLICATION é

especificado. RECOMPILE não pode ser especificado para procedimentos

armazenados CLR.Para instruir o Mecanismo de Banco de Dados a descartar

planos para consultas individuais dentro de um procedimento armazenado, use

a dica de consulta RECOMPILE. Para obter mais informações, consulte dicas

de consulta (Transact-SQL). Use a dica de consulta RECOMPILE quando

valores atípicos ou temporários são usados em apenas um subconjunto de

consultas que pertencem ao procedimento armazenado.

ENCRYPTION

Indica que o SQL Server converterá o texto original da instrução

CREATE PROCEDURE em um formato ofuscado. A saída do ofuscamento não

é diretamente visível em quaisquer exibições do catálogo no SQL Server. Os

usuários que não tiverem acesso a tabelas do sistema ou arquivos de banco de

dados não poderão recuperar o texto ofuscado. Entretanto, o texto estará

disponível para usuários privilegiados que puderem acessar as tabelas do

sistema na porta DAC ou acessar diretamente os arquivos de banco de dados.

Além disso, os usuários que podem anexar um depurador ao processo de

servidor também podem recuperar o procedimento descriptografado da

memória em tempo de execução. Para obter mais informações sobre como

acessar os metadados do sistema, consulte Configuração de visibilidade de

metadados.

Page 84: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 84 de 101

EXECUTE AS

Especifica o contexto de segurança sob o qual o procedimento

armazenado deve ser executado.

FOR REPLICATION

Especifica que procedimentos armazenados que são criados para

replicação não podem ser executados no Assinante. Um procedimento

armazenado criado com a opção FOR REPLICATION é usado como um filtro

de procedimento armazenado e é executado somente durante a replicação. Os

parâmetros não poderão ser declarados se FOR REPLICATION for

especificado. FOR REPLICATION não pode ser especificado para

procedimentos armazenados CLR. A opção RECOMPILE é ignorada para

procedimentos criados com FOR REPLICATION.Um procedimento FOR

REPLICATION terá um tipo de objeto RF em sys.objects e sys.procedures.

Procedimentos armazenados temporários

O Mecanismo de Banco de Dados oferece suporte a dois tipos de

procedimentos temporários: local e global. Um procedimento temporário local é

visível somente para a conexão que o criou. Um procedimento temporário

global está disponível para todas as conexões. Os procedimentos temporários

locais são descartados automaticamente ao término da sessão atual. Os

procedimentos temporários globais são descartados ao término da última

sessão que usa o procedimento. Para obter mais informações, consulte

Criando procedimentos armazenados (Mecanismos de Banco de Dados).

Procedimentos armazenados executados automaticamente

Um ou mais procedimentos armazenados podem ser executados

automaticamente quando o SQL Server é iniciado. Os procedimentos

armazenados devem ser criados pelo administrador de sistema no banco de

dados mestre e executados na função de servidor fixa sysadmin como um

processo de segundo plano.

Page 85: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 85 de 101

Os procedimentos não podem ter nenhum parâmetro de entrada ou de

saída. Para obter mais informações, consulte Execução automática de

procedimentos armazenados.

Aninhamento de procedimentos armazenados

Os procedimentos armazenados podem ser aninhados. Isso significa um

procedimento armazenado pode chamar outro. O nível de aninhamento é

incrementado quando o procedimento chamado começa a ser executado e é

decrescido quando a execução do procedimento chamado é concluída. Os

procedimentos armazenados podem ser aninhados em até 32 níveis. Para

obter mais informações, consulte Aninhando procedimentos armazenados.

Em um procedimento armazenado, os nomes de objeto usados com

todas as instruções DDL (Data Definition Language), tais como as instruções

CREATE, ALTER, ou instruções DROP, DBCC, EXECUTE e instruções

dinâmicas SQL, devem ser qualificadas com o nome do esquema de objeto, se

outros usuários, que não o proprietário do procedimento armazenado, usarem

esse procedimento.

Exemplo 1:

Escreva uma procedure onde faça a multiplicação de 2 números

CREATE PROCEDURE SP_CONTA

@NUM_1 INT,

@NUM_2 INT,

@RESPOSTA Decimal(6,2) Output

AS Set @RESPOSTA = @NUM_1 * @NUM_2

Para Testar

DECLARE @RESPOSTA Decimal(6,2)

EXEC SP_CONTA 10,7, @RESPOSTA Output

PRINT @RESPOSTA

Page 86: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 86 de 101

Exemplo 2:

Escreva uma procedure onde faça a multiplicação dos 2 primeiros números e

divisão pelo 3 número

CREATE PROCEDURE SP_CONTA2

@NUM_1 decimal(4,2),

@NUM_2 decimal(4,2),

@NUM_3 decimal(4,2),

@RESPOSTA decimal(10,2) Output

AS Set @RESPOSTA = (@NUM_1 + @NUM_2)/@NUM_3

Para Testar

DECLARE @RESPOSTA decimal(10,2)

EXEC SP_CONTA2 7.5,5,2, @RESPOSTA Output

PRINT @RESPOSTA

Exemplo 3:

Escreva uma procedure onde entre com a nota p1 e p2 e mostre a média

escolar

CREATE PROCEDURE SP_MEDIA

@NUM_1 decimal(3,1),

@NUM_2 decimal(3,1),

@RESPOSTA decimal(3,1) Output

AS Set @RESPOSTA = (@NUM_1 + @NUM_2*2)/3

Para Testar

DECLARE @RESPOSTA decimal(3,1)

EXEC SP_MEDIA 7.5,6, @RESPOSTA Output

PRINT @RESPOSTA

Page 87: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 87 de 101

Exemplo 4:

Escreva uma procedure se a soma dos salários dos funcionários for maior do

que 5000 aplique um aumento de 15,23% para todos funcionários. Caso

contrário 10,45%.

USE INFONEW

GO

CREATE PROCEDURE SP_FUNCIONARIO

As DECLARE @PERCENT DECIMAL(10,2)

IF (SELECT sum(Sal_Func) FROM FUNCIONARIO)>=5000

SET @PERCENT = 1.1523

ELSE

SET @PERCENT = 1.1045

UPDATE FUNCIONARIO SET SAL_FUNC = SAL_FUNC * @PERCENT

Para Testar

EXEC SP_FUNCIONARIO

Select * from funcionario (Verificar o novo salario)

Page 88: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 88 de 101

Exemplo 5:

Escreva uma procedure se a média salarial dos funcionários for maior do que

3500 aplique um aumento de 13,3% para todos os funcionários. Caso contrário

9,4%.

USE INFONEW

CREATE PROCEDURE SP_FUNCIONARIO2

As DECLARE @PERCENT DECIMAL(10,2)

IF (SELECT avg(Sal_Func) FROM FUNCIONARIO)>=3500

SET @PERCENT = 1.133

ELSE

SET @PERCENT = 1.094

UPDATE FUNCIONARIO SET SAL_FUNC = SAL_FUNC * @PERCENT

Para Testar

EXEC SP_FUNCIONARIO2

Select * from funcionario (Verificar o novo salario)

Page 89: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 89 de 101

Exemplo 7:

Escreva uma procedure onde entre com 2 parâmetros, onde primeiro indica o

código do produto e o segundo indica o valor da porcentagem de aumento a

USE INFONEW

CREATE PROCEDURE SP_PRODUTO

@COD_PROD INT,

@PERCENT DECIMAL (8,4)

AS

IF @PERCENT = 0 OR @COD_PROD = 0

RETURN(0)

UPDATE PRODUTO

SET VAL_UNITPROD = VAL_UNITPROD * @PERCENT

WHERE COD_PROD = @COD_PROD

Para Testar

EXEC SP_PRODUTO 1,1.25

Select * from PRODUTO (Verificar o novo valor unitário)

Page 90: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 90 de 101

Exemplo 8:

Escreva uma procedure onde entre com 2 parâmetros, onde primeiro indica o

sexo do cliente e o segundo indica o valor da porcentagem de aumento a

USE INFONEW

CREATE PROCEDURE SP_CLIENTE

@SEXO_CLI CHAR(1),

@PERCENT DECIMAL (8,4)

AS

IF @PERCENT = 0

RETURN(0)

UPDATE CLIENTE

SET RENDA_CLI = RENDA_CLI * @PERCENT

WHERE SEXO_CLI = @SEXO_CLI

Para Testar

EXEC SP_CLIENTE „F‟,1.25

SELECT * FROM Cliente

WHERE Sexo_Cli = 'f' (Verificar a nova renda dos cliente

onde o sexo igual a F)

Page 91: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 91 de 101

19. CRIANDO TRIGGERS (GATILHOS )

Triggers são procedimentos que podem ser gravados em Transact

SQL, Java, PL/SQL ou C. São executados (ou disparados) implicitamente

quando uma tabela é modificada, um objeto é criado ou ocorrem algumas

ações de usuário ou de sistema de banco de dados.

As triggers são similares as stored procedures diferindo, apenas, na

maneira como são chamadas. As Triggers são chamadas indiretamente pelos

comandos INSERT, UPDATE ou DELETE executada implicitamente quando

ocorre algum evento de trigger enquanto a stored procedure deve ser

executado explicitamente.

A principal aplicação de uma trigger é a criação de restrições de

acesso ao banco de dados, como rotinas de segurança.

Em vez de deixarmos o controle da aplicação para a própria tabela,

passamos a executar por meio de triggers, ou gatilhos, esses controles,

tornando muito mais seguro o manuseio de nossa base de dados.

Entre as várias utilidades de um trigger, podemos destacar:

Criar mecanismos de validação, os quais envolvam pesquisas

em mais de uma tabela;

Inserir o conteúdo de uma coluna derivada de outras colunas;

Atualizar outras tabelas em função de inclusão ou alteração

de dados da tabela que estamos utilizando;

Criação de logs, ou registros de inclusão e alterações de

usuários.

Há outras aplicações que podemos fazer com triggers, isso depende

da necessidade do desenvolvedor ou DBA.

Page 92: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 92 de 101

Devemos ter em mente dois importantes aspectos de um trigger :

Primeiramente que a ação executada pelo trigger é o bloco Transact-

SQL que criamos e que um trigger pode ser acionado pelos comandos

INSERT, DELETE e UPDATE além de poder ser chamado quando mais de

uma ação ocorrer.

Há também certos comandos Transact-SQL que não podem ser

utilizados dentro de um trigger como, por exemplo: ALTER DATABASE, ALTER

PROCEDURE, CREATE DATABASE, CREATE INDEX, DROP DATABASE,

DROP PROCEDURE, entre outros.

Criando um trigger

Modelo para criação de um trigger:

CREATE TRIGGER nome_do_trigger

ON { table | view }

[ WITH ENCRYPTION ]

{

{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [

UPDATE ] }

[ WITH APPEND ]

[ NOT FOR REPLICATION ]

AS

[ { IF UPDATE ( column )

[ { AND | OR } UPDATE ( column ) ]

[ ...n ]

| IF ( COLUMNS_UPDATED ( ) { bitwise_operator }

updated_bitmask )

{ comparison_operator } column_bitmask [ ...n ]

} ]

sql_statement [ ...n ]

}

}

Page 93: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 93 de 101

Onde:

ON - Indica a tabela ou visão para o qual o trigger está sendo criado;

FOR - Deve ser seguido do tipo de comando ou comandos que disparam o

trigger;

AFTER - Especifica que o trigger é disparado apenas quando todas as

operações especificadas no comando de disparo forem executadas com

sucesso. Todas as ações contraints devem ter sido bem sucedidas antes de o

trigger ser executado. AFTER é padrão se apenas FOR for especificado.Os

triggers do tipo AFTER não pode ser definidos em visões;

INSTEAD OFF - Especifica que o trigger é executado em vez do comando de

disparo desse trigger, ou seja, em vez do comando INSERT, o trigger será

executado. Podem existir triggers INSTEAD OF para cada comando INSERT,

UPDATE.

Os triggers INSTEAD OF não são permitidos em visões com a opção WITH

CHECK OPTION.

Exemplo prático de um trigger

Neste exemplo imagine que possuímos uma tabela onde ficam armazenados

artigos. A cada alteração feita na tabela imprimirá uma mensagem na tela

'Artigo alterado com sucesso!'.

CREATE TRIGGER TRG_Artigos

ON Artigos

FOR INSERT, UPDATE

AS PRINT('Artigo alterado com sucesso!')

Para alterar um trigger usamos o comando ALTER TRIGGER

nome_do_trigger.

Para excluir um trigger utilizamos o comando DROP TRIGGER

nome_do_trigger.

Lembrando que se a tabela que contém o trigger for eliminada o trigger

também será.

Page 94: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 94 de 101

Exemplo:

/* Escreva um trigger que não permita a alteração e a exclusão de dados na

tabela Estado * /.

CREATE TRIGGER T_Estado

ON Estado

INSTEAD OF UPDATE,DELETE

AS RAISERROR('Operação não permitida nesta

tabela',16,1)

Para testar

DELETE ESTADO

OU

INSERT INTO ESTADO VALUES („CL‟,‟CALIFÓRNIA‟)

OU

UPDATE ESTADO

SET NOME_EST=‟COLORADO‟

WHERE SIGLA_EST= „CL‟

O evento define qual é a instrução DML que aciona a trigger. Informa

qual instrução SQL irá disparar a trigger. Pode ser:

INSERT

UPDATE

DELETE

Quando o evento for um UPDATE podemos informar quais colunas

que, ao serem alteradas, irão disparar a trigger. O mesmo NÃO ocorre com

INSERT e DELETE porque essas instruções sempre afetam a linha por inteiro.

Page 95: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 95 de 101

INSTEAD OF indica que a trigger irá ser executada no lugar da instrução que

disparou a trigger. Literalmente, a instrução é substituída pela trigger. Essa

técnica permite que façamos, por exemplo, alterações em uma tabela através

de uma view. É usado nos casos em que a view não pode alterar uma tabela

por não referenciar uma coluna com a constraint not null. Nesse caso a trigger

pode atualizar a coluna que a view não tem acesso. Dois detalhes muito

importantes sobre INSTEAD OF:

Só funcionam com views

É sempre de linha. Será considerado assim, mesmo que "FOR EACH

ROW" for omitido.

Exemplo:

/ * Escreva um trigger que realize a baixa em estoque a cada produto vendido

em cada pedido * /

CREATE TRIGGER T_BaixaEstoque

ON Itens

AFTER INSERT

AS

IF(SELECT Cod_Sta FROM Pedido INNER JOIN inserted

ON Pedido.Num_Ped = Inserted.Num_Ped) = 1

--Se o Pedido estiver aberto

UPDATE Produto

SET Qtd_EstqProd = Qtd_EstqProd -

Inserted.Qtd_Vend

FROM Produto INNER JOIN inserted

ON Produto.Cod_Prod = Inserted.Cod_Prod

ELSE

BEGIN

RAISERROR('Este pedido não está aberto -

Operação não Executada',16,1)

ROLLBACK TRANSACTION

RETURN

END

Page 96: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 96 de 101

Para testar

Verificar a quantidade de produtos em estoque do produto de código 1

SELECT * FROM PRODUTO

WHERE COD_PROD = 1

Inserir um novo pedido

insert into pedido

values(1,1,1,'12/03/2009',2300.87)

Verificar qual é o número do novo pedido

select * from pedido

WHERE data_ped = '12/03/2009'

Inserir um novo itens no pedido consultado anteriormente no caso de nosso

exemplo o pedido é de número 5125

insert into itens

values(5125,1,25,2500)

Verifique que a quantidade de produto em estoque abaixou em 25 .

SELECT * FROM PRODUTO

WHERE COD_PROD = 1

Desabilitar uma trigger

ALTER TABLE nome_tabela DISABLE TRIGGER nome_da_trigger

GO

Habilitar uma trigger

ALTER TABLE nome_tabela ENABLE TRIGGER nome_da_trigger

GO

Page 97: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 97 de 101

/ * Escreva um trigger que realiza uma auditoria no Banco, contendo

informações do usuário que executou, login , horário, comandos executados

por este usuário * /

Vamos criar a tabela que vai ser inserido os dados:

Create table Comandos_usuarios

(

Usuario varchar(20),

Login varchar(20),

Horario varchar(30),

Comando varchar(4000)

)

E depois a tabela cadastro

Create table Cadastro

(

Codigo int,

Nome varchar(40)

)

Abaixo esta a trigger:

CREATE TRIGGER TriggerName

ON Cadastro

FOR INSERT, UPDATE, DELETE AS

BEGIN

SET NOCOUNT ON

DECLARE @ExecStr varchar(50), @Qry nvarchar(255)

CREATE TABLE #inputbuffer

(

EventType nvarchar(30),

Parameters int,

EventInfo nvarchar(255)

)

SET @ExecStr = 'DBCC INPUTBUFFER(' + STR(@@SPID) + ')'

INSERT INTO #inputbuffer

EXEC (@ExecStr)

SET @Qry = (SELECT EventInfo FROM #inputbuffer)

INSERT INTO Comandos_usuarios

SELECT USER AS UserName,

SYSTEM_USER as LoginName,

CURRENT_TIMESTAMP AS CurrentTime,

@Qry

END

Page 98: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 98 de 101

Vamos por partes agora,o comando DBCC INPUTBUFFER permite

que quando passamos o SPID da sessão,conseguimos visualizar que comando

o usuário corrente está executando,agora o principal esse dbcc gera um

“output” , a EventInfo que identifica o comando executado pelo usuário, junto

com isso temos as funções de sistema como USER,SYSTEM_USER e

CURRENT_TIMESTAMP, que pegamos informações do usuário que executou,

juntando essas informações temos um log completo sobre o que o usuário

executou, abaixo vamos ver os exemplos, como já criamos a tabela que vai

inserir os logs e a trigger.

Agora vamos inserir dados na tabela cadastro ,depois atualizar e por fim

excluir,esses 3 comandos tem que ser gravados em nossa tabela

Comandos_usuarios.

Verificar a quantidade de registros na tabela comandos_usuarios

SELECT * FROM COMANDOS_USUARIOS

Inserir dados na tabela cadastro

--Insere uma linha

insert cadastro values(1,'Fernando Garcia')

Alterar dados na tabela cadastro

--Atualiza o cidog de 1 para 2

update Cadastro

set codigo = 2

where nome like 'Fernando Garcia'

Excluir dados na tabela cadastro

--Exclui a linha com o codigo atualizado

Delete from cadastro

where codigo = 2

Verificar depois das operações a quantidade de registros na tabela

comandos_usuarios

SELECT * FROM COMANDOS_USUARIOS

Page 99: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 99 de 101

Com isso vemos que podemos ter um controle sobre os comandos dos

usuários. Além de ter maior controle de todos os comandos efetuados em

determinadas tabelas.

Exemplo:

/* Escreva um trigger que não permita a exclusão de nenhuma tabela no Banco

de Dados Infonew * /.

USE INFONEW

GO

CREATE TRIGGER T_SEGURANCA

ON DATABASE

FOR DROP_TABLE

AS

PRINT 'PARA APAGAR TABELAS DESABILITE A TRIGGER

T_SEGURANCA'

Para testar

DROP TABLE ESTADO

DROP TABLE EMAIL

DROP TABLE FONE

Page 100: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 100 de

101

CONSIDERAÇÕES FINAIS Esta apostila foi confeccionada para os alunos da Instituição de

Ensino Superior Faculdade Anchieta como um material de apoio para a disciplina Banco de Dados onde é utilizado o SGDB SQL Server 2008 versão Express.

Em caso de dúvida mandar e-mail para [email protected] , não esqueça de citar as mensagens de erro.

Page 101: Apostila SQL Server 2008

MICROSOFT SQL SERVER 2008

Banco de Dados

Autor: Nilson A. Borges 101 de

101

REFERÊNCIAS BIBLIOGRÁFICAS: Leão, Renata de Oliveira SQL 2000 SERVER: Estrutura e Implementação de Sistemas de Banco de Dados São Paulo , Editora Erica, 2002 Ritter, Mauricio Microsoft SQL SERVER 2008, Fundamentos de Bancos de dados – Passo a Passo