Anda di halaman 1dari 56

SERVIO NACIONAL DE APRENDIZAGEM COMERCIAL

CURSO TCNICO EM INFORMTICA

BANCO DE DADOS II

CURSO TCNICO EM INFORMTICA

CURSO TCNICO EM INFORMTICA

BANCO DE DADOS II

Profissional responsvel pela elaborao do contedo:


Prof Edimar Gusmo Martins

SENAC-RS

SUMRIO

1. INTRODUO .............................................................................................................. 6
2. SQL Procedural............................................................................................................. 8
2.1.

Store Procedures.................................................................................................... 8

2.1.1.

Criao, edio e excluso de Procedures: ..................................................... 9

2.1.2.

Procedimentos Condicionais .......................................................................... 13

2.1.3.

Parmetros de Entrada e Sada ..................................................................... 17

2.2.

Funes ................................................................................................................ 19

2.2.1.
2.3.

Gatilhos (triggers) ................................................................................................. 23

2.3.1.
2.4.

Funes escalares ......................................................................................... 20

Operadores NEW e OLD ............................................................................... 26

Boas Prticas ....................................................................................................... 29

3. Transaes ................................................................................................................. 30
3.1.

BEGIN ou START TRANSACTION ...................................................................... 31

3.2.

COMMIT ............................................................................................................... 32

3.3.

ROLLBACK .......................................................................................................... 32

3.4.

Na prtica ............................................................................................................. 32

3.5.

Deadlocks ............................................................................................................. 35

4. Definio e utilizao de Vises.................................................................................. 36


4.1.

Criao, Edio, excluso e Alterao ................................................................. 37

4.2.

Manipulao de dados em Vises ........................................................................ 39

5. Estrutura dos dados .................................................................................................... 40


5.1.

Introduo............................................................................................................. 40

CURSO TCNICO EM INFORMTICA

5.2.

SENAC-RS

Mecanismos de Armazenamento (Storage engines) ............................................ 40

5.2.1.

Arquitetura do MySQL com Storage Engines ................................................ 43

6. Segurana. .................................................................................................................. 45
6.1.

Tipos de Segurana ............................................................................................. 45

6.2.

Configurando os Privilgios Iniciais do MySQL .................................................... 46

6.2.1.

Verificando a senha de root ........................................................................... 47

6.2.2.

Configurando senhas ..................................................................................... 47

6.2.3.

Configurando Privilgios (GRANT e REVOKE) ............................................. 49

6.2.4.

Tipos de privilgios ........................................................................................ 51

6.2.5.

Privilgio de dar privilgios (WITH GRANT OPTION) .................................... 54

CURSO TCNICO EM INFORMTICA

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:

Programa - (programa de computador) a sequncia completa de instrues a


serem executadas por computador, tanto em cdigo-fonte (escrita em
linguagem simblica) como em cdigo executvel (j convertido em linguagem
de mquina). No caso do MySQL, um programa aplicativo, destinado a
auxiliar o usurio na realizao de determinadas tarefas ou atividades
pessoais.

Rotina - um conjunto de instrues relativas a um clculo ou funo num


programa. Os termos rotina, sub-rotina, procedimento, funo e macro so
equivalentes, diferindo mais quanto a contexto, tcnicas e formas de uso.

Sub-rotina - a parte de uma rotina que realiza uma tarefa especfica num
programa de computador.

Procedimento - (em relao a um stored procedure) similar descrio de


sub-rotina, mas a partir da linguagem SQL uma coleo de comandos
armazenados que sero utilizador para gerenciar um banco de dados toda vez
que uma determinada tarefa necessite ser realizada.

Funo - (reflete um stored function) similar descrio de sub-rotina e por


conseguinte descrio de procedimento.

Gatilho - similar descrio de procedimento, sendo um recurso associado a


um banco de dados, que executado automaticamente quando uma condio
preestabelecida satisfeita. utilizado para associar um procedimento
armazenado a um evento de banco de dados.

CURSO TCNICO EM INFORMTICA

SENAC-RS

Tanto uma sub-rotina do tipo stored procedure como uma sub-rotina do


tipo trigger ou uma sub-rotina do tipo function so cdigos de programa
executados dentro do programa de gerenciamento de banco de dados
baseados numa linguagem estruturada de script. Uma linguagem estruturada
tipicamente baseada em trs formas clssicas de operao, denominadas:
sequncia, deciso e laos de repetio.

Linguagem

estruturada

procedimental

usada

pelo MySQL pode

ser

conhecida pela Sigla PL (Procedural Language), a qual possui scripts de


procedimentos compatveis com a sintaxe SQL:2003 para uso e definio
de stored procedures.

O formato adotado para o programa MySQL

semelhante ao do gerenciador de banco de dados DB2 da IBM. Futuramente


pode se tornar compatvel com os padres PL/SQL da Oracle, Transact-SQL
(conhecida tambm por T-SQL) da Microsoft e Sybase.

A Linguagem PL/SQL da Oracle (a primeira linguagem de script criada para


auxiliar o gerenciamento do banco de dados) tem sua estrutura muito
semelhante linguagem ADA, que foi desenvolvida a partir da linguagem
PASCAL, a mesma usada no ambiente Borland Delphi e que muitos
profissionais erroneamente afirmam no ser mais usada. Apesar da influncia
das linguagens ADA e PASCAL, a PL/SQL tem estrutura prpria e particular.
Infelizmente no mercado de banco de dados, apesar do esforo da entidade
ISO em procurar estabelecer um padro de trabalho nico para a linguagem
SQL, fornecedores apresentam recursos particulares que fogem do padro
proposto, tornando sua ferramenta muitas vezes incompatvel com as outras
que utilizam a mesma linguagem. Neste caso, existe uma s linguagem SQL e
uma srie de dialetos incompatveis entre si que so usados no mercado. O
mesmo ocorre com as muitas PLs existentes. A linguagem PL do MySQL,
como o prprio programa MySQL, possui algumas caractersticas particulares,
diferenciando-a dos outros fornecedores.

CURSO TCNICO EM INFORMTICA

SENAC-RS

2. SQL Procedural

A maioria dos SGBDs j possuam muitos recursos avanados tais como os


procedimentos armazenados (store procedures) e gatilhos (triggers), porm no
MySQL estes recursos so bem recentes, adicionados a partir das verses 5.x.
Estas funcionalidades permitem fazer uso de uma srie de tcnicas e prticas
de programao, subrotinas e funes, obtendo desta forma resultados rpidos
para problemas complexos e demorados, como tarefas repetitivas e de dificil
implementao.

Quando falamos de SQL procedural estamos falando de procedimentos


armazenados (store procedures), funes armazenadas (store functions ou
simplesmente functions) e gatilhos (triggers). Trataremos nesta apostila pelos
nomes convecionais store procedures, functions e triggers.

Muitos destes conceitos foram abordados na introduo, assim iremos detalhar


eles bem como ver sua sintaxe e principais caractersticas, regras e melhores
prticas.

2.1.

Store Procedures

As Store procedures, so subrotinas, lgicas complexas composta de uma


sries de comandos em linguagem SQL, que realizam determinada tarefa.
Podem receber parmetros e retornar diferentes tipos de resultados.

No dia a dia surgem problemas relacionados necessidade de se realizar


operaes complexas que envolvem a realizao de um ou mais comandos de
consulta a tabelas em conjunto com comandos de incluso e/ou alterao de
dados. Em outros casos, deseja-se realizar operaes com base em
parmetros definidos pelo usurio.

CURSO TCNICO EM INFORMTICA

SENAC-RS

Nessas situaes, o ideal que essas operaes no sejam definidas na


