Escolar Documentos
Profissional Documentos
Cultura Documentos
br
BANCO DE DADOS II
www.cliqueapostilas.com.br
BANCO DE DADOS II
SUMÁRIO
1. INTRODUÇÃO .............................................................................................................. 6
2. SQL Procedural............................................................................................................. 8
3. Transações ................................................................................................................. 30
5.1. Introdução............................................................................................................. 40
www.cliqueapostilas.com.br
6. Segurança. .................................................................................................................. 45
1. INTRODUÇÃO
Para ficar mais claro o conteúdo que abordaremos neste e nos próximos
capítulos vamos fazer uma descrição de alguns conceitos: programa, rotina,
sub-rotina, procedimento e gatilho. As seguintes descrições estão de acordo
com a Wikipédia – Enciclopédia livre:
Sub-rotina - é a parte de uma rotina que realiza uma tarefa específica num
programa de computador.
2. SQL Procedural
Por exemplo, suponha que diversos usuários desejem fazer uma determinada
consulta. A execução desse conjunto de comandos por diversos usuários
simultaneamente vai gerar um grande tráfego de informações pela rede, o que
não ocorre se esse conjunto de comandos for definido usando um
procedimento armazenado no próprio servidor do banco de dados e o usuário
solicite apenas sua execução e o retorno do resultado.
Desta forma o usuário solicita ao servidor que execute a operação e lhe
devolva o resultado, não se preocupando com a estrutura do banco de dados.
Em outros SGBDs o comando utilizado pode ser diferente, como por o exemplo
no SQL Server, cujo comando é exec ao invés de call.
CREATE PROCEDURE
Para criar uma store procedure basta utilizar a palavra reservada CREATE,
seguida da palavra PROCEDURE, os parâmetros se se necessário e as
palavras BEGIN e END. Toda a lógica do procedimento fica entre as palavras
BEGIN e END.
Visto que esse tipo de pesquisa tende a ser realizado diariamente num banco
de dados, como o nosso banco de exemplo sakila, seria útil definir uma
procedure para executar essa operação.
Detalhando um pouco melhor nosso exemplo vemos que ele também faz
alguns joins com três tabelas, o que para um usuário, ou mesmo aplicação
cliente, poderia ser oneroso e custoso. Já ao contrário, estes comandos
estando no servidor sob a forma de um procedimento, simplificam sua
execução tanto para seu uso quanto para as questões de performance.
ALTER PROCEDURE
DROP e CREATE
Observe que primeiro excluímos a procedure (linha 3), mas somente se ela
existir o que é garantido pela opção “IF EXISTS“, caso contrário nada
acontece. Já na linha 5 criamos novamente a procedure, adicionando um
parâmetro de entrada (IN) chamado filme do tipo varchar que é usado na
cláusula where.
enfim, algo que sinalize para o procedimento que deve agir de maneira “A” e
não “B”.
Sabemos que em uma query normal poderíamos usar o operador like, logo
podemos recriar a rotina apenas usando o like ao invés do operador “=”
correto? Vejamos o exemplo abaixo como ficaria:
Observe que agora são listados três filmes, todos que possuem a palavra
“african” em seu título.
Nossa rotina está quase pronta, mas ainda queremos mais; Queremos que o
procedimento possa fazer uma busca exata, como no primeiro exemplo, ou
uma busca usando o like como nesta última. E isto ainda deverá ser
decidido por um segundo parâmetro que determinará qual tipo de busca deve
ser feita.
Uma aplicação cliente que tem uma tela de relatórios, que lista exatamente o
resultado do nosso procedimento, o título dos filmes alugados e suas
quantidades. Na parte superior da tela existe um campo de texto onde o
usuário insere o nome do filme que deseja listar (um campo de busca) porém
ao seu lado existe uma opção de marcar para fazer a busca exata, um
checkbox. Esta aplicação deverá passar para o SGBD apenas o parâmetro do
título que se deseja listar e um outro parâmetro do tipo booleano (verdadeiro ou
falso) o qual provem do checkbox e informa se a pesquisa deve ser exata ou
não: se verdadeiro sim, caso contrário não.
Agora que visualizamos uma situação real, podemos recriar nossa procedure
para que ela atenda o escopo acima.
Chamada da sp acima:
Desafio
1) Pegando o exemplo desta última procedure criada tente criar um
procedimento que:
Possua mais uma diferente lógica, ou seja, forma de executar, que retorne a
mesma listagem de filmes e suas quantidades, porém sem nenhum filtro sobre
os títulos dos filmes. Para isto você pode usar mais ou menos parâmetros e
provavelmente mais uma condição na estrutura de execução.
2.2. Funções
No caso do MySQL, não é permitido que uma função retorne uma tabela.
Desse modo, vamos discutir apenas como criar e utilizar as funções escalares.
A instrução para criar uma função é simples, basta utilizar o comando CREATE
FUNCTION em conjunto com a lista de parâmetros (caso necessário) a serem
usados. A sintaxe de criação de uma função é descrita no quadro abaixo.
É uma boa prática, e em alguns casos até necessário, que se declare uma das
opções acima.
Para começar, vamos criar uma função que retorne a quantidade total de filmes
alugado no banco de dados sakila. O comando para criar essa função é
descrito no destaque abaixo.
Observe que foi criada uma função denominada fn_qtdAlugadosl, sem qualquer
parâmetro, que retorna um valor do tipo inteiro. Os comandos que definem sua
operação encontram-se entre as palavras chave BEGIN e END.
Nota-se que para “alterar” a função usamos a mesma técnica utilizada nas
store procedures, excluir a função antes com o “DROP .. IF EXISTS
....” e depois criamos novamente a função.
Para utilizar a função vamos usar o mesmo exemplo de consulta usado antes:
Começaremos usando uma definição bem sucinta e direta sobre o que são
triggers:
Chamados automaticamente:
Quando há uma tentativa de inserir, atualizar ou excluir os dados em uma
tabela, e um TRIGGER tiver sido definido na tabela para essa ação específica,
ele será executado automaticamente, não podendo nunca ser ignorado.
Quando definimos uma trigger precisamos definir se ela será disparada antes
(BEFORE) ou depois (AFTER).
Aplicação:
www.cliqueapostilas.com.br
Sintaxe:
DEFINER: Quando o TRIGGER for disparado, caso esta opção tenha sido
utilizada, será usada para checar com quais privilégios será disparado. Utilizará
os privilégios do usuário informado em user ou os privilégios do usuário atual
(CURRENT_USER). Caso essa sentença seja omitida da criação do
TRIGGER, o valor padrão desta opção é CURRENT_USER;
Para entender estes operadores vamos criar uma trigger simples sobre a tabela
category do banco de dados sakila.
Mas antes vamos criar uma tabela chamada testeTG para armazenar os
valores e entende-los melhor:
Certo, o comando deve ter executado sem problemas, para ter certeza do
resultado pode-se executar novamente a consulta com o select “LIMIT 5”.
www.cliqueapostilas.com.br
Mas para entender o que nossa trigger fez realmente vamos visualizar os
dados da tabela testeTG:
Este erro é característico dos operadores OLD e NEW, uma vez que na
operação INSERT não existe a informação “OLD”, da mesma forma que para
uma operação DELETE não existe a informação “NEW”. Este comportamento
pode ser ilustrado nos resultados da nossa tabela testeTG:
www.cliqueapostilas.com.br
3. Transações
3.2. COMMIT
3.3. ROLLBACK
3.4. Na prática
Utilizando o banco de dados sakila, vamos criar uma transação para realizar o
aluguel de um DVD. Para tanto vamos considerar que a regra de negócio para
criar um aluguel válido é a seguinte:
Desafio:
Nesta transação que criamos, existe um pequeno erro lógico, você consegue
identificar qual é o erro?
Tente recriar esta transação fazendo estes dois ajustes; utilizar a informação
retornada pela função INVENTORY_IN_STOCK() e criar a validação se o
www.cliqueapostilas.com.br
cliente possui saldo devedor e somente processar o aluguel se não existir saldo
devedor.
3.5. Deadlocks
simples, essa recomendação pode ser fácil de seguir, mas em sistemas com
um grande número e complexidade de transações, pode ser bastante difícil
assegurar isso. A definição de transações, portanto, pode não ser uma tarefa
trivial.
Views também são muito uteis quando temos consultas complexa que são
constantemente utilizadas, como consultas com vários JOINS, Ao invés de se
digitar ou enviar ao servidor toda a query, é executado apenas um select
simples. Isto também provê um nível de encapsulamento de determinadas
informações e/ou estruturas.
seja conhecida e nem acessada, neste caso uma view que traga apenas as
informações necessárias se faz muito útil.
CREATE VIEW
Após criar a View para visualizar seus dados basta acessá-la exatamente como
uma tabela, conforme exemplo abaixo:
ALTER VIEW
DROP VIEW
O comando para excluir uma view é igual ao de excluir uma tabela, exceto pela
palavra chave VIEW ao invés de TABLE. Ex:
www.cliqueapostilas.com.br
Importante:
Lembrando que por se tratar de uma tabela virtual, quando ela é excluída os
dados não são deletados, pois eles continuam nas suas tabelas de origem.
O MySQL permite atualizar e excluir os dados através das visões, desde que
na visão não tenha valores agregados, tais como SUM, COUNT e AVG, e nem
cláusulas como GROUP BY e DISTINCT.
Também não é possível atualizar ou inserir dados em uma view que não
possuam em sua definição todos os campos NOT NULL das tabelas as quais
fazem referências. Isto acontece porque quando a view é atualizada as
respectivas tabelas também o são, mas caso os campos NOT NULL não
estejam na definição da view eles seriam atualizados com valor NULO, o que
não é permitido pela restrição da tabela.
www.cliqueapostilas.com.br
A regra citada acima não é validade para campos AUTO INCREMENT, pois
campos deste tipo, embora também possam ser not null não necessitam de
um valor para inclusão de novo registro.
5.1. Introdução
Também é permitido definir um motor apenas para uma tabela específica, para
isto deve-se definir o engine ao criar a tabela, veja a sintaxe no exemplo
abaixo:
www.cliqueapostilas.com.br
Como visto acima, a sintaxe para se definir um engine diferente para uma
tabela é bem simples, bastando acrescentar a definição engine =
<tipo_engine>.
Por exemplo, pode ser desejar deixar o sistema mais lento em pontos que não
necessita, porém com uma capacidade de armazenamento maior. Sempre que
for necessário pode se optar por storage engine diferente; e neste caso não é
requerido instalar nada de novo no sistema, tão pouco fazer algum tipo de
alteração significante do processamento ou de código.
Abaixo temos uma figura que representa a arquitetura do MySQL com storage
engines.
www.cliqueapostilas.com.br
6. Segurança.
O MySQL por ser um banco muito utilizado e gratuito é também uma fonte de
risco grande, uma vez que muitos usuários conhecem seu funcionamento, suas
senhas e configurações padrões. Portanto conhecer bem o seu SGBD e saber
aplicar as melhores práticas na administração do mesmo são vitais para
segurança e continuidade do banco de dados e dos sistemas que rodam sobre
ele.
Se o prompt do mysql apareceu, então a senha está correta e iremos usar ela.
Se ao invés disso aparecer:
Isso quer dizer que a senha está errada. Como citado antes, muitas das vezes
a senha do MySQL está vazia depois da instalação, para verificar, retire o
parâmetro -p (de password) e veja se cai no prompt MySQL:
Se você souber o que esta fazendo, você também pode manipular diretamente
a tabela privilégios:
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('nova_senha')
-> WHERE user='root';
mysql> FLUSH PRIVILEGES;
Uma vez que a senha de root foi configurada, você deve informar a senha
quando se conectar ao servidor MySQL como root.
www.cliqueapostilas.com.br
Você pode desejar deixar a senha de root em branco para que você não
precise especificá-la quando realizar configurações adicionais ou testes.
Entretanto, tenha certeza de configurá-la antes de utilizar sua instalação para
qualquer ambiente de produção.
Comandos:
GRANT: Adiciona permissões ao usuário.
REVOKE: Remove permissões do usuário.
Sintaxe:
Nível Global
Privilégios globais aplicam para todos os bancos de dados em um determinado
servidor. Estes privilégios são armazenados na tabela mysql.user. Os
comandos GRANT ALL ON *.* e REVOKE ALL ON *.* concederão e revogarão
apenas privilégios globais.
ALL [PRIVILEGES] Configura todos os privilégios simples exceto WITH GRANT OPTION
FILE Permite o uso de SELECT ... INTO OUTFILE e LOAD DATA INFILE.
LOCK TABLES Permite o uso de LOCK TABLES em tabelas nas quais se tem o
privilégio SELECT.
www.cliqueapostilas.com.br
REPLICATION SLAVE Necessário para a replicação dos slaves (para ler logs binário do master).
O MySQL permite que você crie privilégios a nível de banco de dados mesmo
se o banco de dados não existir para tornar fácil de se preparar para o uso do
banco de dados. Atualmente, no entanto, o MySQL não permite criar
permissões de a nível de tabela se a tabela não existir. O MySQL não revogará
automaticamente qualquer privilégio, mesmo se você apagar uma tabela ou
banco de dados.
www.cliqueapostilas.com.br
Você pode configurar privilégios globais utilizando a sintaxe ON *.*. Você pode
configurar privilégios de bancos de dados utilizando a sintaxe ON nome_bd.*.
Se você especificar ON * e estiver com algum banco de dados aberto, será
configurado os privilégios somente para este banco de dados. (AVISO: Se
você especificar ON * e você não tem possui um banco de dados aberto, irá
afetar os privilégios globais!).
Você não pode conceder a outro usuário um privilégio que não possua; o
privilégio GRANT possibilita fornecer somente os privilégios que possuir. Esteja
ciente que quando conceder a um usuário o privilégio GRANT em um nível
particular de privilégios, qualquer privilégio que o usuário já possua (ou seja
fornecido no futuro!) nesse nível também pode ser concedido por este usuário.
Suponha que você conceda a um usuário o privilégio INSERT em um banco de
dados. Se você conceder o privilégio SELECT no banco de dados e
especificar WITH GRANT OPTION, o usuário além de poder repassar o
privilégio SELECT poderá também repassar o insert. Se você concede o
www.cliqueapostilas.com.br
Você não deve conceder privilégios ALTER a um usuário comum. Se você fizer
isto, o usuário pode tentar enganar o sistema de privilégios renomeando
tabelas!
REFERÊNCIAS
http://ftp.nchu.edu.tw/MySQL/doc/refman/4.1/pt/grant.html
http://dev.mysql.com/doc/sakila
http://dev.mysql.com/doc/refman/5.7/en/