Buscar

UNIDADE 4 - Banco de Dados

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 37 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 37 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 37 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

1 
 
UNIDADE 4. 
Implantação de bancos de dados relacionais 
OBJETIVOS DA UNIDADE 
 
• Implantação de bancos de dados relacionais 
• Tecnologias emergentes para bancos de dados 
• Segurança em bancos de dados 
 
 
TÓPICOS DE ESTUDO 
 
Inserindo, eliminando e alterando dados 
// Criando e manipulando tabelas 
// Criação das tabelas 
// Inserindo dados nas tabelas 
// Copiando dados e gerando nova tabela a partir de uma existente 
// Alterando dados da tabela 
// Eliminando dados da tabela 
// Alterando a estrutura da tabela 
 
 
Incluindo restrições de dados em tabelas– 
// Criando visões de dados 
// Criando sequências 
// Criando índices 
 
Tecnologias emergentes para bancos de dados– 
// Banco de dados não relacional e suas aplicações 
// Banco de dados orientado a objetos e suas aplicações 
 
Segurança em banco de dados– 
// Definição de perfis de usuário (roles) 
// Ataques típicos em bancos de dados (SQL injection e outros) 
// Soluções de segurança para bancos de dados 
 
 
2 
 
Inserindo, eliminando e alterando dados 
Olá, aluno! Nesta unidade iremos continuar com os estudos sobre 
a Linguagem SQL para implantação de bancos de dados 
relacionais. Também iremos abordar aspectos de segurança e 
tecnologias emergentes de banco de dados. 
Criaremos uma nova base de dados e algumas tabelas, que serão 
manipuladas através dos principais comandos da Linguagem SQL 
para inserção, exclusão, consulta e alteração de dados e suas 
particularidades. Preparados? Então vamos lá. 
 
CRIANDO E MANIPULANDO TABELAS 
Iremos utilizar o SGBD MariaDB, baseado em MySQL, no modo de 
comandos. Caso você ainda não o tenha, acesse o link disponível 
nas referências bibliográficas dessa unidade (MARIADB 
FOUNDATION, 2019). Uma vez instalado, para acessá-lo, é 
necessário autenticá-lo no MySQL. Para tanto, utilize um dos 
comandos a seguir: 
mysql -u root -p 
Em seguida, será solicitada a senha do usuário root que 
você cadastrou durante a instalação do MariaDB ou 
qualquer outro SGBD. 
Podem ser usados também: 
mysql --user=root --password=sua-senha 
ou 
mysql -h127.0.0.1 -Dmysql -P3306 -uroot -p 
 
 
3 
 
A Figura 1 apresenta todo o processo de autenticação no SGBD. 
 
Agora estamos prontos para continuar com os estudos e 
experimentos da Linguagem SQL. Os comandos podem ser 
digitados em letras minúsculas ou maiúsculas, porém, pode haver 
algum SGBD ou sistema operacional que exija uma ou outra 
forma. 
Nesse material, adotaremos o seguinte padrão: os comandos e 
seus parâmetros em maiúsculo e a maioria dos argumentos em 
minúsculo, apenas para uma melhor leitura e entendimento do 
comando. Os nomes das bases de dados e tabelas em minúsculo; 
os atributos, não sendo sigla, sempre iniciando em maiúsculo e o 
restante em minúsculo. Lembrando que isso não é uma regra da 
Linguagem SQL, mas alguns SGBDs se comportam dessa maneira. 
Antes de iniciarmos, veremos o estado inicial do banco de dados 
MySQL. Vamos mostrar as bases de dados existentes com o 
comando a seguir. Veja o retorno do comando na Figura 2. 
 
SHOW DATABASES; 
4 
 
Lembre-se que sempre nos finais de comandos devemos colocar 
um ponto-e-vírgula: “;”. 
 
Caso você ainda não tenha criado alguma outra base de dados, a 
resposta ao comando será a exibição das bases de dados já 
instaladas com o produto (Figura 2). Essas bases pertencem ao 
próprio MySQL para execução de funcionalidades de controle e 
gerenciamento. 
O SGBD organiza o banco de dados em diversas bases de dados e, 
em cada uma, podemos criar várias tabelas com seus atributos. 
Logo, ao nos referenciarmos ao nosso banco de dados, usaremos o 
termo “base de dados”, que são sinônimos, mas apenas para não 
haver confusão sobre qual base está sendo referida. Cada banco 
de dados organizado pelo SGBD é, portanto, composto por sua 
base de dados, com suas tabelas e atributos totalmente 
independentes e acessados separadamente de outras bases de 
dados no mesmo SGBD. 
Vamos iniciar criando uma nova base de dados chamada 
Controle_de_Vendas, mas, como o MySQL normalmente converterá 
o nome das bases de dados para minúsculo, vamos então 
5 
 
referenciá-la sempre em minúsculo: controle_de_vendas. O 
comando para criação de bases de dados é CREATE DATABASE, 
seguido do nome da base de dados. Logo, o comando deverá ser 
digitado da seguinte forma: 
 
CREATE DATABASE controle_de_vendas; 
 
SHOW DATABASES; – listará as bases criadas. 
SHOW TABLES; – listará as tabelas criadas. 
SHOW CREATE TABLE nome da tabela; – listará a 
estrutura da tabela indicada. 
SHOW CREATE DATABASE nome da base de dados; 
– listará dados sobre a base de dados indicada. 
 
Agora, para acessar a base de dados criada, é necessário o 
comando USE seguido do nome da base de dados: 
USE controle_de_vendas; 
Você perceberá que o prompt de comando do MySQL trará sempre 
o nome da base de dados em uso. Para operar outras bases de 
6 
 
dados, basta apenas dar um comando USE e o nome da outra 
base. 
Para ficar claro o que será feito, analise o Diagrama 1 a seguir com 
o modelo lógico do banco de dados que será implantado. Faça uma 
análise das tabelas que serão criadas, seus atributos e 
relacionamentos. 
Estamos prontos para implantar nossas tabelas. O comando que 
permite criar tabelas é o CREATE TABLE seguido do nome da tabela 
e da lista de atributos, com suas características entre parênteses. 
Exemplo: 
 