aplicao que vai fazer uso do banco de dados, mas no prprio servidor do
banco de dados. Isso garante a segurana do banco de dados, uma vez que o
mesmo pode controlar o acesso a essas operaes especiais, evitando o
conhecimento

excessivo

da

estrutura

do

banco

de

dados

pelos

desenvolvedores de aplicaes.

Desse modo, as Stored Procedures, traduzidas do ingls como procedimentos


armazenados, so definidos como um conjunto de comandos da linguagem
SQL definidos no servidor do banco de dados e acionados por eventuais
chamadas de qualquer usurio que tenha autorizao para sua execuo.

Alm da questo de segurana do banco de dados, j que o usurio s poder


executar os procedimentos a que tiver acesso, os procedimentos armazenados
ajudam a diminuir o trfego de informaes entre o usurio e o servidor,
tornando mais simples o processamento das informaes.

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.

possvel tambm na criao dos procedimentos utilizar comandos comuns s


linguagens de programao, que voc j viu em disciplinas anteriores, como IF,
WHILE, RETURN etc. Outra observao que deve ser feita que vises no
podem ser criadas em procedimentos armazenados.

2.1.1.

Criao, edio e excluso de Procedures:

CURSO TCNICO EM INFORMTICA

SENAC-RS

A sintaxe bsica para criao, alterao e excluso de stores procedures so


simples, porm sua aplicao e sua lgica podem ser bem complexas e at
perigosas se mal empregadas.

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.

O nome_do_procedimento o nome que se deseja atribuir para o


procedimento, que deve seguir as mesmas regras usadas para os nomes das
tabelas. Em seguida, caso haja, a lista de parmetros de entrada e/ou sada.
Mesmo quando no houver parmetros, devem ser inseridos os parnteses ().
Finalmente, entre as palavras BEGIN e END, devem ser descritos os
comandos SQL que definem a operao a ser executada.
Os parmetros seguem a notao [IN

OUT] nome_parmetro

tipo_de_dado, ou seja, deve-se usar a palavra chave que identifica se o


parmetro de entrada (IN) ou sada (OUT), se nada for informado,
atribuido como padro o de entrada.

Abaixo temos um exemplo de procedure que retorna os nomes de todos os


filmes que foram alugados e a quantidade alugada.

CURSO TCNICO EM INFORMTICA

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.

Para utilizar o procedimento bastaria chama-lo da seguinte forma:

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.

O ALTER PROCEDURE permite que sejam alterados apenas as seguintes


caractersticas:
Comentrios;
Linguagem
Definies de SQL e definies de segurana.

CURSO TCNICO EM INFORMTICA

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

table, uma view e outros objetos do banco de dados.


A sintaxe para excluir uma procedure seguinte:

Na prtica podemos usar apenas:

Onde sp_filmes_alugados o nome do procedimento que desejamos excluir,


no exemplo acima estamos excluindo a procedure que criamos antes. Observase que a sintaxe (extrada diretamente da documentao do MySQL) a
mesma usada para excluir uma function, que veremos no prximo capitulo.
E que tambm possvel usar a opo IF EXISTS.

Em muitas situaes comum usarmos em conjuntos os comandos drop e

create para alterar parmetros ou o escopo SQL do procedimento, o que


no permitido pelo comando alter. Nestes casos utilizamos uma
combinao destes comandos junto com a opo IF
temos um exemplo:

EXISTS. Abaixo

CURSO TCNICO EM INFORMTICA

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.

Para chamar o procedimento utilizamos a mesma sintaxe vista antes, porm


passando o parmetro filme. O comando fica:

Neste exemplo passamos como parmetro o ttulo AFRICAN EGG, o qual


retorna apenas uma linha no resultado.

2.1.2.

Procedimentos Condicionais

muito comum situaes onde um procedimento armazenado ir realizar uma


tarefa condicionada, ou seja ir ou no realizar determinados comandos de
acordo com uma situao, uma regra de negcio, um parmetro passado,

CURSO TCNICO EM INFORMTICA

SENAC-RS

enfim, algo que sinalize para o procedimento que deve agir de maneira A e
no B.

Isto muito comum em linguagens de programao, os famosos IFs ou


simplesmente condicionais. Os mesmos conceitos podem ser aplicados em
SQL, especialmente dentro de um procedimento.

Para visualizar melhor o problema e logo a sintaxe, pegaremos o procedimento


criado antes, sp_filmes_alugados o qual recebe como parmetro o ttulo do
filme para ser usado na clusula where. a rotina funciona perfeitamente,
porm caso o usurio queira pesquisar pelo ttulo no exato, mas sim
aproximado, por exemplo apenas digitar african e retornar a lista de todos
filmes alugados que tenham a palavra african em qualquer parte do seu ttulo,
ser possvel?

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:

A store procedure fica praticamente igual a anterior, apenas com o operador

like ao invs do = e o parmetro filme concatenado com o caractere


curinga de pesquisa %. Para test-la use o mesmo comando usado antes, o
comando e o resultado so mostrados abaixo:

CURSO TCNICO EM INFORMTICA

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.

Para facilitar a compreenso da rotina, vamos supor o seguinte cenrio:

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.

Primeiro vejamos como ficariam os parmetros:

CURSO TCNICO EM INFORMTICA

SENAC-RS

Adicionamos o novo parmetro de entrada chamado buscaExata do tipo bool.


Nosso prximo passo usar o novo valor em um teste condicional, algo como:

Est quase, pronto falta apenas adicionar os respectivos blocos de cdigo


procedural para a busca exata e a busca no exata, que correspondem aos
diferentes scripts que criamos nos dois exemplos anteriores desta procedure.
Inserindo os devidos comandos nos lugares adequados temos o seguinte script
final:

Detalhando nosso script temos:


I.

Primeiro exclumos a procedure caso ela exista (IF EXISTS..) (linha


1);

II.

Logo em seguida criamos novamente nossa rotina com o novo


parmetro (linha 2);

III.

Em terceiro lugar temos nossa condio de teste e sua estrutura If -

Else End If (linhas 4, 13 e 22).

CURSO TCNICO EM INFORMTICA

SENAC-RS

E finalmente entre a estrutura IF .. Then e Else temos nossas duas lgicas,


uma para listar os filmes pelo ttulo exato passado no parmetro e outra para
filtrar os filmes que contenham o texto informado em qualquer parte do ttulo.
Para testarmos nossa procedure utilize os comandos abaixo e veja os
diferentes resultados:

2.1.3.

Parmetros de Entrada e Sada

Como visto antes os procedimentos permitem que sejam especificados


parmetros de entrada e sada, e na verdade, ainda temos um terceiro tipo de
parmetro que ao mesmo tempo de entrada e sada, INOUT. Podemos
definir nenhum, um ou mais parmetros tanto de diferentes tipos. Quando
temos mais de um parmetro devemos passa-los na mesma ordem que so
definidos quando usamos o comando call para executar a rotina.
Exemplo de store procedure (sp) com parmetros:

Chamada da sp acima:

Vamos rever e detalhar um pouco melhor a definio de cada um dos tipos de


parmetros:

IN:

o modo padro, quando definido na criao do procedimento o

comando que faz a chamada procedure obrigado a passar um argumento

CURSO TCNICO EM INFORMTICA

SENAC-RS

do mesmo tipo como parmetro. O valor de um argumento de entrada


protegido, isto significa que mesmo que o valor passado seja alterado fora do
procedimento, o seu valor original mantido dentro do procedimento, ou seja
na prtica como se a store procedure executasse sobre uma cpia do
parmetro.

OUT:

Argumentos de sada podem ter seus valores alterados dentro do

procedimento e seu novo valor passado de volta para o escopo que fez a
chamada.

INOUT:

