BANCO DE DADOS II
BANCO DE DADOS II
SENAC-RS
SUMRIO
1. INTRODUO .............................................................................................................. 6
2. SQL Procedural............................................................................................................. 8
2.1.
Store Procedures.................................................................................................... 8
2.1.1.
2.1.2.
2.1.3.
2.2.
Funes ................................................................................................................ 19
2.2.1.
2.3.
2.3.1.
2.4.
3. Transaes ................................................................................................................. 30
3.1.
3.2.
COMMIT ............................................................................................................... 32
3.3.
ROLLBACK .......................................................................................................... 32
3.4.
Na prtica ............................................................................................................. 32
3.5.
Deadlocks ............................................................................................................. 35
4.2.
Introduo............................................................................................................. 40
5.2.
SENAC-RS
5.2.1.
6. Segurana. .................................................................................................................. 45
6.1.
6.2.
6.2.1.
6.2.2.
6.2.3.
6.2.4.
6.2.5.
SENAC-RS
1. INTRODUO
Para ficar mais claro o contedo que abordaremos neste e nos prximos
captulos vamos fazer uma descrio de alguns conceitos: programa, rotina,
sub-rotina, procedimento e gatilho. As seguintes descries esto de acordo
com a Wikipdia Enciclopdia livre:
Sub-rotina - a parte de uma rotina que realiza uma tarefa especfica num
programa de computador.
SENAC-RS
Linguagem
estruturada
procedimental
usada
ser
SENAC-RS
2. SQL Procedural
2.1.
Store Procedures
SENAC-RS
excessivo
da
estrutura
do
banco
de
dados
pelos
desenvolvedores de aplicaes.
Por exemplo, suponha que diversos usurios desejem fazer uma determinada
consulta. A execuo desse conjunto de comandos por diversos usurios
simultaneamente vai gerar um grande trfego de informaes pela rede, o que
no ocorre se esse conjunto de comandos for definido usando um
procedimento armazenado no prprio servidor do banco de dados e o usurio
solicite apenas sua execuo e o retorno do resultado.
Desta forma o usurio solicita ao servidor que execute a operao e lhe
devolva o resultado, no 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 invs de call.
2.1.1.
SENAC-RS
CREATE PROCEDURE
Para criar uma store procedure basta utilizar a palavra reservada CREATE,
seguida da palavra PROCEDURE, os parmetros se se necessrio e as
palavras BEGIN e END. Toda a lgica do procedimento fica entre as palavras
BEGIN e END.
OUT] nome_parmetro
SENAC-RS
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 operao.
Detalhando um pouco melhor nosso exemplo vemos que ele tambm faz
alguns joins com trs tabelas, o que para um usurio, ou mesmo aplicao
cliente, poderia ser oneroso e custoso. J ao contrrio, estes comandos
estando no servidor sob a forma de um procedimento, simplificam sua
execuo tanto para seu uso quanto para as questes de performance.
ALTER PROCEDURE
No MySQL, diferente de outros SGBDs, o comando ALTER PROCEDURE
no permite que sejam alterados os parmetros ou o corpo do procedimento.
Para isto necessrio excluir e recriar o procedimento atravs dos comandos
DROP e CREATE.
SENAC-RS
DROP e CREATE
J vimos o comando create e logo como criar um procedimento. O comando
para excluir um procedimento DROP, o mesmo utilizado para excluir uma
EXISTS. Abaixo
SENAC-RS
Observe que primeiro exclumos a procedure (linha 3), mas somente se ela
existir o que garantido pela opo IF EXISTS, caso contrrio nada
acontece. J na linha 5 criamos novamente a procedure, adicionando um
parmetro de entrada (IN) chamado filme do tipo varchar que usado na
clusula where.
2.1.2.
Procedimentos Condicionais
SENAC-RS
enfim, algo que sinalize para o procedimento que deve agir de maneira A e
no B.
Sabemos que em uma query normal poderamos usar o operador like, logo
podemos recriar a rotina apenas usando o like ao invs do operador =
correto? Vejamos o exemplo abaixo como ficaria:
SENAC-RS
Observe que agora so listados trs filmes, todos que possuem a palavra
african em seu ttulo.
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 parmetro que determinar qual tipo de busca deve
ser feita.
Uma aplicao cliente que tem uma tela de relatrios, que lista exatamente o
resultado do nosso procedimento, o ttulo dos filmes alugados e suas
quantidades. Na parte superior da tela existe um campo de texto onde o
usurio insere o nome do filme que deseja listar (um campo de busca) porm
ao seu lado existe uma opo de marcar para fazer a busca exata, um
checkbox. Esta aplicao dever passar para o SGBD apenas o parmetro do
ttulo que se deseja listar e um outro parmetro do tipo booleano (verdadeiro ou
falso) o qual provem do checkbox e informa se a pesquisa deve ser exata ou
no: se verdadeiro sim, caso contrrio no.
Agora que visualizamos uma situao real, podemos recriar nossa procedure
para que ela atenda o escopo acima.
SENAC-RS
II.
III.
SENAC-RS
2.1.3.
Chamada da sp acima:
IN:
SENAC-RS
OUT:
procedimento e seu novo valor passado de volta para o escopo que fez a
chamada.
INOUT:
SENAC-RS
Desafio
1) Pegando o exemplo desta ltima procedure criada tente criar um
procedimento que:
Possua mais uma diferente lgica, ou seja, forma de executar, que retorne a
mesma listagem de filmes e suas quantidades, porm sem nenhum filtro sobre
os ttulos dos filmes. Para isto voc pode usar mais ou menos parmetros e
provavelmente mais uma condio na estrutura de execuo.
2.2.
Funes
SENAC-RS
2.2.1.
Funes escalares
A instruo para criar uma funo simples, basta utilizar o comando CREATE
FUNCTION em conjunto com a lista de parmetros (caso necessrio) a serem
usados. A sintaxe de criao de uma funo descrita no quadro abaixo.
SENAC-RS
SENAC-RS
Para comear, vamos criar uma funo que retorne a quantidade total de filmes
alugado no banco de dados sakila. O comando para criar essa funo
descrito no destaque abaixo.
Observe que foi criada uma funo denominada fn_qtdAlugadosl, sem qualquer
parmetro, que retorna um valor do tipo inteiro. Os comandos que definem sua
operao encontram-se entre as palavras chave BEGIN e END.
Analisando melhor os comandos, vemos o uso do comando DECLARE para
definir uma varivel intitulada qtde_vendas do tipo inteiro. Em seguida feita
uma consulta (SELECT) da quantidade total de filmes na tabela rental. Esse
valor armazenado na varivel total usando a clusula INTO. Finalmente, a
clusula RETURN define que a funo retorna o valor contido na varivel total.
Aps termos criado a funo podemos us-la consultas, atribuio de variveis
ou mesmo dentro de outros procedimentos. Em nosso exemplo usaremos um
select simples:
SENAC-RS
2.3.
Gatilhos (triggers)
SENAC-RS
Quando definimos uma trigger precisamos definir se ela ser disparada antes
SENAC-RS
Recalcular o preo de
Sintaxe:
DEFINER: Quando o TRIGGER for disparado, caso esta opo tenha sido
utilizada, ser usada para checar com quais privilgios ser disparado. Utilizar
os privilgios do usurio informado em user ou os privilgios do usurio atual
(CURRENT_USER). Caso essa sentena seja omitida da criao do
TRIGGER, o valor padro desta opo CURRENT_USER;
trigger_name:
trigger_time:
Associa
trigger
ao
DELETE ou UPDATE;
tbl_name:
aguardando o trigger_event;
trigger_stmt:
SENAC-RS
2.3.1.
Para entender estes operadores vamos criar uma trigger simples sobre a tabela
SENAC-RS
Certo, o comando deve ter executado sem problemas, para ter certeza do
resultado pode-se executar novamente a consulta com o select LIMIT 5.
SENAC-RS
Mas para entender o que nossa trigger fez realmente vamos visualizar os
dados da tabela testeTG:
SENAC-RS
2.4.
Boas Prticas
SENAC-RS
3. Transaes
SENAC-RS
Isolamento
(isolation):
garante
que
transaes
diferentes no
3.1.
SENAC-RS
3.2.
COMMIT
3.3.
ROLLBACK
3.4.
Na prtica
Utilizando o banco de dados sakila, vamos criar uma transao para realizar o
aluguel de um DVD. Para tanto vamos considerar que a regra de negcio para
criar um aluguel vlido a seguinte:
Primeiro, confirmar que o item de inventrio dado est em estoque;
Em seguida, inserir uma linha na tabela de locao, criando o objeto
aluguel;
Depois inserir uma linha na tabela de pagamento, referenciando o
aluguel recm criado e dando o mesmo como pago.
SENAC-RS
Ento
finalmente inserimos o
executados
com
sucesso
SENAC-RS
se,
somente
se,
todos
os
comandos
SELECT
* FROM
Desafio:
Nesta transao que criamos, existe um pequeno erro lgico, voc consegue
identificar qual o erro?
Tente recriar esta transao fazendo estes dois ajustes; utilizar a informao
retornada pela funo INVENTORY_IN_STOCK() e criar a validao se o
SENAC-RS
3.5.
Deadlocks
SENAC-RS
simples, essa recomendao pode ser fcil de seguir, mas em sistemas com
um grande nmero e complexidade de transaes, pode ser bastante difcil
assegurar isso. A definio de transaes, portanto, pode no ser uma tarefa
trivial.
SENAC-RS
seja conhecida e nem acessada, neste caso uma view que traga apenas as
informaes necessrias se faz muito til.
4.1.
CREATE VIEW
SENAC-RS
Aps criar a View para visualizar seus dados basta acess-la exatamente como
uma tabela, conforme exemplo abaixo:
ALTER VIEW
O comando para alterao de uma View tambm simples, basta utilizar o
comando ALTER VIEW nome_da_view AS, seguido da query responsvel por
trazer os resultados da view. Ex:
DROP VIEW
O comando para excluir uma view igual ao de excluir uma tabela, exceto pela
palavra chave VIEW ao invs de TABLE. Ex:
SENAC-RS
Importante:
Lembrando que por se tratar de uma tabela virtual, quando ela excluda os
dados no so deletados, pois eles continuam nas suas tabelas de origem.
4.2.
O mais
O MySQL permite atualizar e excluir os dados atravs das vises, desde que
na viso no tenha valores agregados, tais como SUM, COUNT e AVG, e nem
clusulas como GROUP BY e DISTINCT.
Tambm no possvel atualizar ou inserir dados em uma view que no
possuam em sua definio todos os campos NOT NULL das tabelas as quais
fazem referncias. Isto acontece porque quando a view atualizada as
respectivas tabelas tambm o so, mas caso os campos NOT NULL no
estejam na definio da view eles seriam atualizados com valor NULO, o que
no permitido pela restrio da tabela.
SENAC-RS
5.1.
Introduo
5.2.
SENAC-RS
InnoDB:
Example:
SENAC-RS
para
ilustrar
aos
programadores
como
se
inicia
Arquive:
Tambm permitido definir um motor apenas para uma tabela especfica, para
isto deve-se definir o engine ao criar a tabela, veja a sintaxe no exemplo
abaixo:
SENAC-RS
Como visto acima, a sintaxe para se definir um engine diferente para uma
tabela bem simples, bastando acrescentar a definio engine
<tipo_engine>.
5.2.1.
Por exemplo, pode ser desejar deixar o sistema mais lento em pontos que no
necessita, porm com uma capacidade de armazenamento maior. Sempre que
for necessrio pode se optar por storage engine diferente; e neste caso no
requerido instalar nada de novo no sistema, to pouco fazer algum tipo de
alterao significante do processamento ou de cdigo.
Abaixo temos uma figura que representa a arquitetura do MySQL com storage
engines.
SENAC-RS
SENAC-RS
6. Segurana.
O MySQL por ser um banco muito utilizado e gratuito tambm uma fonte de
risco grande, uma vez que muitos usurios conhecem seu funcionamento, suas
senhas e configuraes padres. Portanto conhecer bem o seu SGBD e saber
aplicar as melhores prticas na administrao do mesmo so vitais para
segurana e continuidade do banco de dados e dos sistemas que rodam sobre
ele.
6.1.
Tipos de Segurana
SENAC-RS
6.2.
SENAC-RS
6.2.1.
Se o prompt do mysql apareceu, ento a senha est correta e iremos usar ela.
Se ao invs disso aparecer:
Isso quer dizer que a senha est errada. Como citado antes, muitas das vezes
a senha do MySQL est vazia depois da instalao, para verificar, retire o
parmetro -p (de password) e veja se cai no prompt MySQL:
6.2.2.
Configurando senhas
SENAC-RS
Se voc souber o que esta fazendo, voc tambm pode manipular diretamente
a tabela privilgios:
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.
SENAC-RS
Voc pode desejar deixar a senha de root em branco para que voc no
precise especific-la quando realizar configuraes adicionais ou testes.
Entretanto, tenha certeza de configur-la antes de utilizar sua instalao para
qualquer ambiente de produo.
voc
executa
mysqld
--help).
Depois
execute
script
6.2.3.
SENAC-RS
Comandos:
GRANT:
REVOKE:
Sintaxe:
Nvel Global
Privilgios globais aplicam para todos os bancos de dados em um determinado
servidor. Estes privilgios so armazenados na tabela mysql.user. Os
comandos GRANT ALL ON *.* e REVOKE ALL ON *.* concedero e revogaro
apenas privilgios globais.
SENAC-RS
6.2.4.
Tipos de privilgios
ALTER
CREATE
CREATE
TEMPORARY
TABLES
DELETE
DROP
EXECUTE
FILE
INDEX
INSERT
LOCK TABLES
Permite
uso
privilgio SELECT.
de LOCK
TABLES em
tabelas
nas
quais
se
tem
SENAC-RS
PROCESS
REFERENCES
Para o futuro
RELOAD
REPLICATION CLIENT
REPLICATION SLAVE
Necessrio para a replicao dos slaves (para ler logs binrio do master).
SELECT
SHOW DATABASES
SHUTDOWN
SUPER
UPDATE
USAGE
GRANT OPTION
(isto
quando
voc
usar
uma
clusula column_list)
O MySQL permite que voc crie privilgios a nvel de banco de dados mesmo
se o banco de dados no existir para tornar fcil de se preparar para o uso do
banco de dados. Atualmente, no entanto, o MySQL no permite criar
permisses de a nvel de tabela se a tabela no existir. O MySQL no revogar
automaticamente qualquer privilgio, mesmo se voc apagar uma tabela ou
banco de dados.
SENAC-RS
Voc pode configurar privilgios globais utilizando a sintaxe ON *.*. Voc pode
configurar privilgios 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 privilgios somente para este banco de dados. (AVISO: Se
voc especificar ON * e voc no tem possui um banco de dados aberto, ir
afetar os privilgios globais!).
MySQL
suporta
formato usurio@mquina.
especificao
Se
voc
do
desejar
valor user_name no
especificar
uma
string user contendo caracteres especiais (como o -), ou uma string contendo
caracteres especiais ou meta caracteres (como o %), voc pode colocar o
usurio ou o nome de mquina entre aspas (por exemplo, 'usurioteste'@'mquina-teste').
SENAC-RS
de
dados
AND
privilgios
de
6.2.5.
GRANT
OPTION,
SENAC-RS
modificar
as
tabelas
de
permisses
manualmente
(utilizando
flush-privileges para
No
MySQL
os
privilgios
SENAC-RS
concedidos
no
so
removidos
REFERNCIAS
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/
SENAC-RS