7 
 
Algumas ferramentas CASE, como o BRModelo (2019), já criam uma 
boa parte dos scripts SQL para adiantar a tarefa de codificação 
para SQL (Figura 3), mas como é necessário assimilar bem a sintaxe 
de cada comando, é recomendável que você digite comando a 
comando. Por essa razão, todos serão explicados separadamente. 
É possível digitar grandes scripts SQL (códigos em SQL) em um 
editor de texto simples, e posteriormente transferi-los para os 
SGBDs. A maioria dos SGBDs permite que você copie e cole tudo de 
uma vez, mas isso é um recurso de produtividade para quem já 
possui a experiência necessária nos comandos. Para quem está 
iniciando, o ideal é ver e perceber as transformações junto ao 
banco de dados. 
 
8 
 
CRIAÇÃO DAS TABELAS 
Para uma leitura mais clara de cada comando, vamos apresentar 
os códigos com um atributo em cada linha. Para o SGBD é 
indiferente; ele só executará o comando quando encontrar o 
ponto-e-vírgula. Você poderá digitar cada bloco a seguir 
diretamente no prompt do SQL, na sequência que iremos 
apresentar. Entre um e outro CREATE, você pode usar o SHOW 
TABLES; para acompanhar a evolução. 
/* Tabela Clientes: */ 
CREATE TABLE Cliente ( 
Cod_cli INTEGER PRIMARY KEY, 
Nome VARCHAR (50), 
Endereco VARCHAR (50), 
Telefone VARCHAR (20) 
); 
 /* Tabela Fornecedor */ 
CREATE TABLE Fornecedor ( 
Cod_for INTEGER PRIMARY KEY, 
Contato VARCHAR (25), 
Endereco VARCHAR (50), 
Telefone VARCHAR (25) 
); 
 /* Tabela Produto */ 
CREATE TABLE Produto ( 
Cod_pro INTEGER PRIMARY KEY, 
Descricao VARCHAR (50), 
Valor_unitario DOUBLE (6,2), 
Cod_Fornecedor INTEGER, 
Data_cadastro DATE 
); 
9 
 
CREATE TABLE Vendas ( 
NF INTEGER PRIMARY KEY, 
Cod_Cli INTEGER, 
Cod_Pro INTEGER, 
Data_venda DATE, 
Valor_venda DOUBLE, 
Vendedor VARCHAR (50), 
Regiao VARCHAR (25) 
); 
 
Perceba que os primeiros campos de cada tabela são chaves 
primárias, logo, não será permitido repetir valores nesses campos. 
Opcionalmente, um campo pode ser do tipo AUTO_INCREMENT, 
que receberá um novo número sequencial a cada novo registro, 
como um contador, inclusive um campo-chave. Exemplo: 
Numautomático INTEGER NOT NULL AUTO_INCREMENT; 
Os tipos dos campos estão em destaque. São 
eles: INTEGER, VARCHAR, DOUBLE e DATE. Existem variações 
desses tipos, como: INT, CHAR, DATETIME, FLOAT, entre outros. 
O INTEGER só aceitará números inteiros, já DOUBLE, números com 
casas decimais, VARCHAR é do tipo texto (alfanumérico) e DATE é 
do tipo data.Entre parênteses estão as precisões de cada campo, ou seja, seu 
tamanho. Cuidado com o DOUBLE, pois em alguns sistemas você 
terá que usar o ponto em vez da vírgula para separar o decimal. 
Você poderá consultar a estrutura das tabelas criadas com o 
comando DESCRIBE nome da tabela;. Para consultar os comandos 
que originaram a tabela, use o comando SHOW CREATE 
TABLE nome da tabela;. Exemplo: 
SHOW TABLES; /* Apenas mostra as tabelas */ 
DESCRIBE cliente; /* Descreve a tabela */ 
10 
 
SHOW CREATE TABLE cliente; /* Mostra a estrutura 
da tabela */ 
 
INSERINDO DADOS NAS TABELAS 
Vamos agora popular as tabelas. O comando que utilizaremos para 
inserir dados nas tabelas é o INSERT. Os dados são preenchidos na 
ordem em que apresentamos os campos nos parênteses. Seu 
formato geral é: 
INSERT INTO tabela(nomes dos atributos) VALUE (conteúdo de 
cada campo). 
 
Inserindo dados na tabela Cliente: 
INSERT INTO Cliente(Cod_cli, Nome, Endereco, Telefone) VALUE 
(10, “João Santos”, “Al. Gomes, 50 – Bom Retiro/SP”,”11-3456-7899”); 
 
Podemos ainda, em um único comando, adicionar vários registros 
da seguinte forma: 
INSERT INTO Cliente(Cod_cli, Nome, Endereco, Telefone) VALUE 
(34, “Andrea Santos”, “Av. Santara, 4550 – Lapa/SP”, “11-2453-
8899”), 
(22, “Matheus Silva”, “Rua Albuquerque, 2350 – Morumbi/SP”, “11-
6456-7899”), 
(25, “Adriana Simões”, “Rua Menezes, 40b – Penha/SP”, “11-2356-
7812”), 
(67, “Julia Roberta”, “Av. Paulista, 1270 – Centro/SP”, “11-3456-
7889”), 
(13, “Ruy Barbosa”, “Av. Soares, 280 – Guarulhos/SP”, “11-2456-
4894”); 
O problema é que, se você errar algo, deverá digitar novamente 
todo o comando. É possível copiar e colar, mas o ideal é você ir 
11 
 
inserindo cada registro e alternar com o comando SELECT * from 
cliente para observar a tabela, sendo populada gradativamente, 
como pode ser visto na Figura 4. 
 