a combinao dos parmetros IN e OUT. Isto significa que o

programa de chamada pode passar o argumento, o procedimento pode alterar


seu valor durante sua execuo e finalmente passar o novo valor de volta para
o programa de chamada.

Para compreender melhor estes parmetros, especialmente o do tipo INOUT


vejamos o seguinte exemplo:

O procedimento tem dois parmetros, um exclusivo de entrada (inc) e outro do


tipo INOUT. O procedimento bem simples, ele incrementa o valor passado
no argumento count pelo valor passado em inc.

CURSO TCNICO EM INFORMTICA

SENAC-RS

Para compreender exatamente o funcionamento deste tipo de parmetro


observe os resultados das chamadas consecutivas ao procedimento nas linhas
seguintes. O valor da varivel @counter que passado ao procedimento
alterando dentro da procedure e, mesmo aps a concluso da execuo do
procedimento, o programa que fez a chamada ao procedimento, neste caso o
cliente de SQL, tem acesso ao valor alterado na varivel @counter.

Em outras palavras como se o argumento do tipo INOUT fosse uma varivel


global, que pode ser alterada de dentro do procedimento e acessada de fora,
no escopo onde a chamada feita.

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

Assim como nos procedimentos, possvel ter uma sequncia de comandos


SQL encapsulados em estruturas denominadas funes. Que, como dito antes,
tratam de lgica e programao.

A principal diferena entre uma funo e um procedimento est no fato que a


funo obrigatoriamente deve retornar um valor. No mdulo de banco de dados
anterior, j trabalhamos em com funes internas, pr-definidas pelo prprio
SGBD, como AVG(), SUM(), COUNT() etc. Mas, o usurio pode definir suas
prprias funes, com parmetros de entrada e variveis locais. possvel no
SQL construir dois tipos de funes.

CURSO TCNICO EM INFORMTICA

SENAC-RS

Funes escalares: estruturas semelhantes a funes internas, que retornam


um nico valor.
Funes com valor de tabela: estruturas semelhantes a vises com a diferena
de aceitarem parmetros de entrada, que retornam uma tabela como resultado
do seu processamento.

No caso do MySQL, no permitido que uma funo retorne uma tabela.


Desse modo, vamos discutir apenas como criar e utilizar as funes escalares.

2.2.1.

Funes escalares

Uma funo escalar retorna um nico valor de dados de um tipo pr-definido e


pode ser utilizada do mesmo modo que uma funo interna, sendo mais usada
como:

uma expresso na lista de um comando SELECT;

uma expresso em uma clusula WHERE ou HAVING;

uma expresso em uma clusula ORDER BY ou GROUP BY;

uma expresso na clusula SET de um comando UPDATE;

uma expresso na clusula VALUES de um comando INSERT.

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.

Detalhando a expresso temos:

nome_da_funcao: o nome que se deseja atribuir para a funo. Esse nome


deve seguir as mesmas regras usadas para os nomes das tabelas.

CURSO TCNICO EM INFORMTICA

SENAC-RS

parametros_de_entrada: Aqui inserida a lista de parmetros ou argumentos


de entrada, caso houver, que seguem o mesmo formato definido no captulo
anterior sobre procedimentos armazenados. Mesmo no havendo parmetros,
devem ser inseridos os parnteses () na criao da funo.
tipo_de_retorno: A clusula RETURNS define o tipo de dado que ser
retornado pela funo, por exemplo, um nmero inteiro, um conjunto de
caracteres etc.

caractersticas: Quando voc cria uma funo armazenada, voc deve


declarar e algumas caractersticas. Caso contrrio a recuperao de dados ou
replicao pode causar comportamentos inesperados. Isto ser visto no
captulo Processamento e Tunning Abaixo veremos suscintamente o que
cada uma das caractersticas define:

DETERMINISTIC ou NOT DETERMINISTIC


Define se uma rotina como determinista se produz sempre o
mesmo resultado para os mesmos parmetros de entrada; e
no determinista caso contrrio.
uma boa prtica, e em alguns casos at necessrio, que se declare uma das
opes acima.
E finalmente, entre as palavras BEGIN e END devem ser descritos os
comandos SQL que definem a operao a ser executada. Lembrando que
antes do END deve ser usada a clusula RETURN que define a varivel ou
expresso que ir retornar o resultado da funo.

comum usarmos variveis para o retorno de funes. Logo vamos rever a


sintaxe para declarar variveis locais no MySQL. Isso feito usando o
comando DECLARE, cuja sintaxe apresentada no quadro a seguir.

CURSO TCNICO EM INFORMTICA

SENAC-RS

Nessa expresso, no campo nome_da_variavel deve-se inserir o nome da


varivel que est sendo criada e esse nome deve seguir as mesmas regras
usadas para os nomes das tabelas. O mesmo acontece para a definio do tipo
de dado que ser atribudo varivel.

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:

CURSO TCNICO EM INFORMTICA

SENAC-RS

A partir dessa funo, vamos recri-la de forma que retorne a quantidade de


um nico filme alugado, o cdigo (id) do filme na tabela rental o campo
inventory_id. O comando para criar essa funo descrito no quadro abaixo.

Compare a diferena entre as duas verses da funo. Acrescentamos um


parmetro de entrada do tipo inteiro, o qual usado em uma clusula where
sobre o campo inventory_id.
Nota-se que para alterar a funo usamos a mesma tcnica utilizada nas
store procedures, excluir a funo antes com o DROP .. IF EXISTS

.... e depois criamos novamente a funo.


Para utilizar a funo vamos usar o mesmo exemplo de consulta usado antes:

2.3.

Gatilhos (triggers)

Comearemos usando uma definio bem sucinta e direta sobre o que so


triggers:

Um trigger um tipo especial de procedimento armazenado, que executado


sempre que h uma tentativa de modificar os dados de uma tabela que
protegida por ele.

Mais algumas caractersticas gerais:

CURSO TCNICO EM INFORMTICA

SENAC-RS

Associadas a uma tabela:


Os triggers so sempre associados a uma tabela e a um evento DML desta.
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 ao especfica,
ele ser executado automaticamente, no podendo nunca ser ignorado.
No podem ser chamados diretamente:
Ao contrrio dos procedimentos armazenados do sistema, os disparadores no
podem ser chamados diretamente e no passam nem aceitam parmetros .

So parte de uma transao:


O TRIGGER e a instruo que o aciona so tratados como uma nica
transao, que poder ser revertida em qualquer ponto do procedimento, caso
voc queria usar ROLLBACK, conceitos que sero vistos no prximo captulo.

Os gatilhos ou triggers so um tipo especial de procedimentos, os quais


possibilitam um controle sobre os dados e sua integridade de uma maneira
bem particular.

Uma trigger um procedimento associado a uma tabela, o qual definido para


ser executado em resposta a um evento em particular. Estes eventos so os
comandos da DML (Data Manipulation Languange), sendo eles: INSERT,

REPLACE, DELETE ou UPDATE. Cada tabela pode ter vrios gatilhos,


porm para cada comando DML em uma determinada tabela, pode se definir
apenas uma trigger, que deve ser disparado antes ou depois do evento.

Quando definimos uma trigger precisamos definir se ela ser disparada antes

(BEFORE) ou depois (AFTER).


Aplicao:

CURSO TCNICO EM INFORMTICA

SENAC-RS

Abaixo citamos alguns exemplos de situaes onde as triggers so


especialmente teis:
Atualizar dados em vrias tabelas quando uma atualizada. Ex: tabela
venda e demais tabelas relacionadas ao estoque do produto.
Validar uma determinada entrada (insero de dados). Ex: validar dados
de pagamento ao registrar uma nova venda.
Atualizar um dado ou campo especfico. Ex:

