Escolar Documentos
Profissional Documentos
Cultura Documentos
Gerenciadores de
Bancos de Dados
Autor:
Andrea Cristina Oliveira Alves
Apostila de Sistemas Gerenciadores de Bancos de Dados
2007
Capítulo I - Introdução
SGBD
Software para processar
manipulação
Banco de dados
Software de Acesso aos
Dados
1.1.3. TABELAS
1.1.5. CAMPO
Em regra, todo arquivo deve possuir uma chave primária, que permita a identificação
inequívoca do registro, especialmente, para dar maior consistência aos processos de
inclusão, alteração e exclusão de dados. Para que não ocorram duplicatas nos valores da
chave, os campos que a compõem são de PREENCHIMENTO OBRIGATÓRIO (NOT
NULL). Na escolha da chave primária de um arquivo deve-se buscar campos que
possuam ESTABILIDADE no valor armazenado. A escolha do NÚMERO DO TELEFONE
como chave de um cadastro de clientes, por exemplo, seria inadequada, por que esse valor
pode mudar com freqüência. Sem considerar que o cliente pode ter mais de um telefone...
Deve-se também evitar a escolha de campos que possam causar AMBIGÜIDADE em
relação aos valores nele contidos. Nesse sentido, seria inadequado a escolha do campo
NOME para chave de um cadastro de clientes, haja vista, que um mesmo nome pode ser
escrito de várias formas. Por exemplo: LUÍS, LUIZ, LOUIS, LOYS, LUYS.
A chave secundária pode ser formada por um campo ou pela combinação de campos
(SIMPLES / COMPOSTA). Ë utilizada como parâmetro (filtro) para seleção de registros no
arquivo em consultas, emissão de relatórios ou processos de atualização simultânea de um
grupo de registros. Por exemplo, para aumentarmos o valor do salário dos analistas em
10%, poderíamos utilizar o campo FUNÇÃO do arquivo CADASTRO DE FUNCIONÁRIOS
como parâmetro (chave secundária) no processo de seleção dos registros a serem
alterados. Em síntese, a chave secundária é o campo ou combinação de campos do
arquivo que permite a recuperação de mais de um registro no arquivo.
Portanto, não possui a característica de unicidade proposta para a chave primária.
Exercícios
• toda vez que for necessário atualizar um arquivo de um grupo, então todos os
grupos devem ser atualizados para manter a integridade dos dados no ambiente
como um todo;
Um banco de dados pode incluir uma variedade de dados que estão inter-
relacionados de várias formas. Um SGBD deve fornecer recursos para se representar uma
grande variedade de relacionamentos entre os dados, bem como, recuperar e atualizar os
dados de maneira prática e eficiente.
Um SGBD deve fornecer recursos para recuperação de falhas tanto de software quanto de
hardware.
Capítulo 3. Arquitetura de SGBD´S
Cada usuário utiliza diferentes linguagens para utilizar um sgbd. Algumas destas
técnicas são chamadas de sub-linguagem, ou seja, linguagens que acopladas a
outras, produzem os efeitos esperados.
Uma visão externa é, portanto, o conteúdo do banco de dados visto por algum
usuário determinado (ou seja, para esse usuário a visão externa é o banco de dados).
Por exemplo, um usuário do Departamento de Pessoal poderia considerar o banco de
dados uma coleção de ocorrências de registros de departamento empregados, e ele
poderia não ter nenhum conhecimento das ocorrências de registros de fornecedores e
peças vistas pelos usuários do Departamento de Compras.
Assim, em geral, uma visão externa consiste em muitas ocorrências de cada um
dentre muitos tipos de registros externos (não necessariamente a mesma coisa que uni
registro armazenado).* A sublinguagem de dados do usuário é definida em termos de
registros externos; por exemplo, uma operação DML de busca obterá ocorrências de
registros externos, não ocorrências de registros armazenados. Ou seja, será feita a
busca no nível conceitual e não no nível interno.
Para que isto funcione, tem de haver uma definição do mapeamento entre o
esquema externo e o esquema conceitual subjacente.
3.1.3.NÍVEL INTERNO
A visão interna é descrita por meio do esquema interno, que não somente define
os diversos tipos de registros armazenados mas também especifica quais índices
existem, como os campos armazenados estão representados, em que sequência
física estão os registros armazenados, e assim por diante
Além dos três níveis básicos, esta arquitetura envolve certos mapeamentos: um
mapeamento conceitual/interno e vários mapeamentos externos/conceitual:
o O mapeamento conceitual/interno define a correspondência entre a
visão conceitual e o banco de dados armazenado;
o Um mapeamento externo/conceitual define a correspondência entre uma
visão externa específica e a visão conceitual.
Descrevemos até agora neste capítulo os sistemas de bancos de dados sob o ponto de
vista da cbamada ar-quitetura ANSI/SPARC.
• O servidor é o próprio SGBD. Ele admite todas as funções básicas de SGBDs -definição
de dados, manipulação de dados, segurança e integridade cie dados, e assim por diante.
Em particular, ele oferece todo o suporte de nível externo, conceitual e interno que
examinamos anteriormente. Assim, o termo "servidor" neste contexto é tão-somente um
outro nome para o SGBD.
Usuários finais
Clientes
Servidor
Banco de dados
Vamos aprofundar o exame da questão de aplicações escritas pelo usuário versus
aplicações fornecidas pelo fabricante:
• Aplicações escritas pelo usuário são basicamente programas aplicativos
comuns, escritos (em geral) em uma linguagem de programação convencional de
terceira geração (L3G), como C ou COBOL, ou então em alguma linguagem
proprietária de quarta geração (L4G) - embora em ambos os casos a linguagem
precise ser de algum modo acoplada a uma sublinguagem de dados apropriada.
• Aplicações fornecidas por fabricante (chamadas frequentemente de
ferramentas - tools) são aplicações cuja finalidade básica é auxiliar na criação e
execução de outras aplicações! As aplicações criadas são aplicações adaptadas a
alguma tarefa específica (elas podem não ser muito semelhantes às aplicações
no sentido convencional; de fato, a finalidade das ferramentas é permitir aos
usuários, em especial aos usuários finais, criar aplicações sem ter de escrever
programas em uma linguagem de programação convencional). Por exemplo,
uma das ferramentas fornecidas pelo fabricante será um gerador de relatórios,
cuja finalidade é permitir que os usuários finais obtenham relatórios formatados
a partir do sistema sob solicitação. Qualquer solicitação de relatório pode ser
considerada um pequeno programa aplicativo, escrito em uma linguagem de
geração de relatórios de nível muito alto (e finalidade especial).
As ferramentas fornecidas pelo fabricante podem ser divididas em diversas classes mais
ou menos distintas:
a. Processadores de linguagem de consulta.
b. Geradores de relatórios.
c. Subsistemas gráficos de negócios.
d. Planilhas eletrônicas.
e. Processadores de linguagem natural.
f. Pacotes estatísticos.
g. Ferramentas para gerenciamento de cópias ou "extração de dados".
h. Geradores de aplicações (inclusive processadores L4G).
i. Outras ferramentas para desenvolvimento de aplicações, inclusive produtos de
engenharia de software auxiliada pelo computador (CASE - computer-aided software
engineering).
Encerramos esta seção com uma referência para o que se segue. Como o sistema
por completo pode estar tão claramente dividido em duas partes, servidores e clientes,
surge a possibilidade de executar os dois em máquinas diferentes. Em outras palavras,
existe o potencial para o processamento distribuído. O processamento distribuído
significa que máquinas diferentes podem estar conectadas entre si para formar algum
tipo de rede de comunicações, de tal modo que uma única tarefa de processamento de
dados possa ser dividida entre várias máquinas na rede. Na verdade, essa possibilidade
é tão atraente - por uma variedade de razões, principalmente de ordem económica -
que o termo "cliente/servidor" passou a se aplicar a quase exclusivamente ao caso em
que o cliente e o servidor estão de fato localizados em máquinas diferentes.
Exercícios
1. Explique os três níveis da arquitetura definida pela Ansi/Parc
2. Qual é a função do mapeamento
3. Explique a arquitetura Cliente/Servidor
Capítulo 5. Transações
5.1. TRANSAÇÕES
Uma transação é uma unidade lógica de trabalho; ela começa com a execução de
uma operação BEGIN TRANSACTION e termina com a execução de uma operação
COMMIT ou ROLLBACK. Considere a possibilidade da existencia de uma transação cuja
finalidade é transferir a quantia R$100 da conta 123 para a conta 456. Como você pode ver,
o que presumivelmente deveria ser uma operação indivisível - "transferir dinheiro de uma
conta para outra" - de fato envolve duas atualizações separadas no banco de dados. Além
do mais, o banco de dados está em um estado incorreto entre essas duas atualizações, no
sentido de que não reflete um estado de coisas válido no mundo real; logicamente, uma
transferência no mundo real, de uma conta para outra, não deverá afetar a soma total de
reais nas respectivas contas, mas, em nosso exemplo, a quantia de R$100
temporariamente ficará faltando entre as duas atualizações. Assim, uma unidade lógica de
trabalho, que é uma transação, não envolve necessariamente uma única operação sobre o
banco de dados. Em vez disso, ela geralmente envolve uma sequência de várias dessas
operações, cuja finalidade é transformar um estado correto do banco de dados em outro
estado também correto, sem necessariamente preservar a correção em todos os pontos
intermediários.
BEGIN TRANSACTION;
UPDATE CONTA 123 { SALDO := SALDO - $100 } ;
IF ocorreu algum erro THEN GO TO UNDO ; END IF ;
UPDATE CONTA 456 { SALDO := SALDO + $100 } ; IF ocorreu algum erro THEN GO TO UNDO ;
END IF ;
COMMIT ; /* término bem sucedido */
GO TO
/* término mal sucedido */
FINISH ;
UNDO :
Vejamos como ele funciona. Para simplificar, suponha que a transação tenha concluído
com sucesso seu processamento de banco de dados; assim, a instrução no âmbito do
sistema que ela emite é COMMIT, e não ROLLBACK. Ao receber essa requisição de
COMMIT, o coordenador executa o seguinte processo em duas fases:
• Preparar: Primeiro, ele instrui todos os gerenciadores de recursos a ficarem prontos para
"seguir qualquer caminho" na transação. Na prática, isso significa que cada participante
do processo - ou seja, cada gerenciador de recursos envolvidos - deve forçar todas as
entradas de log de recursos locais utilizados pela transação em seu próprio log físico (isto
é, para o armazenamento não volátil; aconteça o que acontecer daí por diante, o
gerenciador de recursos terá agora um registro permanente do trabalho que realizou para
a transação, e será capaz de completar o COMMIT de suas atualizações ou cancelá-las,
como for preciso). Supondo-se que a gravação forçada seja bem-sucedida, o gerente de
recursos responderá agora "OK" ao coordenador; caso contrário, ele responderá "Não
OK".
A serialização das escalas geradas por transações concorrentes pode ser garantida por
meio de um entre vários mecanismos chamados de esquemas de controle de
concorrência. O componente de gerenciamento de controle de concorrência do banco de
dados é o responsável pela manipulação dos esquemas de controle da concorrência. O
componente de gerenciamento da recuperação de um banco de dados é o responsável por
assegurar as propriedades de atomicidade e durabilidade das transações.
Bloqueio
Ao ocorrer uma falha durante uma transação, soluções do tipo re-executar ou ignorar
poderão levar o banco a um estado inconsistente. O problema está em modificar
o banco de dados sem que a transação será de fato efetivada.
Para evitar inconsistências é necessário que todas ou nenhuma alteração
relacionadas a uma transação sejam feitas no banco. Para manter a atomicidade deve-
se mandar todas as alterações para um armazenamento estável, sem modificar o
banco de dados.
Isto permitir que,
apesar de falhas, manter um estado consistente dos dados. Abaixo estão descritas duas
técnicas de realizar essa gravação.
5.3.4. Checkpoints
Como refazer todas as operações do log é custoso e o tamanho do log tende a crescer
rápido, a recuperação de dados utilizando o log pode ser muito demorada.
Muitas transações já foram efetivadas em disco, não sendo necessário refazê-las.
Uma solução para esse problema é a criação de checkpoints, marcas no log onde todas as
operações de escrita anteriores ao checkpoint já foram efetivadas em disco.
Logo só é preciso refazer as transações concluídas que foram feitas depois da
criação do checkpoint.
Durante a criação do checkpoint, todos os registros de log residentes em memória são
gravados em armazenamento estável, seguido de blocos de buffer modificados.
Somente após isto, é armazenado o registro de log que marca a conclusão do
checkpoint.
Vamos pensar no seguinte exemplo: Vamos supor que ao invés de lançar no banco que
um determinado funcionário trabalhou 40 horas por semana, o operador digite 400. Qual
seria uma forma de evitar que isto aconteça? Basta definir através de restrições que a
carga horária de um funcionário só poderá variar entre 0 e 40 horas semanais. Ainda
existirá uma margem de erro, porém a delimitação impede erros gritantes e diminui as
possibilidades. Outro exemplo é o seguinte: Definir uma regra para que todos os
fornecedores de uma determinada localidade tenham status X. Outra regra para que não
possa haver dois fornecedores com o mesmo código. Caso alguém altere o código de um
fornecedor, devem ser comparados todos os campos que já existem no banco para saber
se não há outro com este código ou se este fornecedor já existe com outro código.
Cada remessa deverá envolver um fornecedor existente, ou seja, isto evita que o operador
lance um código inexistente na hora de enviar o pedido.
A integridade referencial é mais conhecida, são as Foreign Keys, nada mais é que eu
aceitar valores em minha entidade que estão em outra entidade, isto é possível a partir da
integridade de entidade, eu apenas consigo criar Foreign Keys a partir de uma Primary
Key, a integridade referencial consiste também em check em nível de tabela e não em
nível de campo, no ato da criação da tabela crio um check, por exemplo:
Tenho uma tabela com 2 campos Medico1, Medico2, e quero que um dos campos sempre
seja preenchido não
importa qual, para isto
CodDep(PK) Nome MatrGerent
preciso de um check
D5 Pessoal NULL
Empregado
Empregado(matrícula,nome,salário,matr_supervisor)
"O número de horas máximo que um empregado pode trabalhar num projeto é 40 horas".
6.3.1.Inserção
6.3.2.Remoção
=> viola a regra de integridade referencial. (empregados que estão alocados neste
departamento.)
• Rejeitar a remoção
• Dar o efeito cascata na remoção, removendo todas as linha referenciadas por
aquela linha que está sendo removida.
• Modificar os atributos referenciados para novos valores ou nulos (caso não façam
parte da chave primária).
• Dos três tipos de restrições de integridade discutidas, uma operação de remoção
poderá violar apenas a integridade referencial.
6.3.3. Modificação
Curso
Codcurso(PK) Descrição CodUnid
C3 Farmácia 156
C4 Administração 156
C5 Pedagogia 156
Aluno
Diante destas informações, informe se as alterações abaixo são possíveis nas tabelas
alunos e cursos. Caso não seja possível, informe qual é o tipo de restrição de integridade
que a mesma está violando:
1- Inserir (‘1112’, ‘Ana Maria Bernardes’, ‘Rua das rosas, 350’ , ‘C8’)
2- Inserir (‘1796’, ‘João da Silva’, ‘Rua 107, 52’ , ‘C3’)
3- Inserir (null, ‘Carlos Santana’, ‘Rua Afonso Pena, 12’ , ‘C4’)
4- Deletar (‘C1’, ‘Sistemas de Informação´, ´156’)
5- Alterar o código de curso C2 para C16
6- Alterar o endereço do Aluno cujo RA é 1112.
7- Alterar o código do curso do aluno com RA 1050 para C3
8- Inserir (‘1012’, ‘José Maria Rocha’, ‘Rua do Calvário, 115’ , ‘C10’)
9- Deletar o aluno cujo RA é 1123.
10- Inserir (‘1175’, ‘Silvana Andrade’, ‘Av. João Pinheiro, 46’ , null)
Exemplo
– débitos diários de parcelas de empréstimos
create procedure PagaEmpréstimo as
update Empréstimos
set ValorTotal = ValorTotal – ValorParcela,
NroParcelas = NroParcelas – 1
where DiaVencimento = day(getdate())
• Chamada de um storedprocedure
exec PagaEmpréstimo
Exemplo:
Mostrar ao usuário que o valor do salário não é compatível ao estado civil do funcionário.
a) create trigger SalárioInjusto
after insert, update on Empregados
if exists (select *
from Empregados
where estadoCivil = casado
and salário < 250.00)
begin
print ‘salário injusto para o estado civil!’
exec CorrigeSalário
end
b) Se a data de retorno do vôo for anterior à data de partida, emitir uma mensagem e não
completar a transação.
c) Trigger para executar erro em aumento de salário.
create trigger AumentoSalário
before update on Empregados
referencing NEW salário as SalárioNovo when
salário > SalárioNovo
(Rollback Transaction)
Capítulo 7. Segurança em Bancos de Dados
7.1.1. Autorização
A correta concessão de permissões aos usuários é um ponto fundamental no
esquema de segurança de uma aplicação que faça uso de banco de dados. A escolha ou
configuração errada de níveis de acesso a usuários pode resultar em resultados
desastrosos tanto do ponto de vista funcionalidade como, principalmente, do ponto de vista
da segurança. Abaixo segue uma breve explanação sobre os diversos níveis de
permissão.
Numa aplicação de porte deve existir uma distinção bastante clara entre os diversos
níveis de acesso para cada usuário bem como o papel de cada usuário no sistema.
Imaginando uma aplicação como um Enterprise Resource Planning (ERP), existe a
necessidade de determinados usuários possuírem apenas privilégios de read sobre
determinado conjunto de dados ou sobre toda a base de dados. Outros usuários poderiam
ter permissão de insert para determinados tipos de dados como cadastro de funcionários,
departamentos, controle de finanças; enquanto outro conjunto de usuários possuiria nível
de acesso de insert, update e remove para todas as partes da aplicação. Além de todos
os usuários de manipulação de dados, é prudente salientar a necessidade de um usuário
como responsável pela definição e modelagem da base. Concluindo: usuários devem ter
acesso estritamente ao que precisam ter acesso. Usuários de leitura da base, utilizados
para realizar consultas, colhendo informações em função dos dados da base, usualmente,
não devem necessitar de permissão de criação de visões ou gatilhos, por exemplo.
7.1.3. Visões
7.1.4. Criptografia