Inserindo dados na tabela Fornecedor: 
INSERT INTO Fornecedor(Cod_for, Contato, Endereco, 
Telefone) VALUE 
(250, “Suzana”, “Av. Alcântara, 22 – Guarujá/SP”, “13-8853-5699”), 
(100, “Moisés”, “Rua Albuquerque, 150 – Morumbi/SP”, “11-5556-
7899”), 
(150, “Ana Maria”, “Rua Menezes, 34 – Itaim/SP”, “11-2256-7812”), 
(300, “Carlos Roberto”, “Av. São Paulo, 70 – Brás/SP”, “11-4456-
7889”), 
(200, “Estela”, “Av. Brigadeiro, 450 – Santana/SP”, “11-5556-4894”); 
 
12 
 
 
 
Inserindo dados na tabela Produto: 
INSERT INTO Produto(Cod_pro, Descricao, Valor_unitario, 
Cod_Fornecedor, Data_cadastro) VALUE 
(2050, “Processador i3”, 560.40, 300, CURDATE()), 
(1010, “Memória DDR-3”, 340.25, 150, “2019-02-20”), 
(4150, “Monitor 19”, 750.00, 300, CURDATE()), 
(3020, “Teclado 101 TC”, 90.50, 444, “2018-11-14”); 
 
Observe que, opcionalmente, pode-se determinar que a data de 
cadastro de alguns produtos seja fornecida pela função CURDATE(). 
Perceba também que o produto de código 3020 foi cadastrado sem 
que houvesse um código de fornecedor válido (Figura 6), já que 
não existe nenhum fornecedor com o código 444. Mais adiante, 
aprenderemos como evitar esse problema, criando restrições e 
garantindo a integridade dos dados. 
13 
 
 
 
Inserindo dados na tabela Vendas: 
INSERT INTO Vendas(NF, Cod_Cli, Cod_Pro, Data_venda, 
Valor_venda, Vendedor, Regiao) VALUE 
(500010,13,1010,“2019-02-20”, 340.25, “Pedro”, “Zona 
Norte”),(500005,34,2050, “2019-02-20”, 560.40, “Marcos”, “Zona 
Sul”),(500002,25,3333,“2019-03-24”, 900, “Sonia”, “Zona 
Leste”),(500003,13,4150,“2019-03-25”, 750.00, “Paulo”, “Zona 
Norte”); 
Observe que foi registrada uma venda com código de produto 
inexistente, o 3333, assim como ocorreu na tabela Produto, e isso 
não é aceitável para um banco de dados íntegro. Por essa razão, 
aprenderemos a criar restrições para que essas inconformidades 
não ocorram. 
14 
 
 
COPIANDO DADOS E GERANDO NOVA TABELA A 
PARTIR DE UMA EXISTENTE 
É possível fazer a cópia de uma tabela gerando outra com todos os 
dados preservados. O comando genérico é: 
CREATE TABLE nova tabela SELECT * FROM tabela existente; 
 
O exemplo a seguir duplicará a tabela Vendas, gerando a 
tabela VendasCopia: 
CREATE TABLE VendasCopia SELECT * FROM Vendas; 
 
Perceba que será criada uma tabela idêntica à Vendas, com o 
nome VendasCopia, com todos os atributos e dados da tabela de 
origem. Mas muitas vezes desejamos escolher apenas alguns 
campos que queremos para uma nova tabela e em ordem 
diferente das colunas. Veja o exemplo a seguir e seu resultado na 
15 
 
Figura 8, onde apenas três atributos foram escolhidos para compor 
a tabela VendasRegiao: 
CREATE TABLE VendasRegiao SELECT NF,Regiao, 
Data_venda FROM Vendas; 
 
 
A partir desse ponto, como veremos comandos que alterarão 
dados e estruturas das tabelas, vamos também fazer uma cópia da 
tabela de clientes. Para exercitar, duplique todas as tabelas que 
você criou. 
CREATE TABLE Cliente2 SELECT * FROM Cliente; 
 
ALTERANDO DADOS DA TABELA 
16 
 
 
UPDATE nome da tabela SET campo a alterar = novo 
conteúdo WHERE campo-chave ou outro = dado existente; 
Exemplo: 
UPDATE Vendas SET Regiao = “Zona Oeste” WHERE NF = 500005; 
 
No exemplo, apenas a venda com a nota fiscal 500005 terá a região 
trocada de “Zona Sul” para “Zona Oeste”. Preferencialmente, 
devemos usar o campo-chave para realizar a condição de busca 
inequívoca, mas muitas vezes desejamos trocar vários registros ao 
mesmo tempo. Nesse caso, devemos escolher algum campo que 
possa conter conteúdos em comum. Por exemplo, trocar todos os 
conteúdos do campo Região para “Zona Oeste” quando o vendedor 
for “Marcos”. Exemplo: 
UPDATE Vendas SET Regiao = “Zona Oeste” WHERE Vendedor = 
“Marcos”; 
 
Podemos ainda trocar o nome do vendedor para “ANA”, quando o 
código do cliente for 13. Veja que na Figura 7 existem duas vendas 
para esse cliente: 
UPDATE Vendas SET Vendedor = “ANA” WHERE Cod_Cli = 13; 
17 
 
Obviamente, é aconselhável você alternar esses comandos com o 
SELECT para visualizar as mudanças na tabela. Na Figura 9, é 
possível ver como ficou a tabela Vendas depois desses últimos 
comandos. 
 
 
 
DELETE from nome da tabela WHERE campo-chave = condição; 
18 
 
Vejamos vários exemplos diferentes para apagar registros. 
Intercale com o comando SELECT na tabela afetada para 
acompanhar as exclusões. Exemplo para apagar um registro 
específico: 
DELETE FROM VendasCopia WHERE NF=500002; 
 
Exemplo para apagar um grupo de registros do mesmo vendedor: 
DELETE FROM VendasCopia WHERE Vendedor= “Ana”; 
 
Exemplo para apagar um grupo de clientes que começam com a 
letra A, da tabela Cliente2. 
DELETE FROM cliente2 WHERE Nome LIKE “A%”; 
 