Recalcular o preo de

venda de um produto quando seu desconto ou acrscimo for atualizado.

Existem inmeras outras situaes onde os triggers so especialmente teis.


Porm elas tambm so perigosas quando mal usadas ou usadas
indiscriminadamente.

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:

o nome do procedimento, por exemplo, trg_test;

trigger_time:

Define se o TRIGGER ser ativado antes (BEFORE) ou

depois (AFTER) do comando que o disparou;


trigger_event:

Associa

trigger

ao

evento, INSERT, REPLACE,

DELETE ou UPDATE;
tbl_name:

Nome da tabela onde o TRIGGER ficar pendurado

aguardando o trigger_event;

CURSO TCNICO EM INFORMTICA

trigger_stmt:

SENAC-RS

Consiste na lgica que a TRIGGER dever fazer quando

for disparado, ou seja os comandos que sero executados quando o evento


(trigger_event) ocorrer na tabela tbl_name.

2.3.1.

Operadores NEW e OLD

Conforme descrito antes, uma trigger consiste em comandos que so


executados antes ou depois de um evento de DML em uma determinada
tabela.

Obviamente ao definir um procedimento automtico que ser disparado antes


ou depois de um evento DML em uma tabela, desejamos poder acessar a
informao que est sendo: atualizada, inserida e/ou deletada. Para isto dentro
de um trigger usamos os operadores especiais OLD e NEW.

Atravs destes operadores possvel acessar as colunas alvos do comando


DML, ou seja, podemos recuperar e usar os valores alterados. Para entender
melhor vejamos o seguinte contexto:

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:

Esta tabela possui apenas trs campos: OldValue; NewValue e EnventDML


que armazenaro o valor antigo da coluna, o novo valor e ao evento DML
respectivamente.

CURSO TCNICO EM INFORMTICA

SENAC-RS

Agora vamos criar nossa primeira trigger:

Como podemos observar a trigger

tg_categorys definida sobre a

tabela category e disparada antes (BEFORE) do evento UPDATE. E o que


ela faz inserir os valores old.name, new.name e UPDATE na tabela
que criamos.

Para test-la vamos realizar um update na tabela, mas antes vejamos o


contedo da tabela (para nosso exemplo apenas os cinco primeiros registros j
so o suficiente):

Certo vamos agora atualizar o a coluna name da categoria id 1

(categopry_id = 1). Para isto execute o comando abaixo:

Certo, o comando deve ter executado sem problemas, para ter certeza do
resultado pode-se executar novamente a consulta com o select LIMIT 5.

CURSO TCNICO EM INFORMTICA

SENAC-RS

Mas para entender o que nossa trigger fez realmente vamos visualizar os
dados da tabela testeTG:

Como podemos observar as colunas OldValue e NewValue possuem o valor


antigo e novo da coluna name. Para entendermos melhor vamos criar mais
algumas triggers nesta tabela e executar outros comandos:

Detalhando as triggers que criamos temos dois novos gatilhos, um para


UPDATE e outro para a operao DELETE. Ambos fazem exatamente a
mesma coisa: inserem os valores na nossa tabela testeTG, com a diferena
que a primeira insere um valor NULL ao invs da informao old.name
enquanto a segunda insere um valor NULL onde seria o a informao
new.name. Isto feito desta forma para evitar um erro na criao da trigger, o
que ocorreria se tentasse executar com no mesmo formato da primeira.
Este erro caracterstico dos operadores OLD e NEW, uma vez que na
operao INSERT no existe a informao OLD, da mesma forma que para
uma operao DELETE no existe a informao NEW. Este comportamento
pode ser ilustrado nos resultados da nossa tabela testeTG:

CURSO TCNICO EM INFORMTICA

SENAC-RS

Assim podemos constatar exatamente as quais informaes temos disponveis


com os operadores OLD e New.
Importante: A disponibilidade e os valores dos operadores OLD e NEW so os
mesmos tanto para triggers do tipo AFTER quando do tipo BEFORE.

2.4.

Boas Prticas

Geralmente as empresas e desenvolvedores adotam padres na hora de criar


seus scripts ou programas. Estes padres os chamados Code Conventions
ou Coding Standards so uma boa prtica em muitos sentidos. As rotinas
SQL, funes e demais objetos de banco de dados no so diferentes.

Comum utilizarmos nomes ou prefixos padres para determinados tipos de


objetos. Em nossos exemplos criamos procedimentos com o prefixo sp_ nos
nomes, sp de Store Procedure. Bem como utilizamos fn como prefixox para
o nome das functions.

Isto alm de padronizar os scritps, facilita sua compreenso por outros


desenvolvedores.

No existem regras especficas para prefixos e/ou determinados tipos de


objetos, apenas boas prticas. Os que usamos nesta apostila so apenas
exemplos de prefixos que geralmente so utilizados, mas cada empresa,

CURSO TCNICO EM INFORMTICA

SENAC-RS

organizao ou mesmo grupos de desenvolvedores pode adotar seu prprio


padro.

3. Transaes

Em qualquer aplicao que esteja integrada com um banco de dados,


provavelmente haver a necessidade de definir operaes sobre o banco de
dados que envolvam mais de um comando; em outras palavras, uma
combinao de inseres, alteraes e/ou excluses que representam uma
nica ao do usurio.

A linguagem SQL define o conceito de transao (transaction) para esse tipo


de ao. Uma transao uma sequncia de comandos que devem respeitar
uma srie de propriedades, de forma a garantir segurana e integridade para a
base de dados. Isso necessrio porque, no caso de algum ou alguns desses
comandos no ser executado (devido a uma violao de restrio, ou a uma
falha no sistema, travamento no servidor, etc.), o banco de dados
provavelmente ficar em um estado inconsistente.

Por exemplo, suponha um evento onde uma pessoa inscreveu-se em uma


oficina, que exige o pagamento de uma taxa de inscrio. Antes do incio da
oficina, porm, a pessoa cancelou sua inscrio, o que lhe d o direito de
receber o valor da taxa de volta. Para efetivar o cancelamento, o sistema
precisa realizar no mnimo dois comandos na base de dados: A: Cancelar a
inscrio, e B: Cancelar o pagamento da taxa. O sistema especifica que a
execuo de A necessariamente implica na execuo de B, e vice versa. Se
apenas A ou apenas B for executado, os dados estaro inconsistentes, pois o
dinheiro recebido no compatvel com o nmero de inscritos efetivados. A
nica forma realmente segura de impedir esse tipo de inconsistncia
colocando A e B dentro de uma mesma transao.

CURSO TCNICO EM INFORMTICA

SENAC-RS

Em um SGBD, uma transao deve obedecer ao padro ACID, uma


abreviao em ingls para quatro propriedades:

Atomicidade (atomicity): faz com que a transao inteira seja


executada como um nico comando. Da mesma forma que um comando
no deve ser executado apenas parcialmente, uma transao deve
obrigatoriamente ser executada por inteiro;

Consistncia (consistency): garante que a transao trar o banco de


dados para um estado consistente, isto , onde todas as restries so
respeitadas. Em outras palavras, a transao no pode abrir um rombo
no banco;

Isolamento

(isolation):

garante

que

transaes

diferentes no

interfiram umas nas outras. Isto , no haver problemas de


concorrncia se duas transaes forem iniciadas ao mesmo tempo;

Durabilidade (durability): significa que as alteraes efetivadas por


uma transao sero todas persistidas no banco de dados; mesmo que
ocorra uma falha no banco de dados, as alteraes permanecero.

Quem d a garantia de que essas propriedades sero respeitadas o prprio


SGBD. O desenvolvedor apenas deve utilizar os comandos adequados para
iniciar e finalizar uma transao:

