Escolar Documentos
Profissional Documentos
Cultura Documentos
1 – INTRODUÇÃO
Neste curso estaremos estudando conceitos e práticas normalmente utilizadas quando projetamos em
banco de dados relacionais.
Vamos utilizar neste curso o Sistema Gerenciador de Banco de Dado (SGBD) SQL-Server 2005
Express Edition. Vale ressaltar que no mercado existem vários softwares desenvolvidos para gerenciar banco
de dados, tais como:
• Access
• MySQL
• Postgree (gratuito)
• Oracle
• Paradox
• Firebird (gratuito)
• Etc...
O SQL-Server 2005 Express Edition é um software oferecido gratuitamente no site da Microsoft. Você
poderá baixá-lo diretamente do seguinte endereço:
http://www.microsoft.com/downloads/details.aspx?familyid=4C6BA9FD-319A-4887-BC75-3B02B5E48A40&displaylang=en
Cuidado, pois existem outros pacotes do SQL-SERVER 2005 EXPRESS, porém não oferecem
ADVANCED SERVICES (serviços avançados). Estes serviços nos permitem manter os bancos de dados
armazenados em um servidor.
Esta versão será usada neste módulo do curso, pois, trata-se de um software LIVRE, ou seja, você não
precisará ter uma licença para usá-lo em seu computador.
Antes de falarmos do SGBD SQL-Server, temos que revisar vários conceitos relevantes sobre banco
de dados.
Um banco de dados relacional, gerado por um SGBD, possui várias TABELAS que se relacionam entre
si, através de CAMPOS. Daí se origina o nome dado a este tipo de banco de dados, RELACIONAL.
Os CAMPOS das tabelas serão utilizados para armazenar REGISTROS. Vale dizer que cada registro é
composto por CARACTERES.
Quando consultamos qualquer bibliografia de banco de dados, o vocabulário utilizado pelos autores
são os seguintes:
A resposta para essa pergunta pode ser dada baseada nas seguintes vantagens:
• É compacto Não há necessidade de arquivos de papéis;
• Acesso rápido Os computadores podem acessar rapidamente qualquer informação
armazenada num Banco de dados (B.D.).
• Menos trabalho braçal Os funcionários de empresas não precisam preocupar-se
com o arquivamento de fichas, pois o computador é responsável por fazê-lo.
• Fluxo corrente informações certas e atualizadas a qualquer momento, basta pedir.
Um banco de dados deve oferecer para empresas algumas vantagens. Estas vantagens facilitarão a
tomada de decisões e permitirão a armazenagem de dados confiáveis. Veja as vantagens:
• Redução na redundância de dados eliminar repetições DESNECESSÁRIAS em
atributos das entidades.
• Compartilhamento de dados pelas aplicações novas e as já existentes;
• Padronização de padrões esta tarefa refere-se à padronização de dados e
documentos dentro da empresa, para facilitar o compartilhamento e a compreensão de
dados;
• Restrições de segurança referem-se aos controles de acessos aos usuários do
banco de dados (pessoas ou aplicações).
• Manter a integridade de dados possuir nas entidades do banco de dados
informações atualizadas e consistentes, para tomada de decisões dentro da empresa.
Quando estamos criando as tabelas de um banco de dados, devemos tomar o cuidado de retirarmos
dessas os campos que armazenarão registros redundantes desnecessários. A esse processo damos o nome
de NORMALIZAÇÃO. Em alguns momentos a redundância de dados torna-se necessária, como veremos
adiante.
Vamos ilustrar as situações de anomalias de entidades. Com isso será possível sabermos quando
devemos normalizar a ENTIDADE. Observe a entidade abaixo:
Pedidos_Pecas
Num_pedido Data Num_peça Descricao Quantidade Preco
1000 14/11/98 Ax12 Bicicleta 3 90,00
1020 15/11/98 BT04 Tv 10 400,00
1030 15/11/98 BZ66 Bola 300 5,00
1040 16/11/98 BT04 Tv 4 160,00
1050 17/11/98 CB03 Vidro 5 25,00
1070 20/11/98 BT04 Bola 2 80
Repare na entidade Pedidos_pecas, mostrada no capítulo 5.1 desta apostila, que para trabalhar com
uma nova peça no banco de dados, o usuário será obrigado fazer um pedido da mesma, visto que não é
possível somente cadastrar dados da peça. Este é um exemplo prático de uma anomalia de INCLUSÃO.
Repare na entidade Pedidos_pecas, mostrada no capítulo 5.1 desta apostila, que ao efetuar UMA
alteração na peça BT04, essa se fará necessária em várias outras tuplas da entidade, visto que vários pedidos
desta mesma peça foram cadastrados na entidade. Este é um exemplo prático de uma anomalia de
ALTERAÇÃO.
Repare na entidade Pedidos_pecas, mostrada no capítulo 5.1 desta apostila, que ao excluirmos o
pedido 1000 perderemos também qualquer referência da peça AX12, pois esta foi requisitada somente em um
pedido. Imagine o que aconteceria se esta peça fosse vendida para algum cliente! Este é um exemplo prático
de uma anomalia de EXCLUSÃO.
Repare na entidade Pedidos_pecas, mostrada no capítulo 5.1 desta apostila, que não há nada que
impeça que a peça BT04 seja cadastrada com várias descrições diferentes. Isso seria uma catástrofe no
momento de uma venda! Este é um exemplo prático de uma anomalia de INCONSISTÊNCIA.
Diante das anomalias exemplificadas anteriormente iremos falar neste ponto das normalizações de
entidades de um banco de dados. Existem 6 formas de normalizarmos uma entidade, segundo CODD, a saber:
• 1NF primeira forma normal;
• 2NF segunda forma normal;
• 3NF terceira forma normal;
• BCNF Forma normal de Boyce Codd;
• 4NF quarta forma normal;
• 5NF quinta forma normal;
Uma relação está na 1FN, se somente todos os domínios básicos (CONTEÚDOS DE CADA CAMPO)
contiverem somente valores atômicos (não repetidos). Para atingir esta forma normal devemos eliminar os
grupos de registros repetidos. Como?
Procedimentos:
a) Identificar a chave primária da entidade;
b) Identificar o grupo de atributos que causam a repetição de registros e excluí-lo da entidade;
c) Criar uma nova entidade com a chave primária da entidade anterior e o grupo de atributos que causavam a
repetição.
A chave primária da nova entidade será obtida pela concatenação da chave primária da entidade
inicial e a chave primária do grupo repetitivo.
Figura 1
A ENTIDADE ACIMA NÃO ESTÁ NORMALIZADA, PORTANTO DEVEMOS NORMALIZÁ-LA PARA A 1NF,
pois apresenta as seguintes ANOMALIAS:
Para solução das anomalias acima, deveremos normalizar a tabela notafiscal para a 1NF, conforme
figura abaixo:
Figura 2
OBSERVAÇÃO IMPORTANTE: Na nova entidade “Vendas”, ilustrada na figura anterior, note que a
chave primária é composta pela chave da tabela NotaFiscal (NumeroNotaFiscal) e CódigoMercadoria.
Uma relação está na 2FN, se e somente se, ela estiver na 1NF e todos os atributos não chave forem
totalmente dependentes da chave primária (dependente de toda a chave e não apenas de parte dela).
Procedimentos:
a) Identificar os atributos que não são funcionalmente dependentes de toda a chave primária.
b) Remover da entidade todos esses atributos identificados e criar uma nova entidade com eles.
A chave primária da nova entidade será o atributo nos quais os atributos removidos são funcionalmente
dependentes.
Exemplo: Vejamos as entidades a seguir:
Notas Fiscais:
(Num. NF, Série, Código do Cliente, Nome do cliente, Endereço do cliente, Total Geral da Nota)
Arquivo de Vendas:
(Num. NF, Código da Mercadoria, Descrição da Mercadoria, Quantidade vendida, Preço de venda e Total da
Venda)
Figura 3
Figura 4
Como resultado desta etapa, houve um desdobramento do arquivo de Vendas (a ENTIDADE
NOTAFISCAL, não foi alterada, por não possuir chave composta) em duas estruturas, a saber:
Primeira estrutura (Arquivo de Vendas): Contêm os atributos originais, sendo excluídos os dados que
são dependentes apenas do campo Código da Mercadoria.
Segundo estrutura (Arquivo de Mercadorias): Contém os elementos que são identificados apenas
pelo Código da Mercadoria, ou seja, independentemente da Nota Fiscal, a descrição e o preço de venda serão
constantes.
Uma relação está na 3FN se somente estiver na 2FN e todos os atributos não chave forem
dependentes não transitivos da chave primária (cada atributo for funcionalmente dependente apenas dos
atributos componentes da chave primária, ou se, todos os seus atributos não chave forem independentes entre
si).
Procedimentos:
a) Identificar todos os atributos que são funcionalmente dependentes de outros atributos não chave;
b) Removê-los e criar uma nova entidade com os mesmos.
A chave primária da nova entidade será o atributo nos quais os atributos removidos são funcionalmente
dependentes.
Estrutura na segunda forma normal (2FN): Observem as entidades abaixo:
Notas Fiscais:
(Num. NF, Série, Data emissão, Código do Cliente, Nome do cliente, Endereço do cliente, Total Geral da Nota)
Vendas:
(Num. NF, Código da Mercadoria, Quantidade vendida e Total da venda desta mercadoria)
Mercadorias:
(Código da Mercadoria, Descrição da Mercadoria, Preço de venda)
Como resultado desta etapa, houve um desdobramento do arquivo de Notas Fiscais, por ser o único que
possuía campos que não eram dependentes da chave principal (Num. NF), uma vez que independente da Nota
Fiscal, o Nome, Endereço são inalterados. Este procedimento permite evitar inconsistência nos dados dos
arquivos e economizar espaço, por eliminar o armazenamento freqüente e repetidas vezes destes dados. A
cada nota fiscal comprada pelo cliente, haverá o armazenamento destes dados e poderá ocorrer divergência
entre eles.
Após a normalização, as estruturas dos dados estão projetadas para eliminar as inconsistências e
redundâncias dos dados, eliminando desta forma qualquer problema de atualização e operacionalização do
sistema. A versão final dos dados poderá sofrer alguma alteração, para atender as necessidades específicas
do sistema, a critério do analista, durante a fase de desenvolvimento do projeto físico do sistema.
5.5- BCNF ou NFBC (Forma Normal de BOYCE CODD) / 4FN (Quarta Forma Normal) e 5FN(Quinta Forma
Normal)
A BCNF, a 4FN e a 5FN não serão abordadas neste curso. Ressalta-se que estas normalizações
existem e devem ser tratadas em cursos que abordam a fundo as teorias de banco de dados. Vale dizer
também, que o objetivo desse curso é aprofundarmos na linguagem Transact-SQL e conhecer a ferramenta
SQL-SERVER, o que faz necessário termos noções básicas de normalizações e relacionamentos entre
entidades de um banco de dados relacional.
Antes de normalizarmos as tabelas de um banco de dados devemos passar por etapas de modelagem
de dados. As etapas envolvidas na construção de modelos de dados são:
• Modelo Conceitual
• Modelo Lógico
• Modelo Físico
– MODELO CONCEITUAL
Nesta etapa da modelagem de dados o DBA deve:
• Conhecer o negócio
• Rascunhar as principais entidades do BD. e seus principais atributos.
• Não se preocupar com os relacionamentos n : n.
– MODELO LÓGICO
Nesta etapa da modelagem de dados o DBA deve:
• Representar o negócio.
• Criar as entidades de relacionamentos para substituir os relacionamentos n:n.
• Definir as chaves primárias de cada entidade.
• Normalizar as tabelas.
• Adequar aos padrões do banco de dados escolhido, neste caso, ao padrão do SQL
SERVER.
• Documentar as entidades e seus atributos.
– MODELO FÍSICO
Nesta etapa da modelagem de dados o DBA deve:
• Tomar ciência das limitações do banco de dados, neste caso, o SQL-SERVER.
• Considerar os requisitos dos softwares que farão acesso ao banco de dados.
• Criar fisicamente as entidades, relacionamentos, chaves, índices, definir níveis de
acessos entre outros, ou seja, criar fisicamente o banco de dados projetado nas etapas
anteriores.
6 – SQL-SERVER
De agora para frente iremos abordar assuntos relativos à ferramenta SQL-SERVER 2005 Express
Edition.
Outra grande vantagem do SQL-SERVER refere-se ao fato do mesmo trabalhar com arquitetura
cliente-servidor. Com isso, todos os bancos de dados criados no SQL poderão ser acessados pelo cliente, no
servidor.
Um Servidor SQL pode conter vários bancos de dados, que por sua vez são acessados por vários
usuários.
Num banco de dados criado no SQL-SERVER, poderemos limitar os acessos ao próprio banco, como
também às entidades e até mesmo seus atributos. Tarefas como leitura, gravação, exclusão e consulta à tuplas
também podem ser limitadas para determinados usuários.
Como dito anteriormente o SQL Server 2005 Express Edition pode manter vários bancos de dados.
Cada novo banco de dados criado possuirá os componentes citados acima. A figura abaixo ilustra os
componentes dos bancos de dados criados no servidor SQL:
Figura 5
Repare que o banco de dados MASTER possui seus componentes: Tables, Views, Stored Procedures
e etc. Perceba que no banco de dados NORTWIND, estes mesmos componentes estão presentes.
Este componente é responsável por criar e manipular as tabelas do banco de dados. Lembre-se que
cada entidade armazena tuplas de registros. Cada entidade é composta por atributos (campos). Cada conjunto
de registros, armazenados em cada atributo, recebe o nome de domínio.
Quando criados, os atributos podem conter restrições quanto ao conteúdo a ser armazenado, são as
consistências de dados ou constraints.
No momento da criação das tabelas poderemos definir o(s) campo(s) que compõe(m) a(s) chave(s)
primária(s).
Com este componente, torna-se possível principalmente a criação dos relacionamentos entre tabelas
do banco de dados.
Figura 6
As stored procedures exercem um papel fundamental num banco de dados. São usadas como
procedimentos, que podem ou não receber parâmetros de entrada. Estas procedures são mantidas no
provedor e quando solicitadas por uma aplicação ou usuário, são postas em execução. Dentro destas
procedures são usados comandos da linguagem Transact-SQL.
6.1.5 – VISÕES
Uma visão é o resultado de uma consulta SQL, gerada por instrução SELECT da linguagem Transact-
SQL.
As visões não são tabelas físicas. Estas são atualizadas sempre que as visões são colocadas em
execução. Portanto, quando criamos e gravamos uma visão, sempre serão atualizadas, de acordo com os
dados armazenados nas tabelas do banco de dados em questão.
6.1.6 – TRIGGERS
Uma trigger nada mais é do que uma rotina de programação que é disparada (executada)
automaticamente, diante de um cadastro, alteração e/ou exclusão de registros em uma tabela.
Para acessarmos o SQL-Server 2005 Express Edition, devemos acessá-lo no grupo de programas do
SQL, conforme mostrado abaixo:
Figura 7
Ao clicar na opção “SQL Server Management Studio Express”, surgirá então a seguinte tela:
Figura 8
Na tela acima, na janela “Connect to Server”, não se esqueça de informar o conteúdo para o campo
“Server name”, pois esta informação refere-se ao nome do servidor SQL instalado no seu computador.
Inclusive o nome que aparece no exemplo acima, com certeza será diferente no seu computador.
Por fim, para efetuar a conexão com o servidor SQL, clique no botão “Connect”. Surgirá então as
seguintes áreas do ambiente do SQL-SERVER:
Figura 9
Figura 10
Figura 11
• Para concluir a criação física do arquivo de banco de dados, basta clicar no botão “OK”.
Após seguir os passos descritos anteriormente, seu banco de dados será mostrado como nos
exemplos abaixo, indicados pelas setas:
Figura 12
Quando houver necessidade de copiarmos um banco de dados para outro servidor SQL, devemos
“atachá-lo” neste servidor. Os arquivos de log (.ldf), e do banco de dados (.mdf) devem ser copiados para o
computador, NA PASTA “C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data”, onde se encontra o
servidor SQL.
Figura 13
Figura 14
Siga os passos abaixo, a partir da janela mostrada acima, para “atachar” (puxar/fixar/carregar) o banco
de dados copiado anteriormente para a pasta do servidor SQL.
Figura 15
Obs.: Repare que a janela da mostrada, mostra todos os bancos de dados (arquivos .mdf), existentes
na pasta do servidor.
• Basta, então, selecionar o nome do banco de dados desejado e clicar no botão “OK”. Desta
forma o banco de dados aparecerá na janela “Object Explorer”.
Para criação de tabelas em um banco de dados é necessário abri-lo primeiramente. Faça isso clicando
no nome do banco de dados, mostrado na janela “Object Explorer”, conforme exemplo abaixo:
Para criar uma nova tabela em um banco de dados, siga os passos a seguir:
• clique com o botão direito do mouse no objeto “Table”;
• Surgirá um submenu, neste selecione a opção “New Table...”, conforme figura abaixo:
Figura 16
Figura 17
A área mostrada é usada para criar uma nova tabela. Nela indique:
Column Name: Nesta coluna você deve indicar os nomes dos atributos da entidade (Campos da
tabela) que serão criados.
Allow Nulls: Quando esta coluna apresentar uma marca de checagem indicará que o
atributo em questão aceitará gravação registros sem que o usuário tenha informado um dado qualquer para o
referido campo.
Para criar fisicamente a tabela, basta clicar no botão e indicar o nome da tabela na janela que
surgirá.
Após criar a tabela, quando necessário, será possível alterá-la. Para isto, basta clicar com o botão
direito do mouse sobre o nome da tabela, estando com a árvore de objetos “Table” aberta, no banco de dados
onde a mesma se encontra, conforme a figura abaixo:
Figura 18
Ao clicar na opção “Design” no submenu mostrado, a área estrutura da tabela será novamente
mostrada, para que se possa incluir, alterar ou excluir campos.
Figura 19
Na figura, foram selecionados para chave primária os atributos: “codigo" e “cpf”. Em seguida, foi clicado
no botão da chave, disposto na barra de ferramentas. Esses processos fizeram dos atributos indicados, chave
primária COMPOSTA da tabela.
Para exemplificar, vamos excluir alguns atributos da entidade “professores”. Veja como ficará o layout
da tabela:
Figura 20
O relacionamento entre tabelas normalizadas é outra importante operação disponível nos SGBD’s. No
SQL-SERVER, utilizaremos inicialmente o objeto “DIAGRAMS” para relacionar as tabelas do banco de dados.
Antes, porém, é importante citarmos os tipos de relacionamentos existentes entre tabelas de um banco
de dados, a saber:
1. 1..N: Um único registro da tabela PAI pode se relacionar com vários registros na tabela filho;
2. 1..1: Um único registro da tabela PAI pode se relacionar com um único registro na tabela filho;
3. N..N: Vários registros da tabela PAI poderão se relacionar com vários registros na tabela filho.
É importante ressaltar que este tipo de relacionamento não deve existir num banco de dados.
Para isso, devemos criar uma tabela de entidade de relacionamento, que fará com que a
relação se torne 1..n. Veremos a solução prática para este exemplo mais a frente;
IMPORTANTE:
1. PARA RELACIONAR DUAS OU MAIS TABELAS, NÃO DEVEM EXISTIR REGISTROS CADASTRADOS
NAS MESMAS.
Conforme descrito anteriormente, este tipo de relacionamento faz com que 1 registro da tabela Pai se
relacione com vários outros na tabela FILHO. Vejamos o exemplo na figura a seguir:
Figura 21
Figura 22
3. Se relacionamos as duas tabelas, veremos que o tipo de relacionamento será 1..N, conforme
mostrado na figura abaixo:
1
N
Figura 23
4. Na tabela FILHO, SE O CAMPO “CodProfessor” não fizesse parte da chave primária, o tipo de
relacionamento ainda sim seria 1..N. Conforme ilustra a figura abaixo:
Figura 24
Neste tipo de relacionamento teremos o campo chave primária da tabela PAI sendo também sendo o
campo chave da tabela FILHO, ou seja, o mesmo campo chave primária nas tabelas envolvidas no
relacionamento. Por esse motivo temos um único registro cadastrado somente uma vez em ambas as tabelas,
o que torna o relacionamento 1..1. Veja o exemplo mostrado na figura abaixo:
1 1
Figura 25
Este tipo de relacionamento não deve aparecer em banco de dados. Eles são “excluídos” devido à
necessidade de criação de uma tabela chamada “entidade de relacionamento”.
Uma entidade de relacionamento deve conter os campos chaves das tabelas que possuem o tipo de
relacionamento N..N. Com isso, relacionam-se as tabelas PAI e FILHO com esta entidade de relacionamento.
Figura 26
1 N
N 1
Figura 27
Figura 28
Após seguir os passos acima, veremos a janela do assistente de criação de relacionamentos, chamada
“Add Table”, conforme ilustra a próxima figura:
Figura 29
Usando a janela “Add Table” clique no botão “Add” para incluir as tabelas que serão relacionadas,
neste exemplo serão relacionadas todas as tabelas. Após adicionar todas as tabelas que serão relacionadas
entre si, basta clicar no botão “Close”, para fechar a janela “Add Table”. Veja o resultado na figura abaixo:
Figura 30
Se você notar que se esqueceu de relacionar uma tabela qualquer na área acima, clique com o botão
direito do mouse sobre a área onde as tabelas estão sendo mostradas, e em seguida clique na opção “Add
Table...”. Com isso você poderá inserir outras tabelas na área de diagramas acima.
Para relacionarmos as tabelas mostradas na área de diagramas, devemos arrastar O(S) CAMPO(S)
DA CHAVE PRIMÁRIA, DA TABELA PAI, para cima do(s) CAMPO(S) CHAVE ESTRANGEIRA na tabela
FILHO. Quando este processo for feito, surgirá a tela “Tables and Columns”, para definições gerais do
relacionamento que será criado:
Figura 31
Primary Key Table: Indica o nome da tabela PAI onde está a chave primária;
Foreign Key Table: Indica o nome da tabela FILHO onde se encontra a chave estrangeira;
Ao termino da indicação dos campos que serão relacionados, clique no botão “OK”. A janela será
fechada e a seguinte janela será mostrada:
Figura 32
Figura 33
Delete Rule: Com a opção “Cascade” selecionada, as exclusões de registros na tabela “PAI” excluirão
automaticamente registros relacionados na tabela “FILHO”.
Update Rule: Com a opção “Cascade” selecionada, as alterações em registros na tabela “PAI” alterarão
automaticamente registros relacionados na tabela “FILHO”.
O botão “OK”: este botão criará o relacionamento físico entre as tabelas PAI e FILHO. O tipo do
relacionamento será indicado AUTOMATICAMENTE, diante das definições de chave primária e estrangeiras,
nas tabelas PAI e FILHO.
Após o término das definições dos relacionamentos, criamos um relacionamento físico entre as tabelas,
conforme ilustra a próxima figura:
Figura 34
IMPORTANTE:
Tabela PAI: Refere-se à tabela que ENVIA dados para outra tabela da relação;
Tabela FILHO: Refere-se à tabela que RECEBE dados da tabela pai da relação;
Vale dizer que TODOS os relacionamentos devem ser criados, antes de gravá-los. No exemplo acima
criamos somente a relação entre as tabelas “professores” e “telefoneprofessor”. Poderíamos relacionar também
a tabela “univap” com a tabela “telefoneprofessor”.
Para gravar os relacionamentos criados, basta clicar no botão , disponível na barra de ferramentas
do SQL-SERVER. Dê o nome que desejar para os relacionamentos criados.
Depois de criados os relacionamentos entre as tabelas do banco de dados, você poderá gravar e
manipular registros nessas.
Baseado nas últimas tabelas, mostradas anteriormente nesta apostila, vamos cadastrar registros na
tabela “professores”, para isso siga os passos a seguir:
• Clique no objeto “Tables”, na árvore de objetos do SQL-SERVER, para que o SQL mostre
a árvore com nomes de todas as tabelas existentes no banco de dados desejado;
• Clique com o botão direito do mouse sobre o nome da tabela desejada;
• No submenu, clique sobre “Open Table...”, conforme ilustrado na figura abaixo:
Figura 35
Figura 36
Para ALTERAR um registro, basta clicar no campo do registro desejado e redigitar o dado. O simples
fato de passar para um próximo registro, fará com que a alteração seja concretizada.
Para EXCLUIR um registro, basta clicar na seta que aponta para o registro corrente e
pressionar a tecla “Delete”, no teclado do computador. Este processo irá excluir o registro da tabela.
Vamos esclarecer melhor os testes citados acima. Vamos observar os seguintes relacionamentos entre
as tabelas :
Figura 37
Agora vamos explicar na prática os testes de integridade, diante dos relacionamentos mostrados na
figura acima:
10 – VISÕES
Como dito anteriormente, cada banco de dados possui o objeto “VIEWS”. Esse objeto deve ser usado
para criarmos consultas a registros de uma tabela, utilizando a instrução “SELECT” da Transact-SQL.
O objeto VIEWS de um banco de dados, cria uma tabela TEMPORÁRIA, cujos registros armazenados
serão filtrados de tabela(s) do banco em uso.
No SQL-SERVER, poderemos usar o assistente de criações de visão. Para isso, devemos abrir o
banco de dados desejado. Em seguida, siga os passos ilustrados a seguir:
Figura 38
Figura 39
Onde:
- Faz uso da cláusula Group...By (será abordada posteriormente), na consulta SQL criada;
- Este botão é o mais importante da janela acima, pois ele permitirá escolhermos quais tabelas
físicas serão usadas para criação das consultas de registros.
Para ilustrar uma consulta criada pelo objeto VIEWS, vamos indicar uma tabela qualquer de um banco
de dados, por exemplo a tabela “professores”. Para isso, basta selecionarmos o nome da tabela na janela “Add
Table” e clicar no botão “Add”, conforme a figura a seguir:
Figura 40
Quando clicarmos no botão , a janela “Add Table” surgirá novamente, se estiver fechada. Então,
selecione o nome da tabela desejada e clique novamente no botão “Add”.
No exemplo acima, foi escolhida a tabela “professores”. Quando o botão “Add” foi clicado, a tabela foi
inserida na área de criação da visão, disposta atrás da “Add Table”. Caso necessário, você poderá utilizar,
numa só consulta, várias tabelas. Veremos mais adiante a utilidade de usarmos numa consulta várias tabelas.
Depois de inserida a tabela escolhida para consultas, podemos fechar a janela “Add Table” e
definirmos, por exemplo, quais os campos serão mostrados na consulta sql, bem como quais serão os critérios
de filtro de registros na tabela. Veja o exemplo a seguir:
Figura 41
No exemplo acima, indicamos na coluna “COLUMN”, quais os dados deveriam ser mostrados de cada
professor gravado, no caso: codigoprofessor e nomeprofessor. Isto pode ser feito clicando na caixa localizada
ao lado do nome do campo, na tabela exibida ( ).
Você deve ter reparado também, que após indicar cada campo na coluna “Column”, uma instrução
“Select” ia sendo criada automaticamente pelo SGBD.
Podemos criar banco de dados, tabelas e manusear registros utilizando linhas de comandos da
linguagem Transact-SQL. Tudo que foi mostrado até este ponto, nesta apostila, podemos fazer por meio de
comandos.
Vale dizer que no SQL-SERVER, assim como a maioria dos SGBD’s existentes, a linguagem usada
para criar banco de dados e tabelas, bem como manusear registros nessas estruturas é a SQL (Structured
Query Language).
Alguns sistemas de banco de dados usam o comando ALTER, que permite ao usuário alterar
um objeto, por exemplo, adicionando uma coluna a uma tabela existente.
COMMIT e ROLLBACK interagem com áreas de controle como transação e locação. Ambos
terminam qualquer transação aberta e liberam qualquer cadeado ligado a dados. Na ausência de um
BEGIN WORK ou uma declaração semelhante, a semântica de SQL é dependente da implementação.
Figura 42
Repare que ao clicar no botão “New Query”, foi aberta uma janela, mostrada acima pela seta em
vermelho.
Novos botões foram criados na barra de ferramentas, a fim de possibilitar a criação/uso de instruções
da Transact-SQL:
- Botão “Parse”: Usado para analisar a falta ou não de parâmetros de um comando SQL digitado;
- Botão ”Cancel Executing Query” – Usado para cancelar a execução de uma instrução que estiver
sendo executada;
Veja abaixo a figura que ilustra a execução de uma instrução SQL, que exibirá todos os dados de
professores, cadastrados na tabela “professores”, no banco de dados “UNIVAP”:
Figura 43
Repare que o SQL exibe o resultado da consulta num local chamado “painel de resultados”. Este painel
é visto na tela acima, apontado pela seta.
IMPORTANTE: O banco de dados “UNIVAP” deve ter sido selecionado antes de clicar no botão
“Execute”. Se isso não for feito, a instrução digitada poderá retornar mensagens de erros se não existir a tabela
e campos indicados nas referidas instruções Transact-SQL.
Podemos salvar os registros exibidos no painel de resultados quando está em forma de grid, a fim de
acessá-los em outros softwares. Para salvar o painel de resultados, basta clicar sobre qualquer linha de
registro exibida e seguir os seguintes passos:
Figura 44
File Name: Local onde você deve definir o nome do arquivo que armazenará o resultado exposto no
grid;
Save Type: Determina o tipo de arquivo que será criado. Normalmente para acessarmos estes dados
por outros programas, podemos gravar os resultados do painel de resultados em formato TEXTO. Nesta caixa
estão disponíveis outros tipos de arquivos, tais como “SQL files”, “Text Files” ou “All Files”.
Botão “Save”: Por fim, clique neste botão para o arquivo ser gerado fisicamente.
Podemos criar/executar/excluir/alterar uma visão por meio de comandos. Estes devem ser utilizados na
área de edição de comandos SQL, depois de clicado o botão “New Query”.
Por exemplo, vamos criar uma Visão para exibirmos todos os dados de professores cadastrados, que
possuam a idade superior ou igual há 30 anos. Para isso, digite o comando conforme exemplo a seguir e
pressione o botão “Execute”:
Figura 45
Quando a sintaxe digitada estiver correta e o botão “Execute” for pressionado, a mensagem
“Command(s) completed successfully” aparecerá no painel de resultados, conforme visto na figura acima.
Podemos alterar ou excluir uma visão criada, para isso devemos usar os comandos Alter View ou Drop
View, respectivamente.
No comando Alter View, deveremos digitar novamente todos os comandos que irão compor a “Visão”.
Para isto usaremos a seguinte sintaxe:
Baseado no exemplo da última figura se desejasse alterar a visão criada, por exemplo, para
selecionarmos todos os dados de professores que tivessem idade INFERIOR a 30 anos, escreveríamos o
seguinte comando:
Para excluir uma visão por meio de comando, basta usar a seguinte sintaxe:
Se desejarmos apagar, por exemplo, a “View” criada nos exemplos anteriores, basta digitarmos:
Para visualizarmos os registros filtrados por uma visão anteriormente criada, basta seguir os passos
ilustrados na figura a seguir:
Figura 46
Serão mostrados os registros filtrados pela instrução SELECT criada dentro da View, conforme mostra
a seta na figura acima.
O resultado exibido na figura anterior pode ser gravado da mesma forma que um resultado de
instruções digitadas na área de edição de comandos. Para isso, siga os passos descritos no item 11.1 desta
apostila.
Podemos usar os assistentes para criar, alterar e excluir “Visões”, como vimos anteriormente.
No SQL-SERVER é possível criar banco de dados, tabelas, relacionamentos entre as mesmas, gravar
registros, excluí-los, alterá-los e consultá-los, tudo através de instruções a linguagem SQL ((Structured Query
Language), conhecida como TRANSACT SQL.
Como citado anteriormente, os comandos da Transact SQL são divididos em grupos, conhecidos como
DDL (DATA DEFINITION LANGUAGE) e DML (DATA MANIPULATION LANGUAGE).
Exemplo:
Create database LOJA
Quando for executado o comando acima, serão criados fisicamente os arquivos .MDF e .LOG,
referentes ao banco de dados LOJA. Os arquivos serão criados automaticamente, pelo SQL SERVER, na
pasta do servidor. Após a execução do comando acima será exibida a seguinte mensagem:
Quando necessário, podemos utilizar o comando DROP DATABASE, para excluir fisicamente um
banco de dados existente.
Sintaxe:
Exemplo:
Drop database loja
È importante salientar que ao excluir um banco de dados, todo seu conteúdo também será excluído, ou
seja, tabelas, registros, visões, stored procedures, triggers e etc, serão perdidos com a exclusão.
Sintaxe:
Exemplo 1:
Create table cliente
(
Codcli int primary key not null,
Nomecli char(30) not null,
Endcli varchar(40),
Telcli varchar(25)
)
No exemplo acima está sendo criada a tabela cliente. Os campos desta tabela serão: Codcli do tipo
inteiro, será chave primária e exigirá dados no momento do cadastro de um registro; Nomecli do tipo caracter,
armazenará 40 dígitos, também exigirá dados no momento da gravação do registro; endcli do tipo varchar,
capaz de armazenar no máximo 40 dígitos no momento da gravação de um registro, porém, não é um campo
de preenchimento obrigatório; telcli do tipo varchar, capaz de armazenar no máximo 25 caracteres no momento
da gravação de um registro, porém, não é um campo de preenchimento obrigatório.
IMPORTANTE: no exemplo acima somente o campo codcli é chave primária da tabela cliente.
Exemplo 2:
Create table depentedentecliente
(
Codcli int not null,
Coddependente int not null,
Nomedep char(40),
Idadedep int,
Primary key (codcli, coddependente)
)
IMPORTANTE: no exemplo acima, repare que os campos codcli E coddependente compõem a chave
primária desta tabela. As demais definições são as mesmas do exemplo 1. Portanto, sempre que uma tabela
possuir mais de um campo compondo a chave primária, a definição deve ser feita como no exemplo acima.
Para alterarmos a estrutura de uma tabela criada usaremos o comando ALTER TABLE.
Sintaxe:
Para excluir um campo de uma tabela:
ALTER TABLE <nome_da_tabela_existente>
DROP COLUMN <nome_campo>
OU
Sintaxe:
Para adicionar um campo na tabela:
ALTER TABLE <nome_da_tabela_existente>
ADD <nome_campo> <tipo_dado>
OU
Sintaxe:
Para alterar o TIPO DE DADO de um campo da tabela
ALTER TABLE <nome_da_tabela_existente>
ALTER COLUMN <nome_campo> <tipo_dado>
OU
Sintaxe:
Para renomear um campo da tabela usa-se o MÉTODO SP_RENAME:
SP_RENAME ‘<nome_tabela>.<nome_antigo_campo>’ , <novo_nome_campo>
OU
Sintaxe:
Para inserir uma chave primária numa tabela criada anteriormente:
ALTER TABLE <nome_da_tabela_existente>
ADD CONSTRAINT <nome_chave> PRIMARY KEY (<nome_campo>)
OU
Sintaxe:
Para excluir uma chave primária numa tabela criada anteriormente:
ALTER TABLE <nome_da_tabela_existente>
DROP CONSTRAINT <nome_chave>
OU
Sintaxe:
Para inserir uma chave estrangeira numa tabela criada anteriormente:
ALTER TABLE <nome_da_tabela_filho_jacriada >
ADD FOREIGN KEY (<nome_campo_chaveestrangeira>)
REFERENCES <nome_tabela_pai> ( <chave_primaria_tabela_pai> )
ON DELETE CASCADE
ON UPDATE CASCADE
Exemplo 1:
Alter table cliente
drop column telcli
Exemplo 2:
Alter table cliente
add telefonedocli varchar(25)
Neste exemplo está sendo adicionado na tabela cliente o campo chamado telefonedocli, tipo varchar
de 25,
Exemplo 3:
alter table cliente
alter column telcli varchar(20)
Neste exemplo está sendo alterado o tipo de dado do campo telcli para varchar(20)
Exemplo 4:
SP_RENAME 'CLIENTE.telcli' , telefonecli
Neste exemplo está sendo renomeado o campo telcli, da tabela cliente, para telefonecli. Neste caso
repare que não foi usada a instrução alter table, mas sim o MÉTODO SP_RENAME.
Exemplo 5:
alter table Vendas
add constraint chave PRIMARY KEY (nvenda, codcli)
Neste exemplo está sendo criado na tabela copiavendas a chave primaria composta chamada “chave”,
pois os campos nvenda e codcli compõem a chave primária. OBS: PARA O COMANDO ACIMA FUNCIONAR,
OS CAMPOS NVENDA e CODCLI DEVEM TER SIDO CRIADO ANTERIORMENTE COM A PROPRIEDADE
NOT NULL.
Exemplo 6:
alter table Vendas
drop constraint chave
Neste exemplo está sendo excluída a chave primária que foi criada no exemplo anterior. A chave
primária possui o nome “chave”.
Exemplo 7:
alter table vendas
add foreign key (codcli) references cliente(codcli)
on delete cascade on update cascade
Neste exemplo está sendo criada uma chave estrangeira para a tabela vendas e relacionando-a com a
tabela cliente. As cláusulas “on delete cascade” e “on update cascade” são opcionais.
Para exclusão de uma tabela de um banco de dados usamos o comando Drop table.
Sintaxe:
Exemplo:
Drop table cliente
No exemplo acima a tabela cliente está sendo excluída de um banco de dados em uso.
No momento da criação de uma tabela FILHO, em uma relação, poderemos definir o relacionamento
dessa com a tabela pai. Para isso usamos a seguinte cláusula no comando create table:
Sintaxe:
Para criar uma tabela FILHO numa relação, É NECESSÁRIO CRIAR ANTES A TABELA PAI, pois,
como é percebido na sintaxe, será necessário referenciar a tabela pai criada anteriormente.
Exemplo 1:
Create table cliente
(
Codcli int primary key not null,
Nomecli char(30) not null,
Endcli varchar(40),
Telcli varchar(25)
)
Para visualizarmos o relacionamento criado entre as tabelas criadas acima, deveremos abrir o banco
de dados e o diagrama. Você irá perceber que ao abrir o objeto “diagrams” no banco de dados, não existirá
nenhum diagrama de relacionamento disponível. PORÉM, faça uso dos passos indicados no item 7.5.4 desta
apostila, para visualizar as tabelas já relacionadas. Após adicionar as tabelas na área de relacionamento você
irá visualizar o relacionamento. Em seguida, basta gravá-lo fisicamente. Se tudo der certo você verá o seguinte
resultado:
Figura 47
Exemplo 2: Neste exemplo, vamos incluir uma nova tabela no relacionamento feito no exemplo 1. A
tabela abaixo irá receber dados da tabela produtoscliente. Pelo fato da tabela produtoscliente possuir uma
chave primária COMPOSTA, a tabela filho, que será criada com o comando mostrado abaixo, deve referenciar
a chave composta da tabela pai. Vejamos:
OBSERVAÇÃO: LEMBRE-SE QUE VOCÊ DEVERÁ ADICIONAR ESTA ÚLTIMA TABELA NO DIAGRAMA JÁ
CRIADO. Para isso, primeiramente abra novamente a área “Database Diagrams” do banco de dados. Em
seguida, pressione o BOTÃO DIREITO DO MOUSE sobre qualquer local da área que exibe as tabelas já
relacionadas. No submenu que irá surgir, selecione a opção “Add Table...”, conforme figura a seguir:
Figura 48
Surgirá a janela “Add Table”. Se a janela não exibir o nome da última tabela criada, pressione o botão
“Refresh”. A janela deverá ter a seguinte aparência:
Figura 49
Após clicar no botão “Add” o diagrama de relacionamento deverá ser atualizado, conforme a figura a
sseguir:
Figura 50
Sintaxe:
Onde:
Valor_inicial: indica o valor para o primeiro registro gravado;
Incremento: indica qual o valor será acrescido para cada registro gravado
Exemplo: No exemplo abaixo indicamos que no campo aluno_id iniciará com 1, quando o primeiro
registro for gravado. A partir daí, sempre que um novo registro for cadastrado, será somado automaticamente 1
no campo aluno_id, fazendo com isso, que nunca se repita os números de identificação de alunos na tabela.
O exemplo acima, foi criado o campo aluno_id, na tabela aluno. Quando desejar gravar um registro na
tabela aluno, NÃO SERÁ NECESSÁRIA a indicação do dado para o campo aluno_id, pois, como descrito
anteriormente, o próprio sistema irá gerar o número do aluno automaticamente. Veja abaixo o exemplo de
como os registros devem ser cadastrados na tabela aluno:
Figura 51
Para os exemplos dos comandos da DML, devemos conhecer os tipos de dados de cada campo. Por
esse motivo o diagrama de relacionamento das tabelas foram mostradas acima no modo STANDARD.
O comando Insert é usado para gravar registro numa tabela do banco de dados ativo.
Sintaxe:
Exemplo 1:
insert into cliente (codcli, nomecli, endcli, telefonecli)
values ( 1, 'joão da silva', 'rua JK 127', '(012) 3939-3021' )
Neste exemplo estamos cadastrando o cliente com o código 1, nome joão da silva, que reside à rua JK
127, com o telefone (012) 3939-3021, na tabela cliente.
OBSERVAÇÃO: A ordem dos dados indicados dentro da cláusula values, deve obedecer à mesma
ordem dos campos descritos após o nome da tabela. No exemplo acima descrevemos o campo codcli para
receber o número 1 e assim sucessivamente.
Exemplo 2:
insert into cliente values ( 1, 'joão da silva', 'rua JK 127', '(012) 3939-3021' )
Neste exemplo, repare que foram omitidos os nomes de campos que receberão os dados descritos na
cláusula values. Com isso, os dados serão gravados respectivamente obedecendo à ordem de criação dos
campos na tabela, ou seja, codcli, nomecli, endcli e telefonecli. Para usar esta sintaxe, o usuário deve conhecer
a ordem dos campos na tabela.
Exemplo 3: Vamos supor que tenha sido criada a tabela clientetemporario e que esta não tenha sido
relacionada a nenhuma tabela. Logo em seguida, usando o comando Insert, gravamos 4 registros de clientes.
Vejamos:
create table clientetemporario
(
codcliT int primary key,
nomecliT char (30)
)
Agora vamos fazer outro teste, cadastrando todos os professores da tabela clientetemporario, na tabela
cliente. Vale lembrar que os campos das duas tabelas devem possuir tamanhos e tipos IDÊNTICOS. Veja o
exemplo abaixo:
IMPORTANTE: Nos dois últimos exemplos, torna-se necessária a indicação dos nomes de campos que
RECEBERÃO os registros filtrados da tabela clientetemporario, isto porque as tabelas não possuem a mesma
quantidade de campos.
Após a execução de um dos dois últimos exemplos, os registros serão gravados da seguinte forma, na
tabela cliente:
Repare que os registros de clientes com código maior ou igual a 2, não possuem endereços
residenciais e telefones, isto porque na tabela clientetemporario estes dados não existem.
Exemplo 4:
Insert into datacomprasprodutos values (‘12/31/08’, 1, 1020)
A seguir estão dispostos a relação dos operadores ARITIMÉTICOS, LÓGICOS E RELACIONAIS, mais
utilizados na linguagem Transact-SQL.
OPERADOR UTILIDADE
RELACIONAL
OPERADOR UTILIDADE = Igual
ARITMÉTICO <> Diferente
* Multiplicação > Maior que
+ Soma < Menor que
/ Divisão >= Maior ou igual
- Subtração <= Menor ou igual
% Módulo !< Não menor que
|| Concatenação !> Não maior que
!= Não igual
OPERADOR UTILIDADE
LÓGICO
Not Inverte o valor booleano
And E
Or Ou
Between Entre
Like Usado para encontrar padrões de strings
IN Usado para verificar se conteúdo do campo possui algum valor estipulado
UPTADE <nome_tabela>
SET <nome_campo> = <novo_valo>
WHERE <critérios_para_alteração>
Exemplo 1:
Update cliente
Set endcli = ‘nenhum’
O exemplo acima irá alterar os endereços de TODOS os clientes para ‘nenhum’, isto porque não foram
definidos critérios (CONDIÇÕES) para indicar quais os registros seriam alterados.
Exemplo 2:
Update cliente
Set endcli = ‘Rua da morte’
Where codcli = 1
O exemplo acima irá alterar somente o endereço do cliente que possui o código igual a 1, para ‘Rua da
morte’.
Exemplo 3:
Update cliente
Set endcli = ‘Rua JK’ , telefonecli = ‘(012) – ‘
Where codcli = 1
O exemplo acima altera o endereço do cliente para ‘Rua JK’ e o telefone do cliente para ‘(012) – ‘, do
cliente cujo código é 1.
Os operadores Relacionais, Lógicos e Aritméticos que podem ser utilizados em instruções Transact-
SQL estão relacionados no item 13.2 desta apostila.
Sintaxe:
Exemplo 1:
Delete from produtos
Where nomeproduto like ‘a%’
No exemplo acima serão excluídos da tabela produtos, todos os produtos cujo nome inicie com a letra
“a”.
Perceba que não foi informado nenhum nome de campo após o comando delete, antes da cláusula
“from”, pois, o comando delete exclui o registro TODO e não somente o conteúdo de um campo da tabela.
Poderemos usar outros CURINGAS juntamente com o operador LIKE, vejam alguns exemplos:
Nomecli Like ‘a[ul]ber[sc]on%’ Filtra registros que nomecli inciem com a letra “a”; o
segundo dígito seja “u” OU “l”; a partir do 3º dígito
contenha a seqüência “ber”; 6º dígito seja “s” OU “c”;
7º e o 8º dígito sejam “on” e que terminem com
quaisquer outros caracteres.
Nomecli like ‘%e%’ Filtra registros que nomecli contenha a letra “e”
disposta em qualquer local da string gravada
Nomecli like ‘%e’ Filtra registros que nomecli termine com a letra “e”
Nomecli like ‘e%’ Filtra registros que nomecli inicie com a letra “e”
Nomecli like ‘[a – c]%’ Filtra registros que nomecli inicie com qualquer
caractere entre as letras “a” e “c”
Nomecli like ’joão’ Filtra registros que nomecli seja EXATAMENTE igual
a “joão”, pois o curinga % não foi utilizado na sintaxe.
É bom dizer que o operador like pode ser usado em qualquer instrução SQL QUE POSSUA A
CLÁUSULA WHERE e que o campo usado para filtro SEJA DO TIPO CHAR ou VARCHAR.
Este comando é um dos comandos mais utilizados no SQL, pois é usado para filtrar registros de uma
ou várias tabelas provendo com isso a criação de uma nova tabela temporária na memória do computador.
Sintaxe 1 :
Exemplo 1:
Select * from cliente
Mostrará codigo, nome, endereço e telefone de todos os clientes cadastrados. O “*”substitui o nome de
todos os campos no exemplo acima. Pelo fato do exemplo não conter cláusula WHERE, todos os registros
serão mostrados para o usuário.
Exemplo 2:
Select nomecli, codcli from cliente where endcli = ‘Rua JK’ and telefonecli like ‘012%’
O exemplo acima exibirá nome(s) e código(s) do(s) cliente(s) que resida(am) na ‘Rua JK’ E QUE O
telefone inicie com ‘012’. A ordem de exibição dos campos será nome do cliente e código do cliente.
Para os novos exemplos de instruções SQL, iremos usar as seguintes tabelas relacionadas:
Figura 52
Este parâmetro é usado com o comando SELECT. O distinct retorna somente registros diferentes de
uma coluna da tabela.
Exemplo:
Select distinct datavenda from vendas
O exemplo acima mostrará somente data de vendas DIFERENTES, gravadas na tabela vendas.
Lembre-se que várias vendas são realizadas numa data. Se o distinct não fosse usado, as datas de vendas
apareceriam várias vezes, pois corresponderiam as vendas efetuadas para cada dia.
Este parâmetro é usado com o comando SELECT para ordenar os registros filtrados. Podemos ordenar
os registros por vários campos filtrados de maneira ascendente (crescente) ou descendente (decrescente).
Exemplo:
Select * from cliente where idadecli between 15 and 21 order by idadecli asc, nomecli desc
O exemplo acima irá mostrar todos os dados do cliente que possui idade entre 15 e 21 anos
(BETWEEN). Neste caso, os registros filtrados serão ordenados primeiramente pela idade, de forma crescente.
Caso existam clientes com a mesma idade, os registros serão ordenados pelo nome do cliente, de forma
decrescente.
14.3 – UNION (UNINDO CAMPOS DE VÁRIAS TABELAS NUMA CONSULTA – ASSOCIAÇÃO INTERNA)
Usando o comando SELECT podemos filtrar vários dados de diversas tabelas, usando somente uma
instrução SELECT para filtrar registros.
Exemplo 1:
Select CLIENTE.nomecli, PRODUTOSVENDIDOS.*, VENDAS.*, PRODUTOS.nomeproduto
From cliente, produtosvendidos, vendas, produtos
Where VENDAS.nvenda = 1 AND VENDAS.codcliente = CLIENTE.codcli AND
PRODUTOSVENDIDOS.nvenda = VENDAS.nvenda AND
PRODUTOSVENDIDOS.codproduto = PRODUTOS.codproduto
Exemplo 2:
Select CLIENTE.nomecli, VENDAS.codcliente, VENDAS.nvenda
From cliente, vendas
Where VENDAS.nvenda = 1 AND VENDAS.codcliente = CLIENTE.codcli
Assim como em qualquer linguagem, a transact-SQL nos permite efetuar cálculos durante a execução
de comandos.
com isso o acréscimo de 10%. É importante dizer também que o valorvenda, GRAVADO FISICAMENTE, não
é alterado, pois, o comando utilizado acima foi SELECT.
14.5 – FUNÇÕES
Além de podemos escrever nossas expressões na própria linha de comando SQL, podemos também
usar diversas funções existentes na SQL.
As funções mais importantes, utilizadas pela transact-SQL são as seguintes:
Exemplos:
No exemplo acima todos os subtotais gravados serão arredondados para cima. Em seguida, serão
mostrados todos os códigos de produtos e o resultado arredondado dos subtotais, calculados para cada
produto. Pelo fato de não existirem critérios de filtros, todos os registros serão exibidos. O resultado
arredondado será armazenado na coluna “Sub Total Arredondado”.
No exemplo acima todos os subtotais gravados serão arredondados para baixo. Em seguida, serão
mostrados todos os códigos de produtos e o resultado arredondado dos subtotais, calculados para cada
produto. Pelo fato de não existirem critérios de filtros, todos os registros serão exibidos. O resultado
arredondado será armazenado na coluna “Sub Total Arredondado”.
No exemplo acima, a quantidade vendida gravada, será convertida para valor absoluto, ou seja, não
poderá ser exibida uma quantidade negativa. Os valor ABSOLUTO (ABS()) serão armazenados na coluna
“Quantidade Vendida” na tabela temporária.
No exemplo acima está sendo criada uma coluna na tabela temporária chamada “valor”. Todos os
valores de vendas, gravados na tabela produtosvendidos, serão mostrados com 10 números antes da
vírgula (se existirem) e com 2 casas decimais.
Exemplos:
O exemplo acima irá mostrar nome do produto após a mensagem “Produto:”. Todos os produtos
cadastrados serão exibidos, pelo fato de não terem sido definidos critérios na cláusula WHERE. Veja
abaixo como os registros poderão ser exibidos:
Produto :café
Produto :leite
O exemplo acima irá mostrar uma coluna chamada “Produto” e nela serão exibidos todos os nomes de
produtos em letras minúsculas.
O exemplo acima irá mostrar uma coluna chamada “Produto” e nela serão exibidos todos os nomes de
produtos em letras maiúsculas.
O exemplo acima irá retirar os espaços à esquerda dos endereços de clientes e os exibirá numa coluna
chamada “endereço”.
O exemplo acima irá retirar todos os espaços à direita dos endereços de clientes gravados e os exibirá
numa coluna chamada “endereço”.
O exemplo acima irá procurar pela letra s em qualquer parte de cada endereço de cliente cadastrado
na coluna endcli. Caso a letra “s” seja encontrada, será retornado o número da posição da mesma no
endereço. Se não for encontrada a letra “s” no endereço de cada cliente, será retornado 0.
O exemplo acima mostrará o nome do cliente 1 invertido. O resultado será mostrado numa coluna
chamada “Nome Invertido”.
posições definidas, poderão ser retornados somente espaços em branco ou parte do que se imaginava
buscar.
O exemplo acima irá retornar 3 caracteres, a partir da posição 5, do nome da cidade dos clientes,
gravados na coluna cidadecli.
O exemplo acima irá trocar “A” por “Ca”, na coluna nomecli na tabela cliente.
O exemplo acima está adicionando 1 ano na data da venda de todos os registros gravados em vendas.
É bom lembrar que fisicamente as datas da venda dos registros gravados continuarão as mesmas.
Somente na tabela temporária a data será exibida com o ano adicionado.
b) Select getdate()
O exemplo acima criar 3 colunas na tabela temporária, a saber: ano, mês e dia. Respectivamente,
nestas colunas, serão armazenados o ano, o mês e o dia das datas gravadas na coluna datavenda na
tabela vendas. Serão exibidos ano, mês e dia de todas as vendas gravadas, pois não existem critérios
definidos na cláusula WHERE.
Funções Agregadas:
Exemplos:
O exemplo acima irá mostrar, numa coluna chamada “Média”, a média de todos os valores gravados na
coluna subtotal na tabela produtosvendidos. Caso fosse definido algum critério de seleção na cláusula
WHERE, a média seria somente dos registros filtrados pela condição.
O exemplo acima irá mostrar, numa coluna chamada “Total Faturado”, o somatório de todos os valores
gravados na coluna subtotal na tabela produtos vendidos. Caso fosse definido algum critério de seleção na
cláusula WHERE, o somatório seria somente dos registros filtrados pela condição.
O exemplo acima irá retornar na coluna “Quantidade Vendas” quantas vendas estão gravadas na
tabela vendas.
O exemplo acima irá retornar a quantidade de números de vendas gravadas na coluna nvenda na
tabela vendas. O resultado retornado será exibido na coluna “Quantidade Vendas!”
O exemplo acima retornará o preço do produto mais barato gravado no campo valorvenda, na tabela
produtos. O preço será exibido numa coluna chamada “Preço”. Pelo fato de não existirem critérios definidos
na cláusula WHERE, todos os valores de vendas gravados no campo valorvenda serão avaliados para que
seja filtrado o MENOR valor.
O exemplo acima mostrará qual o maior valor de venda gravado no campo valorvenda, na tabela
produtos. O maior valor será exibido numa coluna chamada “PREÇO”. Pelo fato de não existirem critérios
definidos na cláusula WHERE, todos os valores de vendas gravados no campo valorvenda serão avaliados
para que seja filtrado o MAIOR valor.
O exemplo acima mostrará o total da venda 1 acrescentado de 10%. Repare que foi feita a soma de
todos os subtotais da venda 1 e em seguida, foram acrescidos os 10%. Neste caso a somatória (Sum()), foi
feita somente sobre os subtotais da venda 1, conforme definido no critério WHERE.
O exemplo acima irá contar quantos números de vendas DIFERENTES existem na tabela produtos
vendidos. O resultado da contagem será mostrado num campo da tabela temporária chamado “Quantidade
de Vendas”. Lembre-se que na tabela produtosvendidos, para cada produto vendido numa venda o número
dessa é gravado novamente, gerando-se desta forma redundâncias necessárias, pois com isso, estamos
relacionando os produtos de cada venda.
Este operador é útil na cláusula WHERE, pois, ele permite testar diversos valores definidos numa lista
para um campo da tabela.
Exemplo:
O exemplo acima irá mostrar todos os dados dos clientes cujos códigos sejam 1 OU 2 OU 9. Neste
caso o operador IN está substituindo o operador OR, que tornaria a sintaxe muito mais extensa.
14.7 – SUBCONSULTAS
OPERADOR UTILIDADE
> ALL Se o campo armazena registros maiores que todos os elementos da subconsulta
< ALL Se o campo armazena registros menores que todos os elementos da subconsulta
Se o campo armazena registros diferentes de todos os elementos da subconsulta (o
<> ALL
mesmo que NOT IN)
Se o campo armazena registros iguais a algum dos elementos da subconsulta (o
= ANY
mesmo que IN)
> ANY Se o campo armazena registros maiores que algum dos elementos da subconsulta
< ANY Se o campo armazena registros menores que algum dos elementos da subconsulta
Se o campo armazena registros diferentes de algum dos elementos da subconsulta
<> ANY
(falso se igual a todos)
Se campo armazena registros com valores iguais a algum dos elementos da
IN
subconsulta
Exists Verifica se a subconsulta gerou registros
Exemplos:
Repare neste exemplo que estamos buscando o nome do produto na tabela produtos. Portanto, as 3
condições escritas na cláusula WHERE deverão acontecer, para que os registros sejam exibidos. O trecho
em VERMELHO é uma condição que informa a ligação entre as tabelas produtosvendidos e produtos, ou
seja, somente os nomes de produtos vendidos na venda 1 deverão ser mostrados juntamente no resultado
retornado pelo comando select.
O exemplo acima só irá excluir o registro da venda 1, na tabela vendas SE NÃO EXISTIREM produtos
vendidos desta venda gravados na tabela produtosvendidos. O comando acima trata de uma regra de
integridade de dados vista no início desta apostila, ou seja, só podemos apagar registros de uma tabela pai
se, e somente se, na tabela filho (produtosvendidos) tais registros não forem utilizados.
d) update produtosvendidos
set produtosvendidos.valorvenda = produtos.valorvenda
from produtos, produtosvendidos
where produtosvendidos.codproduto = produtos.codproduto
and exists (select * from produtosvendidos)
O exemplo anterior mostra o uso da cláusula FROM no comando UPDATE. O uso da cláusula FROM
foi necessário neste exemplo porque os valores de vendas dos produtos, gravados na tabela
produtosvendidos, deveriam ser atualizados para os mesmos valores gravados no campo valorvenda, na
tabela produtos. Outra observação importante refere-se ao fato de que a alteração só será executada se
existirem registros na tabela produtosvendidos (CONDIÇÃO EXISTS, DA CLÁUSULA WHERE).
O exemplo mostrará números de venda e o código dos clientes, gravados na tabela vendas,
SOMENTE DOS clientes cadastrados na tabela cliente. Lembre-se que ao usar o operador IN, todos os
valores inseridos dentro dos parênteses, servirão de parâmetros dos filtros de registros na tabela vendas,
ou seja, neste caso todos os códigos de clientes filtrados na tabela cliente, servirão para filtrar os registros
de vendas efetuadas para esses clientes.
Conforme definição do operador “=ANY”, mostrada na tabela no início deste item da apostila, sua
utilização têm a mesma função que o operador IN. Portanto, o comando acima realizará a mesma consulta
do exemplo dado na letra “e”.
Este recurso é muito utilizado em instruções SQL. Determinando apelidos para tabelas diminuiremos
bastante o tamanho das instruções escritas. Vejam o exemplo abaixo:
Neste exemplo estamos apelidando as tabelas Vendas com “V” e cliente com “C”. Dessa forma, toda
vez que desejarmos referenciar tais tabelas nas cláusulas das instruções, basta usarmos “V” ou “C”. Os
apelidos são determinados na cláusula FROM, portanto, será possível apelidarmos as tabelas somente em
instruções que fazem uso dessa cláusula.
IMPORTANTE:
• OS APELIDOS SÃO GERALMENTE UTILIZADOS PARA SIMPLIFICAR A INSTRUÇÃO,
REDUZINDO O CÓDIGO ESCRITO.
• GERALMENTE SÃO USADOS EM COMANDOS QUE FILTRAM DADOS DE DIVERSAS TABELAS,
COMO EXEMPLO DADO ACIMA QUE FILTRA DADOS DAS TABELAS “CLIENTE” E “VENDAS”.
A cláusula GROUP BY é utilizada geralmente para agrupar registros filtrados por uma instrução
SELECT. Geralmente utiliza-se o GROUP BY em conjunto com as funções AGREGADAS (MIN, MAX, SUM,
AVG e COUNT)
Já a cláusula HAVING deve ser usada em conjunto com a cláusula GROUP BY.
A cláusula HAVING tem a mesma função da cláusula WHERE , PORÉM as condições estabelecidas
na HAVING agirão sobre os registros AGRUPADOS, ou seja, depois do agrupamento dos registros filtrados.
Exemplos:
O exemplo irá contar e mostrar quantas vendas foram efetuadas para cada cliente. Primeiramente o
comando agrupa todos os códigos de clientes, em seguida, realiza-se a contagem de registros em cada
grupo, por fim, serão exibidos o código de cada cliente e a quantidade de vendas efetuadas para cada um
deles (Qtde vendas para cliente). LEMBRE-SE que na função COUNT não é necessário a indicação do
nome de um campo, pois a mesma contará REGISTROS.
Este exemplo agrupa os registros gravados na tabela produtosvendidos pelo nvenda. Em seguida, é
realizada a soma de todos os subtotais de cada venda. Por fim, são exibidos todos os nvendas agrupados
com seus devidos totais calculados.
Repare que no exemplo acima fazemos uso da cláusula WHERE. Com isso, será filtrados
primeiramente os registros de produtosvendidos que relacionam vendas do produto 1. Em seguida, os
registros filtrados serão agrupados pelo número da venda. Dessa forma, serão exibidos o somente o total
arrecadado com vendas do produto 1 em todas as vendas.
O exemplo acima mostra a média de idade de clientes de cada cidade cadastrada na tabela cliente.
Primeiro os registros são agrupados por cidade, em seguida, é calculado a média aritmética das idades dos
clientes ligados a cada grupo de cidade. Por fim, será exibido o nome da cidade com sua a devida média de
idade de clientes.
Neste exemplo, o nome da cidade e média de idade de clientes, serão exibidos somente se a média de
idade dos clientes for igual o superior a 18 anos. Percebam que neste exemplo a cláusula HAVING foi
usada. Isso fará com que após o agrupamento e o cálculo da média de idade, seja feito um filtro dos
registros.
Neste exemplo perceba que ANTES de agrupar os registros e calcular a média de idade dos clientes,
foi realizado um filtro de registros, de tal forma que a média de idade dos clientes de cada cidade fosse
calculada somente entre os clientes com no mínimo 18 anos. O nome da cidade e a média de idade de
clientes só será exibida se a média calculada estiver entre 20 e 30 anos, pois o critério definido na cláusula
HAVING fará o filtro após o agrupamento.
O uso do TOP em um comando SELECT fará com que sejam mostrados certo número de registros do
início ou do final da tabela em questão, especificado pela cláusula ORDER BY.
Torna-se necessário informar que você poderá exibir também uma porcentagem de registros diante
dos registros que seriam filtrados. Neste caso deverá usar PERCENT junto ao predicado TOP.
Exemplos:
O exemplo mostrará o número da venda cujo total é o MAIOR entre os gravados na tabela vendas.
Veja que as vendas foram ordenadas pelo totalvenda de forma decrescente. Com isso o predicado TOP
forçará a exibição da primeira venda que possui o maior valor. Ressalta-se que se que se vários totais de
vendas possuírem o maior valor, ou seja, possuírem o mesmo totalvenda, todas serão exibidas, apesar da
sintaxe solicitar somente a primeira (Top 1).
Já o exemplo acima, mostrará o número da venda cujo total vendido é o MENOR entre os gravados na
tabela vendas. Veja que as vendas foram ordenadas pelo totalvenda de forma crescente. Com isso o
predicado TOP forçará a exibição da primeira venda que possui o menor valor. Ressalta-se que se vários
totais de vendas possuírem o menor valor, ou seja, possuírem o mesmo totalvenda, todas serão exibidas,
apesar da sintaxe solicitar somente a primeira (Top 1).
Será mostrado somente o número da venda de 50% das piores vendas efetuadas, ou seja, com
menores totalvenda gravados na tabela vendas.
15 – STORED PROCEDURE
Uma Stored Procedure nada mais é do que uma rotina de programação escrita em Transact-SQL, que
pode ser executada manualmente por um usuário do banco de dados ou até mesmo ser chamada por um
programa qualquer.
Uma Stored Procedure pode ou não receber parâmetros de entrada e retornam resultados para o
programa ou usuário que a pôs em execução.
IMPORTANTE: COM EXCEÇÃO DOS COMANDOS CREATE, usados para criar estruturas gerais
(banco, tabelas, stored procedures e triggers), praticamente qualquer comando SQL pode ser utilizado em
uma Stored Procedure.
Uma Stored Procedure pode ser criada através de linhas de comandos ou com o auxílio de assistentes
do SQL Server.
Para criar uma Stored Procedure usando o assistente, siga os seguintes passos:
1) Abra a árvore de objetos do banco de dados onde você deseja criara Stored Procedure. POR
EXEMPLO:
2) Abra o objeto “Programmability” e em seguida clique com o botão direito do mouse sobre o objeto
“Stored Procedure”, conforme figura abaixo:
Figura 53
3) Clique na opção “New Stored Procedure...” mostrada na figura acima. Surgirá então a seguinte
área para criação da Stored Procedure:
Figura 54
4) Na janela mostrada, você deverá substituir o trecho de programa destacado em azul, na figura
acima, pelos comandos da sua Stored Procedure..Por exemplo, vamos escrever neste local uma
programação para criar uma Stored Procedure que mostrará todos os dados de professores
cadastrados na tabela professores, no banco de dados em questão. Após a digitação do novo
Figura 55
Estando criada a Stored Procedure, você poderá alterá-la, incluindo e/ou adicionando novos
comandos. Para isso basta seguir os seguintes passos:
a. Abra na árvore de objetos do SQL a área de Strored Procedure;
b. Clique com o botão direito do mouse sobre a Stored Procedure que deseja alterar, como
exemplo, vamos alterar a stored procedure “mostraprofessores”, no banco de dados UNIVAP;
c. No submenu que aparecerá, clique na opção “Modify”;
Figura 56
Figura 57
Figura 58
e) Surgirá então à janela “Delete Object” contendo o nome da procedure que foi selecionada para
exclusão. Por fim, clique no botão “OK”.
Figura 59
QUALQUER Stored Procedure criada pode ser executada a qualquer momento. Para isso basta:
a) Clique no botão ;
b) Indique na barra de ferramentas qual o nome do banco de dados que deve estar ativo, no nosso
caso: ;
c) Estando com a área de digitação de instruções SQL aberta, escreva o nome da Stored Procedure.
No nosso exemplo digitaremos “mostraprofessores” .
d) Por fim, basta pressionar o botão .
Figura 60
Veja que o resultado da execução dos comandos escritos na Stored Procedure “mostraprofessores”,
fez com que fosse exibido o painel de resultado, exibindo os registros filtrados.
IMPORTANTE: Antes de criar uma stored procedure, tome cuidado de verificar qual o banco de dados
está aberto na barra de ferramentas:
Figura 61
Para criarmos uma stored procedure com botão “New Query” (através de linha de comando), teremos
que usar a seguinte sintaxe:
Veja abaixo um exemplo de criação de uma stored procedure através de linha de comandos:
Figura 62
Digitando o trecho de programação anterior, você criará a stored. Para executá-la, basta seguir os passos
descritos no item 15.4 desta apostila, ou seja, escrever o nome da procedure e pressionar novamente o
botão , conforme mostrado na figura abaixo:
Figura 63
Para alterarmos a programação de uma stored procedure, poderemos usar o comando Alter
Procedure, conforme sintaxe abaixo:
Vamos alterar a programação da stored procedure criada no item 15.5 desta apostila. Veja exemplo
abaixo:
Figura 64
IMPORTANTE: após a digitação dos comandos SQL, que serão usados para substituir o código antigo,
torna-se necessário pressionar o botão para que a alteração seja realizada efetivamente. Para
testar a alteração feita, use novamente os passos do item 15.4 desta apostila.
Muitas vezes torna-se necessário a passagem de parâmetros para uma procedure. O parâmetro
recebido é usado na instrução SQL, escrita no interior da stored procedure.
Sintaxe:
Create procedure <nome_procedure>
@<variável_1> <tipo_variável> , @<variável_2> <tipo_variável>, ........... , @<variável_N>
<tipo_variável>
AS
<instrução_SQL_usando_variáveis declaradas>
Figura 65
Para testarmos uma stored procedure com passagem de parâmetros, temos que saber quais são os
parâmetros requisitados pela rotina.
Para exemplificar melhor, vamos executar a rotina criada no item 15.7 desta apostila. Veja como
devemos testá-la:
Figura 66
IMPORTANTE RESSALTAR:
a) “MOSTRARALUNO” é o nome da stored procedure criada anteriormente;
b) O número 1, digitado na frente do nome da procedure, será passado para a variável @ID;
c) Neste caso, então, serão exibidos os registros de clientes cujo conteúdo do campo ALUNO_ID seja
igual a 1. A figura acima mostra o resultado da execução da stored procedure.
15.9 – ALTERANDO UMA STORED PROCEDURE (COM PASSAGEM DE PARÂMETROS) COM O BOTÃO
“New Query” E PROGRAMAÇÃO
Para alterar uma stored procedure que possua área de parâmetros, você deve usar a sintaxe indicada
no item 15.6 desta apostila.
Vale dizer que, se desejar, você pode reescrever a procedure com ou sem passagem de parâmetros.
Diante disso, será necessário alterar a instrução SQL escrita na rotina. Vejamos um exemplo:
Figura 67
Neste exemplo, repare que a rotina foi alterada, de tal forma que receberá DOIS PARÂMETROS
quando for chamada. Portanto, quando for executar a rotina “MOSTRARALUNO”, devemos indicar o valor
inicial e final referente ao Aluno_ID, ou seja, estamos pesquisando por alunos cujo conteúdo do campo
ALUNO_ID esteja entre valores informados quando a stored procedure é chamada para execução.
15.10 – CRIANDO UMA STORED PROCEDURE COM PASSAGEM DE PARÂMETROS E COM VALORES
PADRÕES
Caso tentássemos executar uma stored procedure sem informar um parâmetro, requisitado pela
mesma, seria mostrada a seguinte mensagem de erro:
Figura 68
Veja que quando a procedure “mostraraluno” foi alterada, foram criadas DUAS variáveis que receberão
parâmetros informados pelo usuário, no momento da chamada mesma. Perceba que foi digitado somente o
nome da rotina e um dos valores obrigatórios como parâmetro e que não foi indicado o segundo valor de
parâmetro para consulta. Com isso foi exibida a mensagem de erro, informando o usuário que a rotina exige
outro parâmetro de entrada.
Para evitarmos esse tipo de erro, podemos definir valores padrões para as variáveis que receberão os
parâmetros de entrada.
Figura 69
Para resolvermos o problema, no momento da criação da variável devemos indicar um valor padrão, ou
seja, um valor que será atribuído à variável somente se a mesma não receber valores indicados pelo usuário,
no momento da chamada da rotina.
Vamos testar a nova rotina digitando somente o nome da mesma, sem passar nenhum parâmetro,
veja:
Figura 70
Pelo fato de não ter sido passado o parâmetro referente o @ID_FINAL, o SQL-Server atribuiu a
variável @ID_INICIAL o número 2, digitado pelo usuário. Como o usuário não informou um valor para o
@ID_FINAL, foi atribuído automaticamente para esta variável o valor 100. Portanto a instrução mostrou dados
de alunos cujo campo ALUNO_ID esteja entre 2 e 100(definido como padrão)
15.11 – EXCLUINDO UMA STORED PROCEDURE COM O BOTÃO “New Query” E PROGRAMAÇÃO
Figura 71
No exemplo mostrado, após digitar a linha de comando “drop procedure mostraraluno”, foi pressionado
o botão . Isso fez com que fosse excluída a procedure “mostraraluno”, do banco de dados UNIVAP.
16 –TRIGGER
São rotinas de programação que são disparadas automaticamente, diante das seguintes operações
realizadas com tabelas:
• INCLUSÃO DE REGISTRO
• ALTERAÇÃO(ÕES) DE REGISTRO(S)
• EXCLUSÃO(ÕES) DE REGISTRO(S)
Geralmente os sistemas desenvolvidos pelos programadores em linguagens tais como: Visual Basic,
Delphi e etc, são responsáveis pelo gerenciamento de todas as regras de negócio do referido sistema. Por
exemplo, o sistema que dá baixa automaticamente de produtos do estoque. A principal aplicação de uma
TRIGGER é cuidar destas regras de negócio, sem que seja necessário um programa qualquer para fazê-lo.
Sintaxe:
CREATE TRIGGER [NOME_TRIGGER] ON [TABELA]
FOR <INSERT, DELETE, UPDATE>
AS
<instruções_sql>
Sintaxe:
ALTER TRIGGER [NOME_TRIGGER] ON [TABELA]
FOR <INSERT, DELETE, UPDATE>
AS
<instruções_sql>
Nas sintaxes acima, existe a cláusula “FOR”. Esta cláusula refere-se ao momento quando a trigger
será disparada, por exemplo: Se na frente da cláusula “FOR” estiver definida a palavra INSERT, significa que a
trigger será disparada quando ocorrer um cadastro na tabela definida na cláusula “[TABELA]”. Quando
queremos que uma trigger seja disparada ao excluir um registro, devemos indicar na frente da cláusula “FOR”
a palavra DELETE. Para disparar uma trigger quando uma alteração for efetuada em um registro qualquer,
basta indicar a palavra UPDATE na frente da cláusula “FOR”. Se necessário for, podemos indicar que a trigger
será executada quando ocorrer cadastro, alteração ou exclusão escrevendo INSERT, DELETE, UPDATE na
frente da cláusula “FOR”.
Sintaxe:
DROP TRIGGER [NOME_TRIGGER]
Figura 72
1) Clique no botão ;
2) Digite a seguinte programação na área de edição de comandos:
Figura 73
Figura 74
Para testar o funcionamento de uma trigger, basta realizar uma operação (cadastro, alteração ou
exclusão, dependendo do que foi definido na cláusula “FOR”) na tabela definida na cláusula “[TABELA]”
quando a TRIGGER foi criada.
Como exemplo, vamos testar a trigger “VENDI”, criada como exemplo no item 16.1 desta apostila. Para
isso, basta cadastrar um registro. Usando o botão “New Query” vamos escrever uma linha de comando
INSERT, como o exemplo ilustrado a seguir:
Figura 75
Quando o comando INSERT foi executado, a TRIGGER “vendi” foi disparada automaticamente,
exibindo no painel de resultados todos os dados cadastrados na tabela “VENDA”.
Após a execução das trigger´s, as tabelas INSERTED e DELETED são excluídas da memória do
computador.
Vale dizer que a tabela INSERTED é criada quando a(S) operação(ões) INSERT ou UPDATE são
executadas. Já a tabela DELETED é criada quando a operação DELETE é executada.
Estas tabelas armazenam exatamente os registros que foram incluídos, alterados e/ou excluídos. É
importante lembrar que na tabela INSERTED, quando for criada pela operação INSERT, armazenará somente
um registro que acabou de ser cadastrado. Quando um grupo de registro for alterado, ESTES REGISTROS
serão armazenados na tabela INSERTED. Quando um grupo de registro for excluído, ESTES REGISTROS
serão armazenados temporariamente na tabela DELETED.
a) Vamos criar uma trigger para puxar automaticamente o preço do produto vendido, e calcular
automaticamente o subtotal da venda, ou seja, o usuário não informará o valor do produto nem o
subtotal, quando efetuar o cadastro na tabela “VENDA”.
• número da venda,
• código do produto,
• código do cliente
• e quantidade vendida do produto
Vamos ilustrar tudo que foi descrito anteriormente. Primeiramente vamos criar a trigger, conforme
exemplo abaixo:
Figura 76
Figura 77
Repare que no exemplo acima, duas tabelas foram exibidas no painel de resultados. Isso aconteceu,
porque existiam, neste caso, DUAS TRIGGER´S ligadas à tabela VENDA, a saber: “VENDI” (criada no exemplo
do item 16.1 desta apostila) e “CALCULASUBOTAL”. Portanto, saiba que podemos ter várias trigger´s criadas
e ligadas a uma tabela.
Veja que a segunda tabela exibida atualizou o VALORPROD e calculou o SUBTOTAL, de acordo com
os comandos SQL descritos na trigger. Esta tabela foi mostrada/gerada pela trigger que acabamos de criar
(CALCULASUBTOTAL).
Como você deve ter percebido, nos comandos SQL criados na trigger, referenciamos a tabela
INSERTED, isto porque ela armazena uma cópia exata do registro que acabou de ser cadastrado.
COMO OS VALORES DOS CAMPOS VALOR PROD E SUBTOTAL FORAM GRAVADOS, VISTO
QUE NÃO OS INFORMAMOS NO MOMENTO DO CADASTRO?