Exemplo para apagar TODOS os registros da tabela VendasCopia: 
DELETE FROM VendasCopia; 
 
ALTERANDO A ESTRUTURA DA TABELA 
O comando ALTER TABLE permite alterar a estrutura de tabelas 
sem perda de dados, desde que os ajustes sejam de natureza 
compatível com os campos alterados. Não é possível, por exemplo, 
transformar campos que guardam letras em números. Podemos 
acrescentar, excluir e alterar os campos da tabela. O formato 
genérico do comando é: 
ALTER TABLE nome_da_tabela MODIFY campo 
novo_tipo_do_campo; 
 
 
19 
 
O exemplo a seguir trocará o tipo do campo para INTEGER, se este 
for compatível, como double, int, float, entre outros. Mas nesse 
caso as casas decimais serão perdidas. 
ALTER TABLE vendascopia MODIFY Valor_venda INTEGER; 
 
Podemos ainda acrescentar, eliminar ou renomear campos da 
tabela, trocando o parâmetro MODIFY por outras opções. Vejamos 
os exemplos a seguir. 
Acrescentar campos na tabela: 
ALTER TABLE vendascopia ADD COLUMN Estado Varchar(25); 
ALTER TABLE vendascopia ADD COLUMN Sigla Char(2) NOT 
NULL; 
 
Trocar o nome do campo e definir um valor-padrão inicial: 
ALTER TABLE vendascopia CHANGE Sigla UF Char(2) DEFAULT ‘SP’; 
 
Excluir campo da tabela. Todos os dados da coluna serão perdidos: 
ALTER TABLE vendascopia DROP Sigla;INSERT INTO Vendas(NF, Cod_Cli, Cod_Pro, Data_venda, 
Valor_venda, Vendedor, Regiao) VALUE 
(500080,88,8888,“2019-02-20”, 340.25,”Pedro”,”Zona Norte”); 
 
Incluindo restrições de dados em tabelas 
Em nossa implantação do banco de dados Controle_de_Vendas, 
algumas das tabelas necessitam de um ajuste importante. Vamos 
criar uma declaração de chave estrangeira para as tabelas Produto 
e Vendas, que fazem referência aos campos-chave das tabelas 
20 
 
Fornecedor e Cliente. Conceitualmente falando, Produto e Vendas 
são entidades “fracas”, pois dependem das entidades Fornecedor e 
Cliente para existir, as quais, por sua vez, são entidades “fortes”, 
não dependendo de nenhuma outra. Uma venda depende do 
cliente para comprar, e o produto depende do fornecedor para 
fabricá-lo, mas isso não é recíproco. O cliente e o fornecedor 
existem de forma independente e podem ser cadastrados 
livremente, sem a necessidade de verificação com outras tabelas. 
Quando esta declaração for realizada, o relacionamento entre elas 
estará efetivado e RESTRIÇÕES serão estabelecidas. Isso implica 
dizer que nenhum registro que não obedeça a relação de restrição 
imposta será aceito nas tabelas “fracas” envolvidas, ou seja, a 
inserção de dados será negada se não houver um item 
correspondente nas entidades de referência. Um produto não será 
cadastrado se o fornecedor não for informado ou se não existir na 
tabela Fornecedor. Da mesma forma, uma venda não será 
cadastrada se o cliente ou o produto não existir em suas devidas 
tabelas. 
Perceba que a tabela Produto é uma entidade “forte” quando se 
relaciona com a tabela Vendas, já que não existem vendas sem 
produtos, mas é uma entidade “fraca” quando se relaciona com a 
tabela Fornecedor, já que todo produto necessita de um 
fornecedor. Pode-se ainda afirmar que há uma relação de 
cardinalidade de 1 para N do ponto de vista da tabela Produto, pois 
todo produto poderá ser fornecido por um ou vários fornecedores, 
jamais nenhum, e há uma cardinalidade de 0 para N do ponto de 
vista da tabela Fornecedor, pois um fornecedor poderá ter nenhum 
ou vários produtos. 
Vamos verificar o esquema relacional das quatro primeiras tabelas 
criadas na base de dados Controle_de_Vendas e observar o 
relacionamento entre as chaves primárias e estrangeiras: 
 
Cliente (Cod_cli, Nome, Endereco, Telefone). 
Fornecedor (Cod_for, Contato, Endereco, Telefone). 
21 
 
Produto (Cod_pro, Descricao, Valor_unitario, fk_Cod_Fornecedor, 
Data_cadastro). 
Vendas (NF, fk_Cod_Cli, fk_Cod_Pro, Data_venda, Valor_venda, 
Vendedor, Regiao). 
 
Observe que as chaves primárias aparecem sublinhadas, e as 
chaves estrangeiras em negrito, com uma notação fk (foreign key) 
antes de cada campo, sendo tal notação opcional, mas útil quando 
não houver como destacar esses elementos. 
Importante: como os comandos a seguir 
envolvem restrições entre as tabelas Produto e Fornecedor, 
inconsistências podem aparecer. É altamente recomendável que 
você revise os produtos cadastrados na tabela Produto e 
verifique se todos possuem fornecedor válido cadastrado na 
tabela Fornecedor. Caso contrário, você será alertado a fazê-lo 
pelo próprio SQL, que não conseguirá aplicar as restrições 
impostas pelos novos comandos. Se necessário, altere ou 
elimine o produto que não tenha um fornecedor válido. Caso 
necessite, você poderá criar uma nova base de dados com outro 
nome, criar as mesmas tabelas e inserir novamente todos os 
primeiros registros (Figuras 4, 5, 6 e 7). Também pode usar 
copiar/colar nos scripts, excluindo ou alterando os produtos 
sem fornecedores válidos. Perceba que, no produto de código 
3020, o fornecedor cadastrado é o 444, que propositalmente 
não existe na tabela Fornecedor. Uma vez aplicados os novos 
comandos de restrição, não será mais permitida a entrada de 
fornecedor inexistente na tabela Produto. 
 