A seguir mostrado os trs principais comandos relacionados a transaes e


suas caractersticas.

3.1.

BEGIN ou START TRANSACTION

O incio de uma transao sinalizado com o comando BEGIN. Isso significa


que, para a conexo atual, os comandos seguintes fazem parte de uma
transao. Em alguns SGBDs, as transaes podem ser nomeadas.

CURSO TCNICO EM INFORMTICA

SENAC-RS

Qualquer comando Insert, Update ou Delete realizado em seguida ser


efetivado, e essas alteraes sero refletidas nos Selects executados dentro da
transao. Porm as mudanas feitas no sero efetivamente persistidas na
base de dados enquanto a transao no for terminada. Por exemplo, se o
servidor do banco de dados cair no meio de uma transao, todos os
comandos executados sero imediatamente desfeitos assim que o banco de
dados voltar. Isso respeita a atomicidade da transao.

3.2.

COMMIT

Para finalizarmos uma transao e efetivar as alteraes realizadas, usamos


COMMIT. Isso far com que a ltima transao aberta seja fechada de maneira
bem sucedida.

3.3.

ROLLBACK

Outra alternativa o ROLLBAC. Isso far que todos os comandos executados


dentro da ltima transao aberta sejam imediatamente desfeitos. Isso faz com
que a transao seja fechada, porm nenhuma alterao ser persistida.

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.

CURSO TCNICO EM INFORMTICA

SENAC-RS

Esta operao, embora ainda seja considerada simples, um tpico processo


que mais adequado de ser criado no lado do servidor, deixando para a
aplicao apenas a chamada desta transao.

Agora vamos detalhar os comandos necessrios:

No primeiro comando SELECT INVENTORY_IN_STOCK(10); retorna o


valor booleano 1, indicando que retornou verdadeiro. Aqui usado um select
sobre uma funo armazenada (funes sero vistas no captulo 3) que retorna
verdadeiro se existe estoque para o item desejado.

Logo aps inserido um registro na tabela de aluguel. No comando seguinte


recuperamos o valor devido pelo cliente na varivel @balance atravs da
funo get_customer_balance().

Ento

finalmente inserimos o

registro na tabela de pagamentos.

Nossa lgica e comandos esto prontos, agora precisamos tornar estes


comandos uma transao nica, garantindo que todos os comandos sero

CURSO TCNICO EM INFORMTICA

executados

com

sucesso

SENAC-RS

se,

somente

se,

todos

os

comandos

individualmente tiverem sucesso, ou seja nenhum erro.


A resposta simples, basta adicionarmos as palavras chaves BEGIN e

COMMIT no antes e depois dos comandos respectivamente. O exemplo final


fica:

Para validarmos podemos consultar a tabela payment com o seguinte


comando:

SELECT

* FROM

payment WHERE customer_id = 3;

O qual deve retornar o seguinte resultado:

Desafio:

Nesta transao que criamos, existe um pequeno erro lgico, voc consegue
identificar qual o erro?

O erro consiste no fato de testarmos a informao se existe o item em estoque


mas no usamos o resultado. Dependendo das regras de negcio, voc
tambm pode precisar verificar se o cliente tem um saldo devedor antes de
processar o aluguel.

Tente recriar esta transao fazendo estes dois ajustes; utilizar a informao
retornada pela funo INVENTORY_IN_STOCK() e criar a validao se o

CURSO TCNICO EM INFORMTICA

SENAC-RS

cliente possui saldo devedor e somente processar o aluguel se no existir saldo


devedor.

3.5.

Deadlocks

Uma das maneiras que as transaes atingem as propriedades ACID atravs


do bloqueio de tabelas, ou de registros, de forma que outras transaes ou
comandos isolados no possam manipul-los. Isso resulta em uma fila de
espera: assim que o bloqueio desfeito, as alteraes pendentes so
realizadas.

Uma transao A pode encontrar um bloqueio criado por outra transao


concorrente B, e desta forma fica em estado de espera; isto , parada,
enquanto B no libera o bloqueio. Vamos supor que ambas transaes A e B
faam operaes nas tabelas Compositores e Obras, porm em ordens
diferentes. Desta forma, A bloqueou a tabela Compositores, e B bloqueou
Obras. A transao A, portanto, aguardar o trmino de B, para que Obras seja
desbloqueada. Porm, a transao B est aguardando que A libere a tabela
Compositores. Isto resultou em um bloqueio mtuo, de forma que nenhuma das
duas transaes pode terminar. No jargo de banco de dados, isso se chama
deadlock.

A maioria dos SGBDs possui mecanismos internos que detectam deadlocks. A


nica soluo, porm, matar uma das transaes com um ROLLBACK, para
que a outra possa terminar. Em consequncia, A ocorrncia de deadlocks em
um banco de dados pode acarretar em um comportamento imprevisvel nas
aplicaes. Desta forma, todo esforo deve ser dedicado para que deadlocks
no ocorram.

A principal regra que evita a ocorrncia de deadlocks que todas as


transaes acessem as tabelas na mesma ordem. Se no caso acima, A e B
ambas acessassem Compositores e Obras nessa mesma ordem (ou na ordem
inversa), no haveria a possibilidade de deadlocks entre elas. Em transaes

CURSO TCNICO EM INFORMTICA

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.

4. Definio e utilizao de Vises.


Vises, conhecidas como VIEWS, em SQL so consultas armazenadas em
uma estrutura de fcil acesso baseadas no comando SELECT. Essa consulta
armazenada funciona como uma tabela virtual, com comportamento similar a
uma tabela real, entretanto, sem armazenar dados, no existindo como uma
entidade independente no banco de dados. Os dados que so exibidos
nas vises so gerados dinamicamente toda vez que a viso referenciada.

O SGBD armazena apenas a definio das vises (nome da viso e o


comando SELECT). Quando o usurio chama uma viso, o sistema de banco
de dados associa os dados apropriados a ela. Uma viso apresenta o
resultado final desse processo, ocultando todos os detalhes tcnicos.

A utilizao de vises permite simplificar e personalizar tabelas no seu banco


de dados. Tambm oferece um mecanismo de segurana (restringindo o
acesso de usurios a campos predeterminados).

Views tambm so muito uteis quando temos consultas complexa que so


constantemente utilizadas, como consultas com vrios JOINS, Ao invs de se
digitar ou enviar ao servidor toda a query, executado apenas um select
simples. Isto tambm prov um nvel de encapsulamento de determinadas
informaes e/ou estruturas.

Por exemplo comum usarmos uma srie de estruturas de tabelas e regras


para calcular a folha de pagamento, porm para a aplicao ou determinada
parte da aplicao (mdulo) pode-se desejar que esta estrutura complexa no

CURSO TCNICO EM INFORMTICA

SENAC-RS

seja conhecida e nem acessada, neste caso uma view que traga apenas as
informaes necessrias se faz muito til.

4.1.

Criao, Edio, excluso e Alterao

Existem algumas restries quanto utilizao, criao e atualizao de views.


Estas restries so diferentes de acordo com cada SGBD, bem como detalhes
na sua sintaxe. Lembrando que esta apostila focada no MySQL, logo sua
sintaxe e detalhes mais tcnicos tambm.

Abaixo temos algumas restries no momento da criao de uma view:

A instruo SELECT no pode conter uma subconsulta na clusula


FROM.

A instruo SELECT no pode se referir a variveis do sistema ou do


usurio.

No possvel associar uma trigger uma viso

No momento de criao da view qualquer tabela citada precisa existir, porm


uma tabela referenciada por uma view j criada pode ser excluda. O que
causar um erro ao se tentar consultar a view.Para verificar este tipo de
problema pode-se usar o comando CHECK TABLE.