Vamos então ver o código SQL necessário para fazer essa 
declaração de chave estrangeira, o relacionamento entre as tabelas 
envolvidas, ou seja, aplicar restrição. Segue o formato genérico 
22 
 
simplificado para declarar uma chave estrangeira e a restrição 
desejada: 
ALTER TABLE Entidade_Fraca ADD 
CONSTRAINT fk_Nome FOREIGN KEY (chave 
estrangeira) REFERENCES Entidade_Forte (chave primária); 
Onde: 
Entidade_Fraca: Também chamada de tabela-filha. 
 
ADD Constraint: Significa “adicionar restrição”. 
 
FK_Nome: É o nome da restrição criada. Para o SQL é um índice para 
facilitar o acesso aos dados relacionados, mas conceitualmente é 
como se fosse o nome do relacionamento. É comum o nome desse 
item ser uma combinação do nome das duas tabelas – por exemplo: 
“Produto e Fornecedor” ficaria fk_Pro_For. 
 
FOREIGN KEY: Parâmetro para declaração da chave estrangeira. 
 
REFERENCES: Parâmetro para declaração da entidade forte ou tabela 
de referência, também chamada de tabela-pai, e sua chave primária. 
 
Os dois exemplos a seguir adicionarão restrições que não 
permitirão que um produto seja cadastrado sem um fornecedor 
válido. Também não permitirão que um fornecedor da tabela 
Fornecedor seja excluído ou que seu código seja alterado (se 
estiver na tabela Produto). Para excluir um fornecedor, antes, o 
produto que o referencia deverá ser excluído, ou o código do 
fornecedor deverá ser trocado por outro válido na tabela Produto. 
Só assim o fornecedor ficará livre para ser excluído na tabela 
Fornecedor. Isso é uma restrição total. Vejamos: 
ALTER TABLE Produto ADD 
CONSTRAINT fk_Produto_Fornecedor FOREIGN 
KEY (Cod_Fornecedor) REFERENCES Fornecedor (Cod_for); 
23 
 
ou 
ALTER TABLE Produto ADD 
CONSTRAINT fk_Pro_For FOREIGN KEY 
(Cod_Fornecedor) REFERENCES Fornecedor (Cod_for) ON 
DELETE NO ACTION ON UPDATE NO ACTION; 
 
Os dois exemplos se equivalem no MySQL. Logo, se nenhum 
parâmetro for informado após o ON DELETE ou no ON UPDATE, 
o NO ACTION será assumido por padrão. Em outros SGBDs pode 
ser diferente. Tais parâmetros informam o que será feito quando 
um registro for excluído ou alterado na tabela-pai, ou seja, a tabela 
de referência no relacionamento. Nesse caso, a restrição máxima 
será mantida, já que nenhuma outra ação foi informada. Perceba 
que o comando é aplicado na tabela entidade_fraca (ou filha) 
Produto, mas, dependendo dos parâmetros, acaba afetando 
também a entidade_forte (ou pai) Fornecedor. 
 
O exemplo a seguir, com parâmetro CASCADE, também impede 
que um produto seja cadastrado sem um fornecedor válido, porém 
tem um comportamento diferente no caso de alterações ou 
exclusões do fornecedor. Se o código do fornecedor na tabela 
Fornecedor for alterado, automaticamente todos os seus produtos 
serão atualizados com o novo código. Se o fornecedor for excluído 
da tabela, todos os produtos com esse fornecedor serão também 
24 
 
automaticamente excluídos. Isso é uma restrição parcial, já que 
permite alguns ajustes. Vejamos: 
ALTER TABLE Produto ADD 
CONSTRAINT fk_Pro_For FOREIGN KEY 
(Cod_Fornecedor) REFERENCES Fornecedor (Cod_for) ON 
DELETE CASCADE ON UPDATE CASCADE; 
 
Pode ser criada uma restrição para alteração (update) de dados 
diferente de exclusão (Delete) de dados entre tabelas relacionadas. 
Na prática, os parâmetros NO ACTION e CASCADE podem ser 
combinados. Exemplo: 
ALTER TABLE Produto ADD 
CONSTRAINT fk_Pro_For FOREIGN KEY (Cod_Fornecedor) REFERE
NCES Fornecedor (Cod_for) ON DELETE NO ACTION ON UPDATE 
CASCADE; 
No exemplo mostrado, a exclusão do fornecedor não será 
permitida (NO ACTION), mas alterações do código do fornecedor 
ocorrerão em efeito cascata (CASCADE), ou seja, se mudar o código 
do fornecedor na tabela Fornecedor, o mesmo ocorre na tabela 
Produto e vice-versa. 
Para eliminar uma restrição deixando as tabelas novamente 
independentes, basta informar o nome da restrição (nome do 
índice) com o comando: 
ALTER TABLE Produto DROP CONSTRAINT fk_Pro_For; 
 
CRIANDO VISÕES DE DADOS 
Visãode dados, ou view, como é mais conhecida, é uma “tabela 
virtual” que permite visualizar resultados de consultas de tabelas 
físicas, que muitas vezes são volumosas, e muita variedade de 
campos, trazendo uma visão mais otimizada dos dados, sem ter 
que reescrever comandos complexos de consultas. Isso simplifica a 
25 
 
interação entre usuário e banco de dados, pois ele pode realizar 
consultas como se fossem tabelas reais. Os dados do banco de 
dados são acessados das tabelas reais, assim que o acesso a 
uma view é solicitado. Elas não armazenam dados, logo, não 
ocupam espaço no banco de dados. 
Entre outros aspectos, permite um maior controle e segurança por 
restringir o acesso total à base de dados por qualquer usuário do 
banco de dados, pois oferece a possibilidade de liberar apenas 
consultas pontuais dependendo do grupo do usuário. 
 A sintaxe genérica do comando é: 
CREATE VIEW nome_da_View AS 
SELECT campos_da_tabela FROM tabela; 
 
Vejamos um exemplo simples, que usa uma view para criar uma 
agenda com os telefones dos fornecedores: 
CREATE VIEW Agenda_for AS SELECT Contato, telefone From 
Fornecedor; 
 
Para testar sua view, basta usar o comando SELECT, como se fosse 
em uma tabela normal: SELECT * FROM Agenda_for;. O mesmo 
para alterar e excluir, exatamente como fazemos em tabelas. 
 Pode-se criar views a partir de consultas mais elaboradas e 
sofisticadas, como: 
CREATE VIEW Vendas_por_Regiao AS SELECT * FROM 
Vendas INNER JOIN produto on Vendas.Cod_Pro = 
produto.cod_pro Where regiao LIKE (“ZONA NORTE”); 
 ou 
CREATE VIEW Vendas_Geral AS SELECT NF, Cod_Cli,vendas.Cod_Pro, 
Descricao, Valor_unitario from Vendas INNER JOIN produto on 
Vendas.Cod_Pro = produto.cod_pro; 
 
CRIANDO SEQUÊNCIAS 
26 
 
O SQL possui um recurso para criar um objeto na base de dados 
que gera uma sequência automática de números. O objeto é um 
elemento externo às tabelas, mas seu valor, sempre incrementado, 
pode ser usado para alimentar atributos que necessitem de um 
campo com essa característica. Uma sequência numérica pode ser 
útil, inclusive, por aplicações externas em que, ao acessarem o 
banco de dados, um novo número e exclusivo pode ser gerado. 
Contudo, dependendo do SGBD adotado, pode haver muitas 
variações deste recurso. 
 O formato genérico do comando é: 
CREATE SEQUENCE objeto_sequencial START WITH valor inicial 
INCREMENT BY incremento; 
 Vejamos alguns exemplos: 
Para gerar um número de 1 em 1, iniciando em 1: 
CREATE SEQUENCE Num_sequencial START WITH 1 INCREMENT 
BY 1; 
Para gerar um número iniciando em 1000 e variando de 10 em 10. 
CREATE SEQUENCE Num_seq START WITH 1000 INCREMENT BY 
10; 
 Para gerar um número iniciando em −100 e variando de −10 em 
−10. 
CREATE SEQUENCE Num_seq START WITH −100 INCREMENT BY –
10; 
Para ver o número atual: SELECT NEXTVAL(Num_seq);. 
Para ver ou gerar o próximo número, use: SELECT 
NEXTVAL(Num_seq);. 
 Para trazer informações sobre o objeto e sua sequência: 
SHOW CREATE SEQUENCE Num_seq \G; 
Para ver todos os objetos criados, use o comando: SHOW TABLES; 
 
27 
 
CRIANDO ÍNDICES 
Na manipulação diária dos bancos de dados, as consultas são 
frequentes e podem causar morosidade no tempo de resposta de 
bancos muito volumosos com milhares ou milhões de dados. 
Diante dessa situação, a criação de índices pode contribuir para 
garantir melhoria nesse tempo de resposta. Os índices ajudam o 
gerenciador do banco de dados a localizar os registros com mais 
facilidade. 
Ao executarmos uma consulta com o comando SELECT, onde são 
filtrados por um ou vários campos, o gerenciador do banco efetua 
uma ação de varredura na tabela, percorrendo-a por inteiro. Caso 
algum registro atenda às condições definidas no filtro, ele é 
selecionado no conjunto de resposta do comando e os demais são 
desconsiderados. Em campos numéricos, os índices são mais 
eficientes. 
Vejamos a sintaxe do comando genérico para criar índices em uma 
tabela: 
CREATE INDEX nome_do_índice ON nome_da_tabela(nome_do_campo); 
Exemplo: 
CREATE INDEX indexnome ON Cliente(Nome) 
 
Dessa forma, se fizermos uma pesquisa na tabela Cliente 
comparando nomes, a pesquisa se dará bem mais rapidamente, 
mas só é perceptível em tabelas volumosas. Exemplo: 
SELECT * FROM Cliente WHERE Nome LIKE "A%"; 
Perceba que, no comando de consulta, o índice criado (indexcli) 
não é explicitado, mas o gerenciador do banco sabe que para o 
campo Nome existe um índice criado. Para um campo-chave é 
desnecessário criar um índice, já que o próprio gerenciador se 
encarrega de indexá-lo. Só devemos criar índices para colunas que 
realmente são frequentemente acessadas para filtrar as pesquisas 
nas consultas, pois podem causar um esforço maior e sobrecarga 
28 
 
nas operações de inclusão, alteração ou exclusão de dados, 
degradando o tempo de resposta do banco de dados. 
Para eliminar um índice, basta usar o comando: 
 
DROP INDEX nomecli ON Cliente; 
 
É possível criar índices durante a criação da própria tabela. 
Exemplo: 
CREATE TABLE Livro( 
ID INT NOT NULL PRIMARY KEY, 
Codigo INT, 
Titulo VARCHAR(50), 
Autor VARCHAR(50), 
INDEX (Codigo), 
INDEX (Autor) 
); 
Tecnologias emergentes para bancos de dados 
Tecnologias emergentes tratam de tendências do emprego de 
tecnologias inovadoras, adaptadas, modernas ou não, mas que 
podem se tornar solução para as questões e necessidades 
crescentes no universo tecnológico, entre eles o dos bancos de 
dados. Muitas tendências podem se tornar realidade rapidamente 
e se confirmar como inovações aplicáveis, enquanto outras talvez 
sejam implantadas em futuros mais longínquos ou caírem no 
ostracismo, podendo voltar em algum momento. 
Usufruir dos benefícios de Big Datas, computação na nuvem, 
soluções via internet, por exemplo, já é realidade em vários 
segmentos, com crescentes necessidades de serviços escaláveis, 
capazes de se expandir. Para algumas áreas mais específicas, com 
grande variedade de tipos de dados e informações 
desestruturadas, em várias áreas do conhecimento, sempre 
apareceram barreiras nos modelos engessados dos bancos de 
dados relacionais, mas agora podem se beneficiar da 
potencialidade dos não relacionais. 
29 
 