Para maiores detalhes sobre a definio de VIEWS consultar o manual do


MYSQL.

CREATE VIEW

A instruo para criar uma viso bastante simples, basta adicionar as


palavras CREATE VIEW antes da instruo da consulta que se deseja
armazenar. A sintaxe de criao de uma viso descrita no destaque abaixo.

CURSO TCNICO EM INFORMTICA

SENAC-RS

Nessa expresso, no campo nome_da_viso deve-se inserir o nome que se


deseja atribuir para a viso, nome esse que deve seguir as mesmas regras
usadas para os nomes das tabelas. Aps a clusula AS, tem-se qualquer
comando SELECT vlido.

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:

CURSO TCNICO EM INFORMTICA

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.

Manipulao de dados em Vises

Embora a criao, alterao e excluso da definio de uma view possam ser


praticamente iguais a de uma tabela, a manipulao dos seus dados no no
exatamente igual. Lembrando que uma viso apenas uma estrutura virtual e
no real dos dados, assim o tratamento dos seus dados diferente.

Na maioria dos SGBDs a manipulao dos dados atravs de views no


permitido, porm no MySQL isto, em alguns casos possvel. O que
acreditamos no ser recomendvel e to pouco uma boa prtica.

O mais

aconselhvel fazer toda manipulao dos dados diretamente sobre as tabelas


e nunca sobre as views. Embora o MySQL permita manipular os dados
diretamente atravs das views, em alguns casos. Veremos apenas a parte
conceitual, visto que como dito antes, no uma boa prtica.

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.

CURSO TCNICO EM INFORMTICA

SENAC-RS

A regra citada acima no validade para campos AUTO INCREMENT, pois


campos deste tipo, embora tambm possam ser not null no necessitam de
um valor para incluso de novo registro.

5. Estrutura dos dados

5.1.

Introduo

Esta apostila focada na storage engine InnoDB. Mas como estamos no


captulo que trata justamente do armazenamento de dados, apresentaremos
um resumo dos principais storage engines suportadas pelo MySQL. Mas antes
vamos definir o que Storage engine.

Um mecanismo de armazenamento (ou motor de banco de dados), ou ainda


simplesmente engine o componente de software interno que um SGBD usa
para criar manipular os dados. A maioria dos sistemas de gerenciamento de
banco de dados incluem sua prpria interface de programao de aplicativo
(API) que permite ao usurio interagir com o seu motor subjacente, sem passar
pela interface do usurio do SGBD. Em em outras palavras os usurios do
SGBD usam os mesmos comandos de DML sem se preocupar com o engine
utilizado, se tratando de um mecanismo do mesmo modelo claro, como o
transacional o qual estamos tratando nesta apostila e no curso.

Muitos dos SGBDs modernos suportam vrios motores de bancos de dados


dentro do mesmo banco de dados.

5.2.

Mecanismos de Armazenamento (Storage engines)

O MySQL suporta vrios tipos de mecanismos para controlar o armazenamento


(storage engines) - no usando assim o file system do SO - que atuam como
controladores para diferentes tipos de tabelas:

CURSO TCNICO EM INFORMTICA

SENAC-RS

MyISAM: Suportada em todas as configuraes do MySQL. indicado


para armazenar dados que sero consultados frequentemente. Como
por exemplo, um cadastro de estados e de cidades. Suas principais
caractersticas so:
Limite de armazenamento de 256 TB;
Dados podem ser comprimidos;
Possibilidade de indexar tambm campos BLOB e TEXT;
Ausncia de chaves estrangeiras (foreign key);
Ausncia de transaes (commit e rollback);

InnoDB:

o atual motor de armazenamento padro do MySQL a

partir da verso 5.5, devido a sua alta confiabilidade e performance.


Suas principais vantagens so:
Limite de armazenamento de 64 TB;
Suporte a transaes Commit, Rollback e Crach-Recovery;
Suporte a chaves estrangeiras (Foreign Key);

Permite utilizar outros tipos de motores de armazenamento, o estilo Oracle de


leitura consistente e de alta performance a multi-usurios, mantm sua prpria
rea de buffer para armazenamento de dados.

Merge: Permite a operao de agrupar logicamente, tabelas MyISAM


idnticas, de forma a ficarem referenciadas como uma s, em outras
palavras simula o comportamento relacional do InnoDB (PK e FKs) em
tabelas MyISAM.

Memory: Tambm conhecida como Heap, cria tabelas com o contedo


que est em memria alta (RAM), isto permite um acesso muito rpido
as informaes, porm por utilizar a memria RAM, a quantidade de
informaes que pode ser armazenada bem limitada. Entrou em
desuso devido ao InnoDB que absorveu esta caracterstica atravs do
seu buffer de memria que atende ao mesmo propsito.

Example:

Serve apenas para programadores que tenham interessse

em desenvolver novos storage engines. Permite criar tabelas usando-o,

CURSO TCNICO EM INFORMTICA

SENAC-RS

mas nenhuns tuplos (registros) podem ser criados ou lidos, servindo


apenas

para

ilustrar

aos

programadores

como

se

inicia

desenvolvimento de uma storage engine.

Federated: Possibilita unir um grupo de servidores fsicos MySQL em


um nico servidor lgico. muito til para aplicaes distribudas
especialmente os que necessitam de um grande volume de dados como
os repositrios conhecidos como Data Warehouse.

Arquive:

Mais indicado para armazenar e recuperar grandes blocos

de dados que poucas vezes so usados, tais como histricos, logs de


segurana e informaes de auditoria.

CSV: Armazena os dados em ficheiros de texto no formato csv


(comma-separated values), ou simplesmente separados por vrgula.
um motor bem primitivo e pouco usado.

Blackhole: Recebe dados, mas no os armazena. Este mecanismo


usado em computao distribuda, onde os dados no so armazenados
localmente, mas, sim, replicados.

NDBCLUSTER: Tambm conhecida como NDB, no suportada no


MYSQL 5.1. Este engine foi descontinuado e atualmente suportado
pelo MySQL Cluster NDB 7.2. um motor especialmente desenvolvido
para computao distribuda.

Para maiores informaes sobre o Cluster NDB veja a documentao oficial do


produto em: http://dev.mysql.com/doc/refman/5.6/en/mysql-cluster.html

Para definir um storage engine o comando o seguinte:

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:

CURSO TCNICO EM INFORMTICA

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.

Arquitetura do MySQL com Storage Engines

A arquitetura do MySQL independente do motor de armazenamento em uso e


sempre idntica. As Storage Engines simplesmente funcionam como um
conexo que feita no MySQL, permitindo ao programador uma escolha mais
benigna para o sistema, indo de encontro necessidade da aplicao.

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.

CURSO TCNICO EM INFORMTICA

SENAC-RS

Detalhando a figura verificamos que todo conjunto de ferramentas e tcnicas; e


a prpria linguagem SQL em si, esto em uma nica camada acima dos
storage engines, o qual, conforme a figura indica, podem ser inclusive
plugveis. O que torna o MySQL sob aspecto bastante poderoso e competitivo.

Abaixo temos um quadro detalhando os principais Storage Engines por


funcionalidade:

CURSO TCNICO EM INFORMTICA

SENAC-RS

6. Segurana.

Independente do sistema e do ambiente, ou mesmo do seu tamanho e


complexidade, as questes relativas a segurana e recuperao dos dados so
primordiais. De nada vale um SGBD bem arquitetado e uma aplicao robusta
se seus dados e/ou estruturas podem ser facilmente corrompidos ou mesmo
acessados e violados indevidamente.

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.

Aliado a segurana do sistema, o armazenamento e recuperao dos seus