No segmento dos bancos de dados, vimos que ao longo da história, 
vários tipos de bancos de dados surgiram, no entanto, ainda hoje o 
banco de dados relacional é o tipo mais implementado no mundo, 
mas devido sua limitação em lidar com dados mais específicos e 
críticos para algumas áreas, os bancos de dados orientados a 
objetos e os não relacionais, por alguns chamados de NoSQL (não 
usam SQL), começam a pegar cada vez mais força e passam a ser 
considerados como possíveis soluções para as lacunas e demandas 
não atendidas nesta área. Abordaremos então algumas 
características desses tipos de bancos de dados. 
 
BANCO DE DADOS NÃO RELACIONAL E SUAS 
APLICAÇÕES 
Bancos de dados não relacionais possuem em sua essência a não 
estruturação dos dados disponibilizados, como fazem os modelos 
relacionais, com tabelas organizadas e bem definidas, seus 
atributos com tipos invioláveis em sua natureza e limitação. São, 
portanto, tradados como bancos de dados não estruturados ou 
semiestruturados, chamados até de NoSQL. São disponibilizados 
de forma distribuída, provendo várias soluções e aplicações, 
principalmente no universo da internet. Elmasri e Navathe (2011) 
nominam esse tipo de banco de dados como “banco de dados de 
internet”, falando sobre como o armazenamento dos dados das 
páginas web tradicionais, por exemplo, diferem de bancos de 
dados estruturados. 
Alguns autores não identificam bancos não relacionais como 
aqueles que simplesmente não usam SQL, mas há uma corrente 
tratando do tema de bancos de dados não relacionais, como 
NoSQL, mas isso não é um consenso, até porque existem soluções 
SQL, mesmo que parciais e limitadas, para manipulação de dados 
não relacionais.Há anos, autores já anunciavam a capacidade de o 
SQL Server permitir transações com fontes de não relacionais: 
30 
 
 
Uma das características dos bancos de dados não relacionais é 
permitir que itens de dados do mesmo tipo possam ter diferentes 
conjuntos de atributos – ao contrário dos bancos de dados 
relacionais, onde dados do mesmo tipo normalmente são 
mantidos em atributos específicos. No modelo semiestruturado, 
não há exigência de um esquema predefinido para um tipo de 
objeto no qual os dados precisam estar em conformidade. Há 
também o modelo não estruturado, no qual a indicação do tipo dos 
dados é muito limitada. Um exemplo típico é um documento de 
texto e comando de marcação que contém informação embutida. 
Páginas web em HTML com alguns dados são consideradas dados 
não estruturados (ELMASRI; NAVATHE, 2011). 
 
BANCO DE DADOS ORIENTADO A OBJETOS E SUAS 
APLICAÇÕES 
A popularização e os benefícios do paradigma da programação 
orientada a objetos e suas diversas linguagens, como Java, C++, C#, 
entre outras, e as limitações impostas pelo modelo relacional, 
principalmente dentro do universo da web, levaram ao surgimento 
do modelo chamado “banco de dados orientado a objetos”. Esse 
tipo pode ser visto como uma extensão do modelo entidade-
relacionamento (ELMASRI; NAVATHE, 2011). 
Para Silberschatz, Korth e Sudarshan (1999), os principais 
fornecedores de banco de dados suportam o modelo de dados 
31 
 
objeto-relacional, que combina as caraterísticas do modelo de 
dados orientado a objetos e o modelo de dados relacional. Bancos 
de dados orientados a objetos podem armazenar objetos e 
compartilhá-los para aplicações diferentes. 
Os principais conceitos da orientação a objetos que compõem a 
estrutura desse banco de dados são: persistência de objetos, 
objetos complexos, presença de identificadores de objetos, 
aplicação de herança, métodos, dados estruturados, coleção, 
encapsulamento e polimorfismo. Alguns exemplos de sistemas 
gerenciadores de banco de dados orientado a objetos, chamados 
de SGBDOO, são o Objectivity/DB, o GemStone e o Jasmine. Os 
diagramas UML podem ser utilizados para representar a 
modelagem de dados em um projeto que envolva banco de dados 
orientado a objetos (MULLER, 2002). 
Algumas aplicações de bancos de dados orientados a objetos são: 
sistemas de design e produção, como computer-aided design (CAD) 
e computer-aided manufacturing (CAM), sistemas para a área 
científica e médica, sistemas de informação geográfica e bases de 
dados com informações multimídia. Tais aplicações possuem 
características como dados altamente estruturados, transações 
longas, dados em multimídia e operações fora do padrão, que as 
tornam diferentes das aplicações tradicionais (CHAUDRI; ZICARI, 
2001, p. 3). 
 
Segurança em banco de dados 
De maneira geral, a segurança do banco de dados é muito 
importante, tanto no aspecto físico e geográfico de suas 
instalações como no controle de acesso, seja in loco ou 
remotamente. 
32 
 
 
Um sistema gerenciador de banco de dados deve prover 
mecanismos que viabilizem ações de segurança a fim de garantir a 
integridade, a disponibilidade e a confidencialidade dos dados. 
 Veremos então alguns recursos que podem ser utilizados na 
preservação dos dados custodiados em um sistema gerenciador de 
banco de dados. 
 
DEFINIÇÃO DE PERFIS DE USUÁRIO (ROLES) 
Pode-se limitar o acesso de usuários a uma determinada base de 
dados, tabela ou campos, como também controlar o acesso de 
acordo com a workstation ou host do usuário, ou seja, a partir de 
onde foi realizada a conexão com o servidor do banco de dados. 
Pode-se conceder privilégios diferentes para cada host ou usuários 
que se conectam ao banco de dados. Dessa forma, é possível 
determinar, inclusive, quais ações podem ser executadas por um 
usuário, dependendo de onde foi realizada a conexão. 
Para criar usuários, usamos o comando CREATE USER e depois 
concedemos os “privilégios” de acesso com o comando GRANT. 
Caso o usuário não exista, é possível criá-lo também com esse 
comando. 
 
 
33 
 
A sintaxe geral do comando para criar usuário é: 
 
 
Agora, para dar “privilégio” total de acesso ao usuário para uma 
base de dados específica: 
 
 
Para criar um usuário local e determinar qual tabela e quais 
campos poderá acessar: 
 
 
 
34 
 
Nesse caso, o usuário foi criado, mas só poderá consultar a tabela 
Curso e apenas os campos Nome e Valor. Qualquer outra operação 
será negada. Para liberar acesso a várias bases, tabelas ou campos, 
o asterisco (*) poderá ser utilizado. 
 Para revogar os acessos concedidos, utilize o comando REVOKE da 
seguinte forma: 
 
 
Para ver todos os usuários criados no banco de dados: 
 
 
Para ver “privilégios” dos usuários e o que eles podem acessar: 
 
 
ATAQUES TÍPICOS EM BANCOS DE DADOS (SQL INJECTION E 
OUTROS) 
 
35 
 
Os ataques típicos em bancos de dados podem ser do tipo SQL 
injection (injeção de SQL) com alvo nos sistemas de bancos de 
dados tradicionais e também nos bancos de dados NoSQL das 
plataformas de Big Datas. Os ataques SQL injection consistem na 
inserção de instruções SQL não autorizadas ou mal-intencionadas 
em campos de entrada, normalmente de aplicações web, com 
preenchimento de dados em formulários para coleta de dados que 
serão enviados ao banco de dados. Já os ataques de injeção NoSQL 
consistem em inserir instruções maliciosas em componentes que 
interagem com Big Datas. 
Nos dois casos, um ataque desse tipo, sendo bem-sucedido, 
poderá conceder acesso sem restrições aos bancos de dados. 
Porém, tecnicamente, as soluções de Big Data não podem sofrer 
injeção de SQL, já que não usam tecnologia baseada em SQL, mas 
são suscetíveis ao mesmo tipo de ataque, ou seja, injeção de 
códigos maliciosos na entrada de dados. 
No caso de SQL injection, a vulnerabilidade pode ocorrer, por 
exemplo, quando a aplicação que recebe um dado de entrada para 
ser enviada e processada no servidor do banco de dados, 
concatena os dados coletados com os códigos de consultas SQL 
sem realizar o devido tratamento do dado passado pelo usuário ou 
pela aplicação, ocasionando a possibilidade de alteração de 
instruções SQL, diferentemente do previsto pela aplicação. 
 
SOLUÇÕES DE SEGURANÇA PARA BANCOS DE DADOS 
Uma solução ideal e definitiva, que garanta a segurança dos 
bancos de dados, simplesmente não existe. Há sempre 
possibilidades e vulnerabilidades que devem ser controladas e 
vigiadas constantemente. Aspectos internos, externos, humanos e 
cibernéticos estão em constantes transformações e propensas a 
riscos. Logo, a vigilância e a busca pela solução ideal devem ser 
incansáveis e permanentes. 
As ameaças são várias, e algumas boas práticas podem e devem 
ser adotadas. Entre elas, pode-se destacar: 
 
36 
 
1. Implantar políticas de segurança em TI; 
2. Evitar concessão de privilégios de acesso excessivos para 
posteriormente ficarem desatualizados e cair no 
esquecimento dos administradores; 
3. Prevenir abusos de privilégios e uso inconsequente por maus 
profissionais; 
4. Realizar testes manuais, por intermédio de ferramentas 
específicas diretamente nas aplicações do usuário para 
atestar a vulnerabilidade, como SQLMap, jSQL Injection, entre 
outras; 
5. Manter o banco de dados em um servidor exclusivo, com 
acesso físico e lógico protegido de intrusão; 
6. Prevenir o ambiente contra malwares; 
7. Realizar auditorias com frequência; 
8. Implantar política de backups eficientes; 
9. Evitar exposição desnecessária de mídias de storage de 
backups. 
 
Essas e outras atitudes combinadas poderão elevar o nível de 
segurança e nenhuma delas deverá ser subestimada nem 
valorizada a ponto de se classificar como absoluta e definitiva. 
Quando o assunto é segurança de dados, todo cuidado é pouco. 
 
SINTETIZANDO 
Caro aluno, nesse capítulo completamos os estudos sobre a 
LinguagemSQL. Vários comandos importantes e essenciais foram 
exemplificados e praticados de forma intensa. Abordamos 
comandos de criação, inserção, atualização, consulta e exclusão de 
dados em uma base de dados MySQL. 
Manipulamos bases de dados diretamente do sistema gerenciador 
de banco de dados MariaDB. Criamos e manipulamos a base 
Controle_de_Vendas e suas 
tabelas Clientes, Produtos, Fornecedor e Vendas, com variedades 
37 
 
de tipos de campos, onde se pôde gerenciar dados de diferentes 
formas, com grande variedade de comandos SQL. 
Além dos comandos elementares e essenciais, foi possível abordar 
questões mais sofisticadas ao avançar e estabelecer restrições 
maiores ao manuseio do banco de dados. Abordamos elementos 
importantes, como criação e manipulação de dados com views, 
criação de sequências e índices. 
No tópico sobre tecnologias emergentes para bancos de dados, 
apresentaram-se tendências e conceitos de banco de dados não 
relacionais e suas aplicações, assim como do banco de dados 
orientado a objetos e suas aplicações. 
Em segurança em banco de dados, foram abordados aspectos 
importantes, como definição de perfis de usuário e ataques típicos 
em bancos de dados através do SQL injection, apresentando-se 
sugestões de soluções de segurança. 
Podemos concluir que o capítulo trouxe uma abordagem em 
detalhes dos principais comandos SQL e aspectos relevantes no 
universo dos bancos de dados de uma forma geral. 
Esperamos que você tenha aproveitado cada conteúdo abordado, 
testado cada comando e adquirido maior familiaridade com a 
Linguagem SQL.

Outros materiais