dados so essncias para a continuidade do mesmo e eventuais incidentes.
Mesmo quando no ocorrem situaes de falha, comum situaes de
migrao ou mesmo atualizaes sobre o banco de dados. O qual exigem
processos de restaurao bakcup de dados.

Neste capitulo sero discutidas as melhores praticas e tcnicas de segurana ,


armazenamento e recuperao de dados no MySQL.

6.1.

Tipos de Segurana

Em ambientes com mltiplos usurios, importante proteger o banco de dados


de alteraes indevidas nos dados ou nas estruturas das tabelas, as quais
podem comprometer a integridade do banco de dados. Alm disso, evita o
acesso de determinados usurios a dados sigilosos, como, por exemplo, a
folha de pagamento dos empregados de uma empresa. Com esse propsito, os
SGBDs possuem um conjunto de regras e mecanismos de proteo de acesso
ao banco de dados denominado segurana ou autorizao.

CURSO TCNICO EM INFORMTICA

SENAC-RS

A segurana em banco de dados pode ser classificada em duas categorias:


segurana de sistema: relaciona-se com o controle de acesso ao banco de
dados no nvel de sistema, como, por exemplo, nome de usurio e senha;
segurana de banco de dados: relaciona-se com o controle de uso dos
objetos do banco de dados e as aes que esses usurios podem realizar
sobre os objetos.

Primeiramente veremos como configurar o MySQ com os requisitos iniciais


iinimos de segurana.

6.2.

Configurando os Privilgios Iniciais do MySQL

Depois de instalar o MySQL, normalmente cusma-se configurar os privilgios


iniciais dos acessos atravs do prrpio instalador do MySQL, caso esteja
utilizando alguma verso mais antiga do MySQL verifique diretamente na
documentao oficial do mesmo, citada nas referencias desta apostila.
Seja pelo instalador ou pelos scripts, aps iniciar o servidor mysqld, as tabelas
de permisses com a seguinte configurao dos privilgios:

O usurio root do MySQL criado como um superusurio que

pode fazer qualquer coisa. Conexes devem ser feitas atravs da


mquina local.

NOTA: A senha inicial de root vazia, portanto qualquer um que conectar


como root sem senha ter direito a todos os privilgios.

Um usurio annimo criado e pode fazer o que desejar com

bancos de dados com nome 'test' ou iniciando com 'test_'. Conexes


devem ser feitas da mquina local. Isto significa que usurios locais
podem se conectar sem senha e serem tratados como usurios
annimos.

Outros privilgios so negados. Por exemplo, usurios normais

no podem executar mysqladmin ou mysqladmin processlist.

CURSO TCNICO EM INFORMTICA

SENAC-RS

NOTA: Os privilgios padres so diferentes no Windows. See Seco 2.1.1.8,


Executando o MySQL no Windows.

6.2.1.

Verificando a senha de root

Se voc acabou de instalar o MySQL, tanto no Linux, quanto no Windows,


provavelmente voc j saiba a senha de root (ou ento ela esteja vazia). Se
voc j sabe e tem certeza da senha, pode pular vontade este item.

Para verificar a senha via linha de comando:

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

CURSO TCNICO EM INFORMTICA

SENAC-RS

Como sua instao inicialmente parcialmente aberta, uma das primeiras


coisas que voc deve fazer especificar uma senha para o usurio root do
MySQL. Voc pode fazer isto como a seguir (perceba que a senha foi
especificada utilizando a funo PASSWORD()):

shell> mysql -u root mysql


mysql> SET PASSWORD FOR root@localhost=PASSWORD('nova_senha');

Substitua 'nova_senha' pela senha que voc deseja usar.

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;

Outra forma de configurar a senha utilizando o comando mysqladmin:


shell> mysqladmin -u root password nova_senha

Somente usurios com acesso de escrita/atualizao ao banco de dados mysql


podem alterar a senha de outros usurios. Todos os usurios comuns (no os
annimos) podem alterar somente a prpria senha com um dos comandos
acima ou com SET PASSWORD=PASSWORD('nova_senha').

Perceba que se voc atualizar a senha na tabela user diretamente utilizando


UPDATE, voc deve dizer ao servidor para reler as tabelas de permisses (com
FLUSH PRIVILEGES), de outra forma a alterao no seria notificada.

Uma vez que a senha de root foi configurada, voc deve informar a senha
quando se conectar ao servidor MySQL como root.

CURSO TCNICO EM INFORMTICA

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.

Veja o script scripts/mysql_install_db para ver como so configurados os


privilgios padres. Voc pode usar isto como uma base para ver como
adicionar outros usurios. Se voc deseja que os privilgios iniciais sejam
diferentes do descrito acima, possvel modificar o script mysql_install_db
antes de execut-lo.

Para recriar as tabelas de permisses completamente, remova todos os


arquivos .frm .MYI e .MYD no diretrio contendo o banco de dados mysql. (Este
o diretrio chamado mysql sob o diretrio do banco de dados, que listado
quando

voc

executa

mysqld

--help).

Depois

execute

script

mysql_install_db, possivelmente depois de edit-lo para criar os privilgios


desejveis.

Isto deve ser o suficiente para se conseguir um ambiente minimamente seguro.


Caso deseje saber maiores detalhes sobre configuraes avanadas do
servidor e permisses, voc pode consultar diretamente o manual de referncia
do MySQL.

6.2.3.

Configurando Privilgios (GRANT e REVOKE)

Aps a devida criao e configurao dos usurios necessrios, o prximo


passo dar dos privilgios que cada usurio deve possuir. Neste sentido
existem diversas politicas e boas prticas, uma em especial, que sempre
vlida na hora de conceder qualquer tipo de permisso; a de que deve primeiro
retirar todos os privilgios de todos os usurios e depois adicionar somente as
permisses necessrias.

CURSO TCNICO EM INFORMTICA

SENAC-RS

Para isto utilizamos os comandos GRANT e REVOKE, o qual permitem aos


administradores do sistema criar usurios e conceder e revogar direitos aos
usurios do MySQL em quatro nveis de privilgios.

Comandos:
GRANT:

Adiciona permisses ao usurio.

REVOKE:

Remove permisses do usurio.

Sintaxe:

Os nveis de privilgios no Mysql so os seguintes:

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.

Nvel dos bancos de dados

CURSO TCNICO EM INFORMTICA

SENAC-RS

Privilgios de bancos de dados aplicam-se a todas as tabelas em um


determinado banco de dados. Estes privilgios so armazenados nas tabelas
mysql.db e mysql.host. GRANT ALL ON db.* e REVOKE ALL ON db.*
concedero e revogaro apenas privilgios de banco de dados.

Nvel das tabelas


Privilgios de tabelas aplicam-se a todas as colunas em uma determinada
tabela. Estes privilgios so armazenados na tabela mysql.tables_priv. GRANT
ALL ON db.table e REVOKE ALL ON db.table concedero e revogaro apenas
privilgios de tabelas.

Nvel das colunas


Privilgios de colunas aplicam-se a uma nica coluna em uma determinada
tabela. Estes privilgios so armazenados na tabela mysql.columns_priv.

6.2.4.

Tipos de privilgios

Para as instrues GRANT e REVOKE, tipo_priv pode ser especificado como


um dos seguintes:
ALL [PRIVILEGES]

Configura todos os privilgios simples exceto WITH GRANT OPTION

ALTER

Permite o uso de ALTER TABLE

CREATE

Permite o uso de CREATE TABLE

CREATE

TEMPORARY

Permite o uso de CREATE TEMPORARY TABLE

TABLES
DELETE

Permite o uso de DELETE

DROP

Permite o uso de DROP TABLE.

EXECUTE

Permite que o usurio execute stored procedures (MySQL 5.0)

FILE

Permite o uso de SELECT ... INTO OUTFILE e LOAD DATA INFILE.

INDEX

Permite o uso de CREATE INDEX e DROP INDEX

INSERT

Permite o uso de INSERT

LOCK TABLES

Permite

uso

privilgio SELECT.

de LOCK

TABLES em

tabelas

nas

quais

se

tem

CURSO TCNICO EM INFORMTICA

SENAC-RS

PROCESS

Permite o uso de SHOW FULL PROCESSLIST

REFERENCES

Para o futuro

RELOAD

Permite o uso de FLUSH

REPLICATION CLIENT

Da o direto ao usurio de perguntar onde o slave/master est.

REPLICATION SLAVE

Necessrio para a replicao dos slaves (para ler logs binrio do master).

SELECT

Permite o uso de SELECT

SHOW DATABASES

SHOW DATABASES exibe todos os banco de dados.

SHUTDOWN

Permite o uso de mysqladmin shutdown

SUPER

Permite a conexo (uma vez) mesmo se max_connections tiverem sido


alcanados e executa o comando CHANGE MASTER, KILL thread, mysqladmin
debug, PURGE MASTER LOGS e SET GLOBAL

UPDATE

Permite o uso de UPDATE

USAGE

Sinnimo para sem privilgios''.

GRANT OPTION

Sinnimo para WITH GRANT OPTION

Logicamente muitas destas s podem ser utilizadas em determinados objetos,


assim temos algumas regras no uso destes tipos de permisses, as principais
so:

Os nicos valores de tipo_priv que voc pode especificar para uma


tabela so SELECT, INSERT, UPDATE, DELETE, CREATE, DROP,
GRANT, INDEX e ALTER.

Os nicos valores de tipo_priv que voc pode especificar para uma


coluna

(isto

quando

voc

usar

uma

clusula column_list)

so SELECT, INSERT e UPDATE.

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.

CURSO TCNICO EM INFORMTICA

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!).

Para acomodar concesses de direitos para usurios de mquinas arbitrrias,


o

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').

Voc tambm pode especificar meta caracteres no nome da mquina. Por


exemplo, user@"%.loc.gov" se aplica a user para qualquer mquina no
domnio loc.gov, e user@"144.155.166.%" se aplica a user em qualquer
mquina na subrede de classe C 144.155.166. O formato simples user
sinnimo de user@"%".

O MySQL no suporta metacaracteres em nomes de usurios. Usurios


annimos so definidos inserindo entradas com User='' na tabela mysql.user ou
criando um usurio com um nome vazio com o comando GRANT.

No momento, GRANT suporta somente nomes de mquinas, tabelas, bancos


de dados e colunas at 60 caracteres. J o nome de usurio pode ter at 16
caracteres.

Os privilgios para uma tabela ou coluna so formados atravs do OU lgico


dos privilgios em cada um dos quatro nveis de privilgios. Por exemplo, se a
tabela mysql.user especifica que um usurio tem um privilgio global select,
isto no pode ser negado por uma entrada no nvel de banco de dados, tabela
ou coluna.

CURSO TCNICO EM INFORMTICA

SENAC-RS

Os privilgios para uma coluna podem ser calculados da seguinte forma:


privilgios globais
OR (privilgios de banco
mquina)
OR privilgios de tabela
OR privilgios de coluna

de

dados

AND

privilgios

de

Esta combinao de privilgios nos permite detalhar exatamente o que cada


usurio poder acessar e fazer. E, embora isto seja bem interessante para
algumas situaes e aplicaes especficas, na maioria dos casos, os direitos a
um usurio so atribudos em apenas um dos nveis de privilgios, portanto a
vida normalmente no to complicada como mostrado acima.

Se um usurio no tem privilgios em uma tabela, a tabela no mostrada


quando o usurio solicita uma lista de tabelas (com a instruo SHOW
TABLES por exemplo). O mesmo verdade para SHOW DATABASES

6.2.5.

Privilgio de dar privilgios (WITH GRANT OPTION)

A clusula WITH GRANT OPTION d ao usurio habilidade de fornecer outros


usurios quaisquer privilgios que ele tenha em um nvel especfico de
privilgio. Voc deve ter cuidado ao fornecer o privilgio grant, pois dois
usurios podem se unir para unir privilgios!

Voc no pode conceder a outro usurio um privilgio que no possua; o


privilgio GRANT possibilita fornecer somente os privilgios que possuir. Esteja
ciente que quando conceder a um usurio o privilgio GRANT em um nvel
particular de privilgios, qualquer privilgio que o usurio j possua (ou seja
fornecido no futuro!) nesse nvel tambm pode ser concedido por este usurio.
Suponha que voc conceda a um usurio o privilgio INSERT em um banco de
dados. Se voc conceder o privilgio SELECT no banco de dados e
especificar WITH

GRANT

OPTION,

o usurio alm de poder repassar o

privilgio SELECT poder tambm repassar o insert. Se voc concede o

CURSO TCNICO EM INFORMTICA

SENAC-RS

privilgio UPDATE para o usurio no banco de dados, o usurio poder


conceder os privilgios INSERT, SELECT e UPDATE.

Voc no deve conceder privilgios ALTER a um usurio comum. Se voc fizer


isto, o usurio pode tentar enganar o sistema de privilgios renomeando
tabelas!

Perceba que se voc estiver utilizando privilgios de tabelas ou colunas,


mesmo que para apenas um usurio, o servidor examina os privilgios de
tabelas e colunas para todos os usurios e isto ir deixar o MySQL um pouco
mais lento.
Quando o mysqld inicia, todos os privilgios so lidos na memria. Privilgios
de bancos de dados, tabelas e colunas so iniciados um vez, e privilgios ao
nvel de usurio fazem efeito na prxima vez que o usurio conectar.

As modificaes nas tabelas de permisses que voc realiza pelos comandos

GRANT ou REVOKE so percebidas pelo servidor imediatamente. Agora se


voc

modificar

as

tabelas

de

permisses

manualmente

(utilizando

INSERT,UPDATE, etc), voc deve executar uma instruo FLUSH


PRIVILEGES ou executar mysqladmin

flush-privileges para

dizer ao servidor para recarregar as tabelas de permisses.

As maiores diferenas entre o padro SQL e verses MySQL de GRANT so:

No MySQL privilgios so fornecidos para uma combinao de usurio e


mquina e no somente para um usurio.

O SQL padro no possui privilgios no nvel global ou de bancos de


dados, e no suporta todos os tipos de privilgios que o MySQL suporta.
O MySQL no suporta os privilgios TRIGGER, EXECUTE ou UNDER do SQL99.

Os privilgios do SQL so estruturados em uma maneira hierrquica. Se


voc remover um usurio, todos os privilgios do usurio so removidos.

CURSO TCNICO EM INFORMTICA

No

MySQL

os

privilgios

SENAC-RS

concedidos

no

so

removidos

automaticamente, mas voc deve remov-los se necessrio.

Se no MySQL voc possuir o privilgio INSERT em somente parte das


colunas em uma tabela, voc pode executar instrues INSERT na tabela;
As colunas em que voc no tem o privilgio INSERT iro receber seus
valores padres. O SQL padro necessita que voc tenha o
privilgio INSERT em todas as colunas.

Quando voc remove uma tabela no SQL padro, todos os privilgios


para a tabela so removidos. Se voc remover um privilgio no SQL-99,
todos os privilgios que foram concedidos baseado neste privilgio so
tambm removidos. No MySQL, privilgios s podem ser removidos com
comandos REVOKE explcitos ou manipulando as tabelas de permisses
do MySQL.

CURSO TCNICO EM INFORMTICA

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

Anda mungkin juga menyukai