Anda di halaman 1dari 80

PRTICA DE BANCO DE

DADOS

MINISTRIO DA EDUCAO
PR-REITORIA DE ENSINO
DEPARTAMENTO DE EDUCAAO DISTNCIA
ESCOLA TCNICA ABERTA DO PIAU - ETAPI
CAMPUS TERESINA CENTRAL

PRTICA DE BANCO
DE DADOS

PRESIDENTE DA REPBLICA
Luiz Incio Lula da Silva
MINISTRO DA EDUCAO
Fernando Haddad
GOVERNADOR DO ESTADO
Wellington Dias
REITOR DO INSTITUTO FEDERAL DE EDUCAO, CINCIA E TECNOLOGIA
Francisco da Chagas Santana
SECRETRIO DE EDUCAO A DISTNCIA DO MEC
Carlos Eduardo Bielschowsky
COORDENADORIA GERAL DA UNIVERSIDADE ABERTA DO BRASIL
Celso Costa
SECRETRIO DE EDUCAO DO ESTADO DO PIAU
Antonio Jos Medeiros
COORDENADOR GERAL DO CENTRO DE EDUCAO ABERTA A DISTNCIA
DO INSTITUTO FEDERAL DE EDUCAO, CINCIA E TECNOLOGIA
Elanne Cristina Oliveira dos Santos
SUPERITENDNTE DE EDUCAO SUPERIOR NO ESTADO
Eliane Mendona
ORGANIZAO DO MATERIAL DIDTICO
Claudete de Jesus Ferreira da Silva
AUTORES
Thiago Alves Elias da Silva
Ndia Mendes dos Santos
Wilson de Oliveira Jnior

Boas Vindas!
Caro (a) Cursista
Bem vindo (a) disciplina PRTICA DE BANCO DE
DADOS.
Esta a nossa Apostila, material elaborado com o
objetivo de contribuir para o desenvolvimento de seus estudos e
para a ampliao de seus conhecimentos acerca da citada
disciplina.
Este texto destinado aos estudantes aprendizes que
participam do programa Escola Tcnica Aberta do Brasil (e-Tec
Brasil), vinculado Escola Tcnica Aberta do Piau (ETAPI) do
Instituto Federal de Educao, Cincias e Tecnologia do Piau
(IFPI), com apoio da Prefeitura Municipal dos respectivos plos:
Alegrete do Piau, Batalha, Monsenhor Gil e Valena do Piau.
O texto composto de quatro (04) Captulos assim
distribudos:
Na Aula 1 Banco de Dados, conceitos, definio de
SGBD, projeto de banco de dados passando pelos modelos
conceitual e lgico.
Na Aula 2 A linguagem SQL, tipos de dados, instrues
DDL e instrues DML.
Na Aula 3

apresentado uma viso geral acerca dos

comandos em SQL para se programar no MySQL. Um introduo


aos procedimentos (store procedure) e as funes (functions) e
como se implement-los no MySQL.
Na Aula 4 apresentado viso sobre gatilhos (triggers) e
controle de acesso no MySQL. E como implementar os gatilhos,
criar usurios e atribuir privilgios a esses usurios.

Quem sou?
THIAGO ALVES ELIAS DA SILVA
Sou Tecnlogo em Processamento de Dados pela Faculdade Piauiense de
Processamento de Dados e Engenharia Civil pela Universidade Federal do
Piau. Tenho Especializao em Anlise de Sistemas pela Universidade
Estadual do Piau e Mestrado pela Universidade Federal do Rio Grande do
Norte.
Iniciei minha atividade como docente muito jovem. Em 2001, aos 22 anos,
comecei como professor substituto do, ento, CEFET-PI e, menos de dois
anos depois, fui aprovado para o quadro de professores efetivos da mesma
instituio onde trabalho desde ento.
Em 2009, exerci a funo de coordenador do curso tcnico presencial em
Informtica do IFPI. Atualmente, sou professor das disciplinas de Banco de
Dados dos cursos tcnico e superior desta instituio e de disciplinas na
rea de IHC (Interao Humano-computador), esta ltima, foco do meu
trabalho de mestrado.

NDIA MENDES DOS SANTOS


Curriculum Lattes: http:// lattes.cnpq.br/7392557956968627

ndice Geral

Bacharel em Cincias Contbeis pela Universidade Federal do Piau,


Campus

Ministro

Reis

Velloso,

em

Parnaba,

Tecnlogo

em

Processamento de Dados pela Universidade Estadual do Piau, Campus de

1. PRTICA DE BANCO DE DADOS.................................

Parnaba. Ps-graduao Lato Sensu em Banco de Dados, pelo Centro

1.1 Introduo.......................................................

Federal de Educao do Piau. E atualmente faz Mestrado em Engenharia

1.2 pela
Dados
e Objetos de
BancododeCear,
Dados..............
Eltrica
Universidade
Federal
linha de pesquisa em
1.3 Projeto
de Desde
Banco2006,
de Dados.................
Inteligncia
Artificial.
ela professora do quadro efetivo do
1.3.1
Conceitual...................
Instituto Federal
deModelo
Cincia e
Tecnologia do Piau, Campus Angical do Piau,
na categoria 1.3.2
de Dedicao
Seus principais interesses de pesquisa
ModeloExclusiva.
Lgico...............................
so inteligncia
artificial, estrutura de dados, eletrnica digital,
2.eAatuao
LINGUAGEM
SQL................................................
microprocessadores
e linguagens de programao. E faz parte da
2.1 Introduodigitais
a SQL..............
Equipe
deTipos
Educao
Distncia
do Instituto Federal de Educao, Cincia e
2.2
de Dados
Bsicos...................
Tecnologia do Piau, atuando como tutora distncia do plo de Valena.

2.3 O Comando Create Database..............


2.4 O Comando Create Table...............

WILSON DE OLIVEIRA JUNIOR.


Graduado em Processamento de Dados pela Associao Piauiense
de Ensino Superior do Piau, com especializao em redes de
computadores. Atua h mais de dez anos na rea, desenvolvdendo
trabalhos e prestando consultoria. Possui vasta experincia
acadmica atuando como professor do ensino superior h mais de
oito anos. Atualmente desenvolve pesquisas em redes PLC e redes
Wireless.

10

ndice Geral

PRTICA DE BANCO DE DADOS ................................................... 14


1.1) INTRODUO: ...................................................................... 14
1.2) DADOS E OBJETOS DO BANCO DE DADOS: ................. 15
1.3) PROJETO DE BANCO DE DADOS: ................................... 16
1.3.1) Modelo Conceitual: ........................................................... 18
A LINGUAGEM SQL ......................................................................... 24
2.1) INTRODUO A SQL: .......................................................... 24
2.2) TIPOS DE DADOS BSICOS .............................................. 25
2.3) O COMANDO CREATE DATABASE:.................................. 26
2.4) O COMANDO CREATE TABLE: .......................................... 26
2.5) O COMANDO ALTER TABLE: ............................................. 30
2.5.1) Apagando uma coluna de uma tabela: ................................. 31
2.5.2) Adicionando uma coluna em uma tabela: ............................ 31
2.5.3) Modificando uma coluna de uma tabela: ............................. 32
2.6) O COMANDO DROP TABLE: .............................................. 33
2.7) CONSULTAS SIMPLES: ....................................................... 33
2.7.1) Subconsultas:...................................................................... 35
2.8) MANIPULANDO DADOS DE UMA TABELA (INSERT,
UPDATE, DELETE): ...................................................................... 36
2.8.1) Inserindo dados em uma tabela: .......................................... 36
2.8.2) Alterando dados de uma tabela: .......................................... 38
2.8.3) Excluindo dados de uma tabela: .......................................... 39
2.9) FUNES AGREGADAS: .................................................... 40
2.9.1) Funo Count( ):................................................................. 40
2.9.2) Funo Avg( ): ................................................................... 41
2.9.3) Funo Sum( ): ................................................................... 41
2.9.4) Funo Min( ):.................................................................... 41
2.9.5) Funo Max( ): ................................................................... 41
2.10) A CLUSULA GROUP BY: ................................................ 42
2.11) JUNES (JOIN): ............................................................... 43
2.11.1) Juno Interna (Inner Join): .............................................. 44
2.11.2) Junes Externas (Outer Join): .......................................... 46
2.11.2.1) Juno Externa Esquerda (Left Outer Join):................. 46
2.11.2.2) Juno Externa Direita (Right Outer Join): .................. 47
Procedimento e Funo ........................................................................ 49
3.1 INTRODUO PROGRAMAO EM SQL.................. 49
3.1.1 Comando: BEGIN ... END ................................................... 50
3.1.2 Comando: DECLARE ......................................................... 50
3.1.3 - Comando: SET .................................................................. 51
3.1.4 Comando: OPEN, FETCH, CLOSE ..................................... 52
3.1.5 - Comando: SELECT.... INTO ............................................. 53
3.1.6 - Comando: IF...................................................................... 54
3.1.7 Comando: CASE...WHEN ................................................... 54
3.1.8 Comando: LOOP e ITERATE.............................................. 55
3.1.9 Comando: REPEAT ............................................................. 56

11
3.1.10 Comando: WHILE...DO .................................................... 56
3.1.11 Comando: LEAVE ............................................................. 57
3.1.12 Comando: CALL ............................................................... 57
3.1.13 Comandos: RETURN e RETURNS ................................... 57
3.2 PROCEDIMENTOS (STORE PROCEDURE)..................... 58
3.3 FUNES (Function) ............................................................. 63
Gatilho e Controle de Aceso ................................................................. 70
4.1
GATILHO (TRIGGER) ....................................................... 70
4.2
CONTROLE DE ACESSO................................................. 74
4.3
PRIVILGIOS ..................................................................... 76

12

ndice de Figuras

Figura 1 - Exemplos de SGBDs ........................................................... 14


Figura 2 - Organizao de um SGBD .................................................. 15
Figura 3 -Notao para Diagramas Entidade-relacionamento ................ 19
Figura 4 - Diagrama Entidade Relacionamento ..................................... 20
Figura 5 - Bloco de Comandos ............................................................. 49

Prtica de Banco de
Dados introduo e
projeto de banco de
dados.

1
13

Aula

Meta da Aula
Fazer

uma

introduo

da

disciplina e modelar um banco de


dados.

Objetivos

Ao final desta aula, voc dever ser


capaz de:
1. conhecer os conceitos de Banco de
Dados e SGBDs;
2. Modelar um Banco de Dados;

14

PRTICA DE BANCO DE DADOS


1.1) INTRODUO:
Convido voc para embarcarmos neste maravilho
mundo de banco de dados que nos espera de braos
abertos. Se estivermos prontos, vamos l!
Nesta disciplina de Prtica de Banco de Dados, como
o prprio nome sugere, aplicaremos, na prtica, alguns
conceitos de banco de dados.
Daremos nfase implementao do banco de
dados, estudando desde a modelagem, passando pela
criao de uma base de dados at a sua manipulao
atravs de consultas simples e complexas em tabelas,
criao de procedimentos armazenados dentre outros
objetos de banco de dados.
Tentaremos, ao mximo, utilizar uma linguagem
simples e de baixa complexidade. Vale lembrar que o
objetivo da disciplina no aprendermos a utilizar um SGBD
em especfico, focaremos no aprendizado da linguagem
SQL. Porm, como no poderemos seguir na disciplina sem
utilizarmos um determinado SGBD, indicamos o MYSQL
como referncia. Lembro-lhe tambm que existem outros
SGBDs, alguns gratuitos, outros pagos. Listamos alguns
exemplos a seguir: Postgresql, SQL Server, Oracle, Access,
Firebird, dentre outros.

Figura 1 - Exemplos de SGBDs

15
Para aqueles que esto esquecidos, SGBD significa
Sistema Gerenciador de Banco de Dados e nada mais do
que um conjunto de software que tem por objetivo
administrar uma base dados, gerenciando o acesso, a
manipulao e a organizao dos dados. O SGBD prov
uma interface amigvel para o usurio de tal forma que ele
possa incluir, alterar ou consultar os dados.

Figura 2 - Organizao de um SGBD

Bem, antes de colocarmos a mo na massa e


comearmos a codificar a nossa base de dados e as nossas
tabelas, precisamos conhecer alguns conceitos. Vamos l?
1.2) DADOS E OBJETOS DO BANCO DE DADOS:
Segundo COSTA (2006), os SGBDs foram projetados
para armazenar dados. Nos SGBDs relacionais e objetorelacionais, os dados so armazenados em tabelas. As
tabelas so um dos tipos de objetos do banco de dados.
Existem outros tipos de objetos, tais como vises, gatilhos,
procedimentos, dentre outros. Note que, embora os SGBDs
objeto-relacional e orientados a objetos possam armazenar
objetos como os definidos na orientao a objetos, os
objetos do banco de dados a que nos referimos no so os

16
objetos da orientao a objetos e, sim, estruturas internas de
Sistemas Gerenciadores.
Em outras palavras, a partir de agora, quando
falarmos de objetos de banco de dados em SGBDs
relacionais,

no

estaremos

nos

referindo

objetos

estudados na disciplina de Introduo a Programao


Orientada a Objetos e, sim, a estruturas internas do Sistema
Gerenciador,

tais

como

tabelas,

procedimentos

armazenados, gatilhos e tantas outras estruturas que ainda


iremos estudar.
1.3) PROJETO DE BANCO DE DADOS:
Ao construirmos uma aplicao para controlar, por
exemplo, o mercadinho do Seu Raimundo, devemos criar
um banco de dados para armazenar as informaes. Porm
algumas perguntas nos vm cabea: como os dados sero
armazenados? Se pensarmos em armazenar em tabelas,
quantas precisaremos criar, quais as informaes sero
armazenadas em cada uma delas e quais os tipos de dados
de cada informao? Para respondermos a estas perguntas,
devemos projetar o banco de dados a partir de modelos que
se

divide

em

trs

etapas:

modelagem

conceitual,

modelagem lgica e modelagem fsica.


Na modelagem conceitual, h a representao dos
conceitos e caractersticas observadas no ambiente
para o qual se deseja projetar o banco de dados, ou
seja, a empresa para o qual o sistema est sendo
desenvolvido. Nesta etapa, devemos ignorar as
particularidades de implementao.

17
Na modelagem lgica, buscamos transformar o
esquema conceitual para informaes tcnicas que
possam

ser

compreendidas

utilizadas

por

desenvolvedores e administradores de banco de


dados.

na

modelagem

fsica,

so

consideradas

caractersticas especficas do SGBD onde est sendo


implementada a base de dados.
Como forma de exemplificao, utilizaremos um
estudo de caso de um sistema que controlar uma empresa
de desenvolvimento de projetos. Este mesmo banco de
dados ser utilizado no decorrer de todo o material. Logo
abaixo, iniciaremos a explicao do estudo de caso e, em
seguida, projetaremos o nosso banco de dados.
Uma empresa de desenvolvimento de projetos deseja
informatizar-se. Aps uma conversa com os proprietrios e
funcionrios

da

empresa

levantamos

as

seguintes

informaes:
Cada funcionrio est lotado em um departamento e
em um determinado departamento poder existir vrios
funcionrios trabalhando nele. Os departamentos so
cadastrados a partir de seu cdigo, descrio e sua
localizao no prdio. O sistema precisa manter tambm os
dados de todos os funcionrios, tais como: nome e data de
nascimento. No cadastro dos projetos, deve existir seu
cdigo, que o seu identificador nico, o nome do projeto, o
oramento, a data de incio e a data prevista para a sua
concluso.
Um projeto poder ser desenvolvido por uma equipe
ou por apenas um funcionrio. Da mesma forma, um
funcionrio poder desenvolver mais de um projeto, ao
mesmo tempo ou no.

18
No ato da vinculao do funcionrio ao projeto, o
sistema deve controlar a data da vinculao, a data de
desvinculao e a funo desempenhada pelo funcionrio
naquele projeto. A escolha da funo NO est relacionada
ao departamento que o funcionrio est lotado. Para cada
funo, existe um valor de salrio mensal que poder ser
pago de forma integral ou proporcional, caso o funcionrio
no trabalhe um ms inteiro.
Quando um funcionrio se vincula a um projeto e,
aps a concluso da sua participao, este se desvincula,
ele no poder mais participar novamente do mesmo
projeto, mesmo que desempenhando uma outra funo, ou
seja, cada funcionrio s poder associar-se apenas uma
vez em cada projeto.

1.3.1) Modelo Conceitual:


Para a modelagem conceitual, utilizaremos o modelo
Entidade-relacionamento que j foi estudado na disciplina de
Introduo a Banco de Dados.
Segundo COSTA (2006), uma entidade representa
um conjunto de objetos da realidade que est sendo
modelada. No mundo real, os objetos representados pelas
entidades podem interagir entre si de diferentes formas.
Para modelar tais interaes, utilizamos os relacionamentos.
As entidade que possuem vnculos entre si estaro ligadas
por relacionamentos. Alm disso, no mundo real, cada
entidade poder ter uma srie de propriedades, as quais so
modeladas atravs de atributos. Algumas vezes, os
relacionamentos

tambm

possuem

atributos

prprios.

Entidades, relacionamentos e atributos possuem um nome.


Para enriquecer o modelo, utilizamos as cardinalidades.
Estas representam o nmero de interaes que uma dada
instncia de uma entidade poder ter com instncias de
outra entidade a ela relacionada.

19
Existem diferentes representaes para modelarmos
um banco de dados a partir do modelo entidaderelacionamento. Abaixo, seguem as representaes que
utiliza neste material.
Entidade

Atributo

NOME_ENTIDADE
NOME_ATRIBUTO

Relacionamento

Atributo Identificador
NOME
NOME_ATRIBUTO

Figura 3 -Notao para Diagramas Entidade-relacionamento

Seguindo com a anlise do nosso estudo de caso,


descobrimos a existncia de quatro entidades: Funcionrio,
Projeto, Departamento e Funo.
Funcionrio

Projeto

Departamento

Funo

Observamos tambm que a entidade Funcionrio


interage com as entidades Projeto e Departamento. Quanto
s cardinalidades, a partir da anlise do texto que descreve
o estudo de caso, um funcionrio poder se relacionar a
apenas um departamento, mas um departamento poder ter
um ou vrios funcionrios associados a ele. Por sua vez, um
funcionrio poder desenvolver mais de um projeto e um
projeto poder ser desenvolvido por um ou por vrios
funcionrios. J a entidade Funo se relaciona ao
Funcionrio e ao Projeto, j que a funo do funcionrio
determinada na hora em que este se associa a um
determinado projeto.

20
Assim, temos o diagrama abaixo, representando o
modelo conceitual do banco de dados do sistema que
gerencia a nossa empresa de desenvolvimento de projetos:

Figura 4 - Diagrama Entidade Relacionamento

1.3.2) Modelo Lgico:


Segundo Costa (2006), muitas vezes, uma entidade
ou relacionamento do diagrama entidade-relacionamento se
tornar uma tabela no projeto lgico. Existem algumas
situaes onde isso no verdade. Essas situaes so
especificadas, principalmente, a partir das cardinalidades
existentes.
A partir da aplicao das regras de cardinalidade no
modelo

conceitual

apresentado

na

figura

anterior,

especificamos, abaixo, as suas respectivas tabelas. Os


nomes em negritos representam as tabelas. Os itens
delimitados por parnteses so as colunas de cada tabela.
As colunas que tm o seu nome sublinhado formam as
chaves primrias das tabelas. J aquelas com o nome em
itlico representam chaves estrangeiras.
Departamento (cod_dep, descr, localiz)
Funcionrio (Cod_func, nome, dt_nasc, cod_dep)
Projeto (cod_proj, nome, oramento, dt_ini, dt_prev_term)

21
Funo (cod_funcao, nome, sal)
Trabalha (cod_func, cod_proj, cod_funcao, dt_ent, dt_sai)
A partir da especificao das tabelas, poderemos
definir, no projeto lgico, as restries adicionais para cada
coluna, indicando, por exemplo, se seu preenchimento
obrigatrio ou no. Poderemos tambm especificar o tipo de
informao que ser armazenada em uma coluna, definindo
o domnio utilizado para os dados.
TABELA

COLUNA
Cod_dep

Departamento

Desc

Localiz
Cod_func
Nome
Dt_nasc
Funcionrio

DESCRIO

TIPO DE
DADOS

Cdigo do

Numrico

departamento

inteiro.

Descrio do

Cadeia de

departamento

caracteres.

Localizao do
departamento

REQUERIDO
Sim.
Sim

Cadeia de
caracteres.

Cdigo do

Numrico

funcionrio

inteiro.

Nome do

Cadeia de

funcionrio

caracteres.

Sim

Sim
Sim

Data de
nascimento do

Data.

No

funcionrio
Cdigo do
Cod_dep

departamento que

Numrico

o funcionrio

inteiro.

No

trabalha
Cod_proj
Nome
Oramento
Projeto

Dt_ini

Cdigo do

Numrico

projeto

inteiro.

Nome do projeto

Cadeia de
caracteres.

Oramento do

Nmero

projeto

Real.

Data de incio do
projeto

Sim
Sim
Sim

Data.

Sim

Data.

Sim

Data prevista
para o trmino do
Dt_prev_term

projeto

22
Cod_funcao

Cdigo da funo

Nome

Nome da funo

Funo

Numrico
inteiro.
Cadeia de
caracteres.

Sim
Sim

Salrio pago para


Sal

quem

Nmero

desempenhar a

Real.

Sim

funo
Cod_func
Cod_proj

Cdigo do

Numrico

funcionrio

inteiro.

Cdigo do

Numrico

projeto

inteiro.

Sim
Sim

Cdigo da funo
Cod_funcao
Trabalha

desempenhada

Numrico

pelo funcionrio

inteiro.

Sim

no projeto
Data de entrada
Dt_ent

do funcionrio no

Data.

Sim

Data.

No

projeto
Data de sada do
Dt_sai

funcionrio do
projeto

EXERCCIO AULA 1
1) Defina SGBD, explique qual a sua principal funo e cite, pelo
menos, 3 exemplos.
2) Quando falamos em objetos de banco de dados, estamos nos
referindo aos mesmos objetos definidos na orientao a objetos?
Explique.
3) Defina a modelagem conceitual, modelagem lgica e
modelagem fsica.
4) Modele, a partir do modelo entidade-relacionamento, o banco de
dados de um sistema que controlar uma clnica mdica. Nesta
clnica, devero ser cadastrados todos os mdicos, alm de suas
especialidades. Mesmo que o mdico possua mais de uma
especialidade, ele dever escolher apenas uma delas para trabalhar
na clnica. Todos os pacientes tambm devero ser cadastrados
com todos os seus dados. Os dados das consultas devero ser
armazenados tambm no banco de dados: a data em que a consulta
aconteceu, o mdico que atendeu o paciente, bem como o
diagnstico feito pelo mdico.

2
23

A Linguagem SQL
Principais Comandos

Aula

Meta da Aula
Conhecer as principais instrues

Objetivos

DDL e DML da linguagem SQL.

Ao final desta aula, voc dever ser


capaz de:
1. Construir e alterar tabelas em um
banco de dados;
2. Realizar consultas simples e
complexas em um banco de dados.

24

A LINGUAGEM SQL
2.1) INTRODUO A SQL:
Structured Query Language, ou

Linguagem de

Consulta Estruturada ou SQL, uma linguagem de pesquisa


Voc
que...

Sabia

O
SQL
foi
desenvolvido
originalmente
no
incio dos anos 70 nos
laboratrios da IBM
em San Jose, dentro do
projeto System R, que
tinha por objetivo
demonstrar
a
viabilidade
da
implementao
do
modelo
relacional
proposto por E. F.
Codd. O nome original
da linguagem era
SEQUEL, acrnimo
para
"Structured
English
Query
Language"
(Linguagem
de
Consulta Estruturada
em Ingls), vindo da
o fato de, at hoje, a
sigla, em ingls, ser
comumente
pronunciada "squel"
ao invs de "s-ki-l",
letra a letra. No
entanto, em portugus,
a pronncia mais
corrente a letra a
letra: "se-qu-le".
Fonte: Wikipdia

declarativa para banco de dados.


A linguagem SQL um grande padro de banco de
dados. Isto decorre da sua simplicidade e facilidade de uso.
Ela se diferencia de outras linguagens de consulta a banco
de dados no sentido em que uma consulta SQL especifica a
forma do resultado e no o caminho para chegar a ele. Ela
uma linguagem declarativa em oposio a outras linguagens
procedurais. Isto reduz o ciclo de aprendizado daqueles que
se iniciam na linguagem.
Embora o SQL tenha sido originalmente criado pela
IBM, rapidamente surgiram vrios "dialectos" desenvolvidos
por outros produtores. Essa expanso levou necessidade
de ser criado e adaptado um padro para a linguagem. Esta
tarefa foi realizada pela American National Standards
Institute (ANSI) em 1986 e ISO em 1987.
O SQL foi revisto em 1992 e a esta verso foi dado o
nome de SQL-92. Foi revisto novamente em 1999 e 2003
para

se

tornar

SQL:1999

(SQL3)

SQL:2003,

respectivamente. O SQL:1999 usa expresses regulares de


emparelhamento, queries recursivas e gatilhos (triggers).
Tambm foi feita uma adio controversa de tipos noescalados e algumas caractersticas de orientao a objeto.
O SQL:2003 introduz caractersticas relacionadas ao XML,
seqncias padronizadas e colunas com valores de autogeneralizao (inclusive colunas-identidade).
Tal

como

dito

anteriormente,

SQL, embora

padronizado pela ANSI e ISO, possui muitas variaes e


extenses produzidos pelos

diferentes fabricantes de

sistemas gerenciadores de bases de dados. Tipicamente a

25
linguagem pode ser migrada de plataforma para plataforma
sem mudanas estruturais principais.
As instrues da linguagem SQL podem ser divididas
em dois grandes grupos: Linguagem de Manipulao de
Dados (LMD ou Data Manipulation Language DML) e a
Linguagem de definio de dados (LDD ou Data Definition
Language DDL). A DML trata dos comandos de
Voc Sabia que...
Os vrios fornecedores
de
Sistemas
Gerenciadores
de
Banco
de
Dados
utilizam
variaes
prprias dos tipos de
dados definidos na
SQL:2003.
No Oracle, o tipo de
dados mais utilizado
para tratamento de
informaes
numricas o tipo
NUMBER. J no SQL
SERVER 2005 e no
DB2 verso 9, so
utilizados vrios tipos
de
dados
para
armazenamento
de
informaes
numricas,
com
denominaes
bem
prximas do padro
SQL.
No que se refere a
tipos
de
dados
referentes a cadeias de
caracteres,
os
principais
gerenciadores
de
banco
de
dados
comerciais
se
aproximam bastante
do
padro
da
linguagem.
Fonte: Costa (2006)

manipulao de dados, definindo os comandos para a


seleo, incluso, alterao e excluso de dados de tabelas.
J a DDL rene os comandos para criao e manipulao
de estruturas e objetos do banco de dados.
2.2) TIPOS DE DADOS BSICOS
Em banco de dados relacionais, cada tabela pode
conter diversas colunas, as quais armazenaro os dados.
Para cada coluna, existir um tipo de dado associado. Os
tipos de dados so definidos durante a criao da tabela.
Apresentamos, a seguir, os principais tipos de dados
simples definidos pela SQL:2003.
Tipos de Dados
CHARACTER
CHARACTER
VARYING
CHARACTER
LARGE OBJECT
BINARY LARGE
OBJECT
NUMERIC
DECIMAL
SMALLINT
INTERGER
BIGINT
FLOAT
REAL
DOUBLE
PRECISION
BOOLEAN
DATE
TIME
TIMESTAMP

Descrio
Caractere de tamanho fixo usualmente conhecido
como CHAR
Caractere de tamanho variante usualmente
conhecido como VARCHAR
Caractere longo usualmente conhecido como
CLOB
String binria para objetos longos usualmente
conhecido como BLOB
Numrico exato
Numrico exato
Numrico exato
Numrico exato
Numrico exato
Numrico aproximado
Numrico aproximado
Numrico aproximado
Booleano
Data com informaes de dia, ms e ano
Hora com informaes de hora, minuto e segundo
Determina um momento, com informaes de ano,
ms, dia, hora, minuto e segundo

26
2.3) O COMANDO CREATE DATABASE:
A instruo Create Database, como o prprio nome
sugere, serve para criarmos a base de dados na qual as
tabelas ser criadas.
Sua sintaxe bastante simples. Vejamos, atravs de
exemplo, a criao de uma base de dados chamada
PraticaBD.

2.4) O COMANDO CREATE TABLE:


Aps criarmos a nossa base de dados, criaremos as
nossas tabelas. Para isso, faremos uso do comando Create
Table.
O

comando

Create Table

permite

criarmos

definirmos a estrutura de uma tabela, definindo suas colunas


(campos), suas respectivas restries, alm de suas chaves
primrias e estrangeiras. Sua sintaxe :

Obs: Os campos entre colchetes [] so opcionais.

Onde:
nome-tabela representa o nome da tabela que ser
criada.
nome-coluna representa o nome da coluna que ser
criada. A definio das colunas de uma tabela feita
relacionando-as uma aps a outra.
tipo-do-dado define o tipo e tamanho dos campos
definidos para a tabela.

27
NOT NULL exige o preenchimento do campo, ou seja,
no momento da incluso obrigatrio que possua um
contedo.
NOT NULL WITH DEFAULT preenche o campo com
valores pr-definidos, de acordo com o tipo do campo, caso
no seja especificado o seu contedo no momento da
incluso do registro.
CONSTRAINT nome PRIMARY KEY (nome-colunachave) defini para o banco de dados a coluna que ser a
chave primria da tabela. Caso ela tenha mais de uma
coluna como chave, elas devero ser relacionadas entre os
parnteses e separadas por vrgulas.
CONSTRAINT nome FOREIGN KEY (nome-colunachave-estrangeira) REFERENCES nome-tabela-pai (nomecampo-pai) defini para o banco de dados as colunas que so
chaves estrangeiras, ou seja, os campos que so chaves
primrias de outras tabelas. Na opo REFERENCES deve
ser especificado a tabela na qual a coluna a chave
primria.
ON DELETE especifica os procedimentos que devem
ser feitos pelo SGBD quando houver uma excluso de um
registro

na

tabela

pai

quando

existe

um

registro

correspondente nas tabelas filhas. As opes disponveis


so:
RESTRICT - Opo default. Esta opo no permite a
excluso na tabela pai de um registro cuja chave primria
exista em alguma tabela filha.
CASCADE - Esta opo realiza a excluso em todas
as tabelas filhas que possua o valor da chave que ser
excluda na tabela pai.
SET NULL - Esta opo atribui o valor NULO nas
colunas das tabelas filhas que contenha o valor da chave
que ser excluda na tabela pai.

28
Antes de iniciarmos a criao das tabelas do nosso
estudo de caso, vale ressaltar que a ordem de criao
dessas tabelas de suma importncia. Isso se deve ao fato
das tabelas estarem conectadas atravs de suas chaves
primrias e estrangeiras. Vamos explicar de uma maneira
diferente. Sabemos, por exemplo, que a tabela Funcionrio
recebe, como chave estrangeira, a chave primria da
tabela

departamento.

Assim,

caso

tentssemos

criar

primeiro a tabela funcionrio, durante a sua declarao


diramos que ela possui um atributo chave estrangeira e que
este se conecta com a

chave

primria

da

tabela

departamento. Como a tabela departamento ainda no


existiria na base de dados, o SGBD acusaria uma
mensagem de erro informando que no conhece a tabela
Departamento.
Dito isso, iniciaremos a criao das tabelas.
Abaixo, apresentamos o cdigo SQL que cria a tabela
departamento.

Conforme

observamos,

tabela

departamento possui 3 atributos, sendo o cdigo do


departamento (cod_dep) do tipo inteiro e chave primria da
tabela.

Observamos tambm que foi inserido um valor default


para o atributo descrio (descr). Caso no seja informado
um valor para o atributo descrio, o prprio SGBD incluir o
valor No informado.
Como no especificamos a clusula ON DELETE, o
SGBD no permitir a excluso na tabela pai de um registro
cuja chave primria exista em alguma tabela filha.

29
A prxima tabela que criaremos ser a tabela
Funcionrio.

Ateno
Perceba que, de
acordo com a sintaxe
de
criao
das
tabelas,
no

obrigatrio que as
chaves primrias e
estrangeiras tenham
o mesmo nome.
Usando
como
exemplo as tabelas
Funcionrio
e
Departamento,
observe
que
o
atributo cod_dep da
tabela
funcionrio
no precisaria ter o
mesmo nome do
atributo cod_dep da
tabela
Departamento. Isso
s possvel por
que,
durante
a
declarao da chave
estrangeira, dizemos
explicitamente com
qual
atributo
devemos conectar o
atributo cod_dep da
tabela Funcionrio.

Observamos que a tabela funcionrio possui duas


restries (constraint). A primeira determina o cdigo do
funcionrio (cod_func) como a chave primria da tabela e a
segunda restrio determina o atributo cod_dep como chave
estrangeira que veio da tabela departamento.
Abaixo, seguem as criaes das tabelas Funo e
Projeto:

A clusula CHECK serve para implementarmos


restries de domnio. Durante a criao da tabela Projeto,
inserimos uma restrio que garante que a data de incio do
projeto (dt_ini) seja menor que a data prevista de trmino
(dt_prev_term). O clusula check tambm poderia ser usada
para comparar um atributo com um valor absoluto e no
apenas para comparar um atributo com outro atributo,
conforme exemplo anterior.

30
Por fim, apresentamos a criao da tabela Trabalha.
Esta tabela, obrigatoriamente, deveria ser a ltima tabela a
ser criada no nosso banco de dados. Isso se deve ao fato
desta tabela receber, como chaves estrangeiras, atributos
oriundos das tabelas Funcionrio, Projeto e Funo.

Na tabela Trabalha, inserimos uma restrio chamada


checa_datas para garantir que a data de entrada do
funcionrio no projeto (dt_ent) seja sempre menor que a sua
data de sada (dt_sai).

2.5) O COMANDO ALTER TABLE:


Segundo Pazin (2003), o comando ALTER TABLE
permite alterar a estrutura de uma tabela acrescentando,
alterando, retirando e alterando nomes, formatos das
colunas e a integridade referencial definidas em uma
determinada tabela. A sintaxe para esse comando :

Onde:
nome-tabela representa o nome da tabela que ser
atualizada.

31
nome-coluna representa o nome da coluna que ser
criada.
tipo-do-dado a clusula que define o tipo e tamanho
dos campos definidos para a tabela.
DROP nome-coluna realiza a retirada da coluna
especificada na estrutura da tabela.
ADD nome-coluna tipo-do-dado realiza a incluso da
coluna especificada na estrutura da tabela. Na coluna
correspondente a este campo nos registros j existentes
ser preenchido o valor NULL (Nulo). As definies NOT
NULL e NOT NULL WITH DEFAULT so semelhantes do
comando CREATE TABLE.
MODIFY

nome-coluna

tipo-do-dado

permite

alterao na caracterstica da coluna especificada.


Apresentaremos exemplos utilizando as clusulas
anteriormente citadas.

2.5.1) Apagando uma coluna de uma tabela:


Imagine que voc deseja, por alguma razo, apagar a
coluna que armazena a data de sada (dt_sai) da tabela
trabalha. Como faramos isso? O quadro abaixo apresenta a
soluo:

2.5.2) Adicionando uma coluna em uma tabela:


Imagine que, aps criarmos a tabela funcionrio e j
termos cadastrados alguns registros, percebemos que
esquecemos de criar a coluna telefone na tabela. Como
resolveramos este problema?

32

Perceba que criamos a coluna telefone com um valor


default No Informado. O que tentamos fazer utilizando
este artifcio? Voc teria alguma explicao?
Bem, caso a incluso desta coluna ocorra aps
alguns funcionrios j terem sido cadastrados e caso
tivssemos criado a nova coluna telefone aceitando valores
nulos (NULL), no teramos nenhum problema, pois seria
atribudo valor nulo aos telefones de todos os funcionrios
que j estivessem cadastrados na tabela. Porm, como
queremos criar a coluna telefone no aceitando valores
nulos (NOT NULL), fomos obrigados a criar este valor
default No Informado para ser inserido na coluna telefone
de todos os funcionrios que j se encontravam cadastrados
na tabela. Fomos claros na explicao?

2.5.3) Modificando uma coluna de uma tabela:


E se precisssemos mudar as caractersticas de uma
coluna da tabela aps a sua criao? Como exemplo,
imagine que desejamos aceitar valores nulos no atributo
salrio (sal) da tabela Funo. Alm disso, desejamos
tambm alterar o domnio do atributo, passado de real para
integer. Para isso, observe o cdigo abaixo:

33
2.6) O COMANDO DROP TABLE:
O comando Drop Table serve para destruirmos uma
tabela. Se, por exemplo, precisssemos destruir a tabela
trabalha, usaramos o comando abaixo.

Perceba que a sintaxe do comando bastante


simples. Basta escrevermos, aps Drop Table, o nome da
tabela que desejamos destruir. Lembre-se que algumas
tabelas podem ser dependentes da tabela que desejamos
destruir. Por exemplo, caso fssemos destruir a tabela
departamento,

teramos

que

lembrar

que

tabela

funcionrio dependente de departamento, pois ela recebe


o

atributo

cod_dep

como

chave

estrangeira.

Para

resolvermos este problema, teramos que destruirmos a


referncia de chave estrangeira da tabela funcionrio, ou
mesmo, chegarmos ao ponto de destruirmos primeiro a
tabela funcionrio, para s depois eliminarmos a tabela
departamento. Caso optssemos pela segunda soluo,
teramos que lembrar que a tabela trabalha tambm
dependente de funcionrio e o mesmo procedimento deveria
ser tomado.
2.7) CONSULTAS SIMPLES:
Consultar dados em

um

banco

de

dados,

normalmente, a operao mais utilizada pelos usurios.


Para isso, precisamos fazer uso da instruo Select. Ela
considerada por muitos, como a instruo mais poderosa da
linguagem SQL. Nesta seo, apresentaremos a sua
estrutura bsica. Nas pginas seguintes, apresentaremos
formas avanadas de utilizao dessa instruo.

34
A sintaxe bsica da instruo Select a seguinte:

Onde:
lista_atributos representa, como o nome sugere, a
lista dos atributos que se deseja apresentar no resultado da
consulta.
nome-tabela representa o nome da(s) tabela(s) que
contem as colunas que sero selecionadas ou que sero
utilizadas para a execuo da consulta.
Apelido representa os nomes que sero usados como
nomes de tabelas em vez dos nomes originais. A vantagem
desse recurso que, em casos de consultas muito grandes,
com a utilizao de apelidos, digitamos menos.
condio representa a condio para a seleo dos
registros. Esta seleo poder resultar em um ou vrios
registros.
Para

melhor

entendermos

esta

instruo,

apresentaremos alguns exemplos:


I Obter todas as informaes de todos os
funcionrios;

Neste exemplo, percebemos que no fizemos uso da


clusula where. Isso se deve ao fato da questo no colocar
uma condio de busca. Assim, conclumos que o where s
necessrio em consultas que possuem uma condio para
a seleo.

35
II Obter o nome e a data de nascimento do
funcionrio de cdigo 2:

Nesta consulta, como a questo apresentava uma


condio para a seleo (cdigo do funcionrio igual a 2),
utilizamos a clusula where.

2.7.1) Subconsultas:
Realizar subconsultas uma forma de combinar mais
de uma consulta (select) obtendo apenas um resultado.
Vamos apresentar exemplos como forma de explicar
o assunto:
Imagine que precisamos obter o nome de todos os
funcionrios

que

esto lotados

no departamento de

contabilidade. Perceba que o nome do departamento est na


tabela Departamento, enquanto que o nome do funcionrio
est na tabela Funcionrio. Assim, precisaramos utilizar as
duas tabelas para obtermos o nosso resultado. A instruo
que atende nossa necessidade encontra-se logo abaixo:

Observe que utilizamos o cdigo do departamento


como ponte para pularmos da tabela funcionrio para a
tabela departamento. Isso aconteceu, pois a chave primria
de departamento (cod_dep) a chave estrangeira da tabela
Funcionrio.

36
2.8) MANIPULANDO DADOS DE UMA TABELA (INSERT,
UPDATE, DELETE):
Como dissemos anteriormente, na linguagem SQL
existem instrues para definio de dados (DDL), e
instrues para manipulao de dados (DML). Conhecemos,
at agora, alguns comandos DDL e, nas prximas pginas,
conheceremos

instrues

de

manipulao.

So

elas;

INSERT INTO, UPDATE e DELETE.

2.8.1) Inserindo dados em uma tabela:


Para incluirmos dados em uma tabela, utilizamos a
instruo Insert Into. Este comando permite inserirmos um
ou vrios registros em uma tabela do banco de dados. A
sintaxe a seguinte:

Onde:
nome-tabela representa o nome da tabela onde ser
includa o registro.
nome-coluna representa o nome da(s) coluna(s) que
tero contedo no momento da operao de incluso. Obs:
esta relao opcional.
Relao dos valores representa os valores a serem
includos na tabela.
Existem trs observaes importantes para fazermos
sobre este comando. Vamos coment-las a partir de
exemplos.
Vejamos o primeiro exemplo:

No exemplo anterior, cadastramos o departamento 1,


chamado Anlise e que se localiza na sala B2-30. Perceba

37
que, aps o nome da tabela departamento, no colocamos a
lista com o nome das colunas que seriam povoadas. Isso
possvel, porm temos que, obrigatoriamente, inserirmos as
informaes das colunas da tabela na mesma ordem em que
elas foram criadas. No nosso caso, primeiro o cdigo do
departamento, depois a descrio e, por fim, a sua
localizao.
Vejamos um segundo exemplo:

Neste segundo exemplo, cadastramos a funcionria


de cdigo 1 chamada Maria e que trabalha no departamento
de cdigo 1. Perceba que, aps o nome da tabela
Funcionrio, colocamos a lista com os nomes das colunas
que deveriam ser preenchidas na tabela. Perceba tambm
que a ordem no a mesma utilizada na criao da tabela.
E mais, no colocamos, na lista, o atributo referente data
de nascimento da funcionria. Ento voc poderia estar se
perguntando: O que acontecer com o atributo data de
nascimento

quando

executarmos

esta

instruo.

explicao para sua pergunta que o prprio SGBD atribuir


valor nulo para a data de nascimento da Maria. Isso s
possvel porque, quando criamos a tabela funcionrio,
dissemos que o atributo data de nascimento aceitaria
valores nulos. Caso voc ainda tenha alguma dvida, volte
algumas pginas e veja o cdigo de criao da referida
tabela.
Agora, antes de comentarmos o nosso terceiro
exemplo, imagine que possumos, no banco de dados, a
tabela Pessoa com a seguinte estrutura:
Codigo

Apelido

Data_nasc

Cod_setor

Nome_me

100

Joozinho

01/01/1980

Francisca

38
200

Maricota

02/02/1979

Raimunda

300

Franz

03/03/1978

Joanete

Bem, agora imagine que precisamos cadastrar, na


tabela funcionrio, todos os registros da tabela Pessoa.
Como faramos isso de maneira rpida? Como forma de
agilizarmos o nosso trabalho, poderamos executar o
seguinte comando:

Perceba que conseguimos, atravs de uma nica


instruo, inserirmos vrios registros na tabela funcionrio.
Isso s foi possvel por que a instruo Insert into permite
que cadastremos o resultado de um select, desde que este
select produza uma tabela compatvel com a tabela na qual
estamos inserindo.

2.8.2) Alterando dados de uma tabela:


Para alterarmos uma informao contida numa tabela
do banco de dados, utilizamos o comando UPDATE. Ele
atualiza dados de um registro ou de um conjunto de registro.
A sua sintaxe a seguinte:

Onde:
nome-tabela representa o nome da tabela cujo
contedo ser alterado.
nome-coluna representa o nome da(s) coluna(s) tero
seus contedos alterados com o novo valor especificado.

39
condio representa a condio para a seleo dos
registros que sero atualizados. Este seleo poder
resultar em um ou vrios registros. Neste caso a alterao
ir ocorrer em todos os registros selecionados.
Vejamos os exemplos abaixo:

No exemplo acima, estamos alterando para 1000 os


oramentos dos projetos que possuem cdigo igual a 1 ou
igual a 5.

J neste ltimo exemplo, alteramos para 2000 os


oramentos de TODOS os projetos. Isso aconteceu por que
no utilizamos a clusula where para delimitar as linhas que
seriam selecionadas para serem alteradas.

2.8.3) Excluindo dados de uma tabela:


O comando delete utilizado para excluir linhas de
uma tabela. Abaixo, apresentamos a sua sintaxe:

Caso desejssemos deletar os projetos que custam


mais de 2000, usaramos o seguinte comando:

Quando vamos deletar qualquer registro, devemos


nos lembrar da Integridade Referencial. Este conceito
determina que um registro no pode fazer referncia a um
outro registro do banco de dados que no existe. Por
exemplo,

ns

no

poderamos

simplesmente

deletar

40
projetos, caso estes ainda estivessem sendo referenciados
pela tabela Trabalha.

2.9) FUNES AGREGADAS:


Muitas vezes, precisamos

de

informaes

que

resultado de alguma operao aritmtica ou de conjunto


sobre os dados contidos nas tabelas de um banco de dados.
Para isso, utilizamos as funes agregadas. Abaixo,
apresentaremos algumas delas:

2.9.1) Funo Count( ):


A funo count, como o prprio nome sugere, conta a
quantidade de linhas de uma tabela que satisfazem uma
determinada condio. Vejamos alguns exemplos:
Caso precisssemos saber quantas projetos existem
cadastrados na tabela Projeto.

Perceba que dentro dos parnteses da funo count


colocamos o atributo que ser utilizado para a contagem.

E se precisssemos contar a quantidade de projetos


que custam mais de 2000?

Perceba que, neste ltimo exemplo, inserimos a


clusula WHERE. Isso aconteceu porque precisvamos
contar apenas as linhas da tabela que atendiam condio
especificada.

41
2.9.2) Funo Avg( ):
A funo AVG responsvel por extrair a mdia
aritmtica dos valores de uma coluna.
Por exemplo, se precisssemos calcular a mdia dos
oramentos de todos os projetos, executaramos o seguinte
comando:

2.9.3) Funo Sum( ):


A funo sum responsvel por realizar a soma dos
valores de uma coluna.
Exemplo:

No exemplo acima, o SGBD realizar a soma dos


oramentos dos projetos cujo cdigo seja menor que 10.

2.9.4) Funo Min( ):


A funo Min obtm o valor mnimo dentre os
elementos de uma coluna.

O exemplo abaixo obtm o menor cdigo de


funcionrio dentre aqueles que nasceram no ano de 1980.

2.9.5) Funo Max( ):


A funo Max obtm o maior valor dentre os
elementos de uma coluna.
O exemplo abaixo obtm o maior cdigo de
funcionrio dentre aqueles que nasceram no ano de 1980.

42

2.10) A CLUSULA GROUP BY:


Os dados resultantes de uma seleo podem ser
agrupados de acordo com um critrio especfico. Este
procedimento realizado usando a clusula GROUP BY.
Para melhor entendermos como funciona o GROUP
BY, analisaremos o seguinte exemplo:
Desejamos obter, para cada cdigo de projeto, a
quantidade de funcionrios que trabalharam nele. Lembre-se
que, para sabermos qual funcionrio trabalha em qual
projeto, teremos que observar a tabela Trabalha, pois nela
que acontecem as associaes entre funcionrios e projetos.
Para respondermos a pergunta anterior, vamos considerar
as seguintes informaes na tabela Trabalha:
Cod_func

Cod_proj

Cod_funcao

Dt_ent

Dt_sai

2010-02-02

2010-03-03

2010-02-02

2010-03-03

2010-04-04

2010-05-05

2010-04-04

2010-05-05

2010-02-02

2010-03-03

Perceba que o funcionrio 1 trabalhou no projeto 1 e


no

projeto

trabalharam

2.

Perceba

no

projeto

tambm que

funcionrios

funcionrios

apenas

trabalharam no projeto 2. No projeto 1, trabalharam os


funcionrios de cdigo 1, 2 e 3. J no projeto 2, trabalharam
os funcionrios de cdigo 1 e 4.
Bem, agora voltando para a questo inicial, como
escreveramos um comando SQL que mostre, para cada
cdigo de projeto, a quantidade de funcionrios que

43
trabalharam nele? Na realidade, o que estamos buscando
est representado na tabela abaixo:
Cod_proj

Quantidade_funcionrios

A soluo para o nosso problema a seguinte:

Observe que agrupamos os cdigos dos projetos


iguais, ou seja, foram criados dois grupos: um grupo para os
projetos de cdigo 1 e outro grupo para os projetos de
cdigo 2. Se existissem, na tabela Trabalha, outros cdigos
de projetos diferentes, outros grupos tambm seriam
criados. Alm de criar os grupos, atravs da funo
agregada Count( ), foi feita a contagem de elementos de
cada grupo. Aqui, vale chamar a ateno no seguinte: toda
vez que utilizamos uma funo agregada junto com o
GROUP BY, esta funo ser operada sobre cada um dos
grupos gerados pela clusula GROUP BY.
Outra observao que destacamos o novo nome
que demos para a coluna Count(). Logo aps a funo
agregada, entre aspas simples, escrevemos o novo nome
que desejamos que possua a coluna Count( ).
2.11) JUNES (JOIN):
Quando precisamos realizar consultas que envolvam
mais de uma tabela, uma das solues seria a utilizao de
junes. As junes permitem que acessemos mais de uma
tabela utilizando apenas um Select.
Na utilizao de junes, normalmente, deve existir a
chave primaria de uma tabela fazendo relao com a chave

44
estrangeira da outra tabela que compe a juno. Esta ser
a condio de ligao entre as tabelas.
Existem vrios tipos de junes, cada uma delas
variando a forma que cada tabela se relaciona com as
demais.
Antes de iniciarmos o estudo dos diferentes tipos de
junes,

consideremos

as

tabelas

Funcionrio

Departamento. Elas serviro de base para os tpicos


seguintes.
Cod_func

Nome

Dt_nasc

Cod_dep

Joo

1980-01-02

Jos

1981-02-03

Maria

1982-05-04

Antnio

1983-07-06

FUNCIONRIO

Cod_dep

Descr

Localiz

Desenvolvimento

Sala C3-10

Anlise

Sala B2-30

Testes

Sala C1-10

Contabilidade

Sala A1-20

DEPARTAMENTO

2.11.1) Juno Interna (Inner Join):


A juno interna entre tabelas a modalidade de
juno que faz com que somente participem da relao
resultante as linhas das tabelas de origem que atenderem
clusula de juno.
Por exemplo, caso quisssemos saber o nome de
todos os funcionrios com seus respectivos nomes de
departamentos, teramos a seguinte instruo:

45
O comando anterior apresentaria como resultado, a
partir das tabelas propostas anteriormente, a seguinte
relao resultante:
Nome

Descr

Joo

Desenvolvimento

Jos

Anlise

Maria

Desenvolvimento

Antnio

Testes

Observe,

no

comando

apresentado,

que

selecionamos o nome do funcionrio a partir da tabela


Funcionrio e a descrio do departamento a partir da tabela
Departamento. Isso foi possvel, pois realizamos uma juno
interna, onde se juntou todas as colunas da tabela
Funcionrio com todas as colunas da tabela Departamento.
Os registros que foram selecionados desta juno foram
somente aqueles que satisfizeram a condio expressa aps
a clusula ON.
Perceba tambm que, aps o nome de cada tabela
inserimos um apelido para elas. Demos, para a tabela
Funcionrio, o apelido f, j para a tabela Departamento,
demos o apelido d, ou seja, poderemos substituir a palavra
funcionrio por f e a palavra departamento por d.
Logo aps a clusula ON, inserimos a condio para
a juno. Observe que a condio, normalmente, acontece
entre as chaves primrias e chaves estrangeiras das tabelas
que, no caso especfico, o cdigo do departamento. Antes
do nome de cada atributo, colocamos o nome da tabela da
qual ele se origina, ou seja, f.cod_dep quer dizer que o
atributo cdigo do departamento que existe na tabela
Funcionrio, j d.cod_dep quer dizer que o cdigo do
departamento da tabela Departamento.

46
2.11.2) Junes Externas (Outer Join):
Na juno externa, os registros que participam do
resultado da juno no obrigatoriamente obedecem
condio de juno, ou seja, a no inexistncia de valores
correspondentes no limita a participao de linhas no
resultado de uma consulta.
Existem

tipos

diferentes

de

juno

externa.

Apresentaremos alguns deles:

2.11.2.1) Juno Externa Esquerda (Left Outer Join):


Suponha que desejemos uma listagem com os nomes
de todos os departamentos cadastrados no nosso banco de
dados e, para aqueles que possuam funcionrios lotados
nele, apresente os respectivos nomes. Para isso, teremos
que utilizar a juno externa esquerda. A instruo para
resolver esta questo apresentada abaixo:

A instruo anterior produzir o seguinte resultado, a


partir das tabelas propostas anteriormente:
Descr

Nome

Desenvolvimento

Joo

Desenvolvimento

Maria

Anlise

Jos

Testes

Antnio

Contabilidade
Perceba que, como a tabela Departamento foi
colocada esquerda da juno, foi apresentada a listagem
completa de todas as descries de departamento e, quando
havia alguma associao de uma descrio com um

47
funcionrio, este era apresentado. Observe que ningum
est lotado no departamento de contabilidade, logo ningum
aparece associado a este departamento na tabela anterior.

2.11.2.2) Juno Externa Direita (Right Outer Join):


A juno externa direita muito parecida com a
juno externa esquerda. A nica diferena est no fato de
que a tabela da qual todas as linhas constaro no resultado
est posicionada direita do termo Right Outer Join no
comando.
Assim, para realizarmos a mesma consulta do item
anterior, porm, utilizando a juno externa direita,
teramos que executar a seguinte instruo:

EXERCCIO AULA 2
1) A partir da linguagem SQL, construa uma base de dados
chamada Clnica e, dentro dela, crie as tabelas da quarta questo da
aula anterior, com suas respectivas chaves primrias e chaves
estrangeiras.
2) A partir do banco de dados da questo anterior e utilizando a
linguagem SQL, responda as questes abaixo:
a) Altere a tabela mdico, adicionando a coluna
nome_cnjuge.
b) Insira, pelo menos, dois registros em cada uma das
tabelas.
c) Delete um registro da tabela especialidade. Obs:
mantenha a integridade referencial.
d) Obtenha o nome do paciente mais velho.
e) Para cada CRM de mdico, obtenha a quantidade de
consultas relacionadas a ele.
f) Obter o nome do(s) mdico(s) que atendeu o paciente de
nome Joo.
g) Para cada nome de mdico, obtenha a quantidade de
consultas relacionadas a ele.

Procedimentos
e Funes

3
48

Aula

Meta da Aula
Apresentar os procedimentos e funes na
linguagem SQL.

E sua implementao no

Objetivos

MySQL

Ao final desta aula, voc dever ser


capaz de:
1. Conhecer a linguagem SQL para
utilizao no MySQL;
2. Saber o que um procedimento (store
procedure);
3. Conhecer a sintaxe de um
procedimento no MySQL;
4. Implementar de procedimentos no
MySQL;
5. Saber o que uma funo (function);
6. Conhecer a sintaxe de uma funo no
MySQL;
7. Implementar de funo no MySQL.

49

Procedimento e Funo
3.1

INTRODUO PROGRAMAO EM SQL

A linguagem SQL foi estruturada como uma linguagem


de programao comum, assumindo estrutura de controle,
deciso, repetio, de forma que possa executar funes
(functions), procedimentos (store procedures) e gatilhos
(triggers) de maneira eficiente e efetiva.
Este tipo de programao com SQL diretamente no
SGBD trs as seguintes vantagens:
 Reduz a diferena entre o SQL e a linguagem de
programao;
 Por ser armazenada no SGBD permite que
possa ser invocado por diferentes aplicaes
evitando assim a duplicao de cdigo;
 Reduz custos de comunicao, por ser
executada no SGBD;
 Pode ser utilizado diretamente na elaborao de
functions, store procedures e triggers;
O MySQL utiliza o SQL/PSM (SQL/Persistent Stored
Modules) que uma extenso ao SQL. Ele define para a
escrita de procedimentos e funes em SQL que juntamente
com a utilizao de estruturas de controle aumentam
consideravelmente o poder expressivo do SQL.

Figura 5 - Bloco de Comandos

Para se programar em SQL/PSM, ou seja, criar


programas em SQL, se faz necessrio familiaridade com as
declaraes de variveis, cursores, atribuies de valores,
operadores lgicos, condies, loops, rotinas de controle,
comentrios. Acumulado esse conhecimento, pode-se criar
blocos de comandos para preparar funes (function),
procedimentos (store procedure) e gatilhos (triggers), que
sero compilados, executados e armazenados diretamente
no SGBD. Fazendo com que dessa forma as regras de

50
negcio sejam disponibilizadas para todas as aplicaes que
acessam o SGBD.
Iniciaremos nosso estudo em SQL/PSM no MySQL,
desde os blocos de comando at a elaborao das funes
(function),
procedimentos (store procedure), gatilhos
(triggers) e ainda controle de acesso de usurio.
Vamos aprender a sintaxe, dos comandos para que
possamos programar no MySQL.
3.1.1 COMANDO: BEGIN ... END
As palavras-reservas BEGIN e END atuam como
delimitadoras de um bloco de comandos, na criao de
programas SQL. Os blocos de comandos so programas
compostos por uma ou mais instrues escritas em SQL.
Essas mesmas instrues BEGIN... ENG tambm podem
aparecer aninhadas. Temos a estrutura de um bloco de
comandos em SQL, a seguir:
BEGIN
[DECLARAO DE VARIVEIS];
[DECLARAO DE CURSORES];
COMANDOS SQL;
COMANDOS SQL;
END

3.1.2 COMANDO: DECLARE


Para que se possa usar uma varivel em um programa
no MySQL, necessrio fazer a declarao de varivel
antes. A declarao de variveis simplesmente informa ao
MySQL quais so os nomes dados as variveis e quais so
os tipos usados. No MySQL o nome da varivel consiste,
basicamente, de caracteres alfanumricos, podendo ainda
ser utilizados os caracteres _, $ e o ..
O comando DECLARE, serve para fazer a declarao
de variveis locais, condies, cursores e handlers.
Introduzindo o conceito de cursor at ento
desconhecidos nas linguagens comuns de programao, o
MySQL utiliza esse termo para armazenar resultados de
algum tipo de processamento realizado no SGBD. No
exemplo a seguir temos a declarao de dois cursores, o
cur1 e o cur2, observemos que os dois acessam colunas e
tabelas diferentes, portanto geram resultados diferentes.
Quando necessrio o cursor est presente em funes
(function), procedimentos (store procedure) e gatilhos
(triggers).
Temos tambm o termo novo handler. Um handler
funciona como um artifcio que existem em torno de funes
de acesso ao banco de dados MySQL. Ele procura
estabelecer conexes persistentes ou no persistentes com
o MySQL, executar consultas SQL, recuperar o nmero de

51
linhas entre um conjunto de resultados e alm de obter o
nmero de linhas afetadas por um INSERT, UPDATE ou
DELETE numa consulta no MySQL. E ainda recupera
mensagens de erros associadas ltima consulta no
MySQL que no chegou a ser finalizada devido a uma falha
interna qualquer.
O comando DECLARE segue a precedncia, assumida
pelo MySQL, que determinar que os cursores devem ser
declarados antes dos handlers, e as variveis e condies,
antes dos cursores.
Sintaxe do comando DECLARE para declarar varivel:
DECLARE <nome da varivel> <tipo de dados>;

Sintaxe
condio:

do

comando

DECLARE

para

declarar

DECLARE <nome da condio> CONDITION FOR <valor da


condio>;

Sintaxe do comando DECLARE para declarar cursor:


DECLARE <nome do cursor> CURSOR FOR <comando
SELECT>;

Sintaxe do comando DECLARE para declarar handler:


DECLARE <tipo de handler> HANDLER FOR <valor da
condio>;
<tipo de handler> pode ser: CONTINUE, EXIT ou UNDO.

Exemplificao do comando DECLARE, a seguir:

3.1.3 - COMANDO: SET


Uma vez que j se tenha declarado uma varivel no
MySQL, deve-se atribuir a mesma algum valor. A operao
de atribuio uma operao muito simples, consiste de
atribuir um valor de uma expresso a uma varivel,
utilizando para isso o comando SET.

52
O smbolo de atribuio o = (igual) que no MySQL,
tambm pode ser usado como o operador que representa a
igualdade de valores.
As variveis no precisam ser inicializadas. Elas
contm o valor NULL por padro e podem armazenar
valores numricos (inteiro ou real), string (seqncia de
caracteres) ou data e hora.
Sintaxe do comando SET:
SET <nome da varivel> = <valor a ser atribudo>;

O comando SET demonstrado, abaixo:

3.1.4 COMANDO: OPEN, FETCH, CLOSE


J vimos como declarar um cursor, portanto, vamos
agora aprender a utiliz-lo.
O curso age como um mecanismo para manipulao
de linhas de uma tabela do MySQL, muitas vezes
discriminadas linha por linha. E atuam ainda como ponteiros,
uma vez que apontam para a(s) linha(s) do resultado dado
pela consulta solicitada no MySQL.
Aps a declarao do cursor, ele deve ser inicializado
atravs do comando open.
Sintaxe do comando OPEN:
OPEN <nome do cursor>;

Posteriormente, a execuo do comando OPEN, o


MySQL est pronto para manipular
o resultado dos
comandos SQL. Ento, o comando FETCH executado
para que o ponteiro seja posicionado numa linha e as
informaes atribudas apontadas pra um conjunto de
variveis (o nmero de coluna do resultado apontado pelo
cursor deve ser igual ao nmero de variveis). Portanto,
terminado a execuo do FETCH, j se pode manipular as
variveis que receberam o valor do cursor.
O comando FETCH usualmente encontrado nos
comandos de iterao, como o REPEAT e o WHILE, que
sero vistos em sees posteriores.
Sintaxe do comando FETCH:

53

FETCH <nome do cursor> INTO <nome(s) da(s)


varivel(s);

E para finalizar o uso do cursor, deve-se fechar o


mesmo, atravs do comando CLOSE. A ao de no fechar
o cursor pode causar problemas graves no MySQL.
Sintaxe do comando CLOSE:
CLOSE <nome do cursor>;

Os comandos OPEN, FETCH e CLOSE


demonstrados, abaixo:

3.1.5 - COMANDO: SELECT.... INTO


Esse comando usado para armazenar, no
MySQL, o resultado de uma consulta em uma varivel. O
resultado da consulta deve ter sempre como retorno
somente uma linha, caso o resultado tenha mais de uma
linha, deve ter o mesmo nmero de variveis para receber
esses valores.
Se a consulta tiver mais de uma linha como
resultado, e no existir varivel suficiente receber os valores
da consulta, ocorrer o erro 1172, e aparecer no MySQL, a
seguinte mensagem Result consisted of more than one
row, caso a consulta retorne nenhum resultado, ocorrer o
erro 1329, e aparecer no MySQL a mensagem No data.
Sintaxe do comando SELECT .... INTO:
SELECT <nome da coluna1, coluna2,...N coluna> INTO
<nome da varivel1, variavl2,...N varivel> FROM
<nome da tabela>;

54
abaixo:

O comando SELECT.... INTO est demonstrado,

3.1.6 - COMANDO: IF
A estrutura de deciso permite executar um entre
dois ou mais blocos de instrues. No MySQL, temos a
estrutura de deciso IF, ele testa se uma condio
verdadeira ou falsa, se for verdadeira executa um conjunto
de comandos.
Sintaxe do comando IF:
IF <condio> THEN
<comandos SQL>;
<comandos SQL>;
[ELSE IF <condio> THEN <comandos SQL>;
<comandos SQL>;]...
[ELSE <comandos SQL>;<comandos SQL>;
END IF;

Exemplificao, do comando IF, abaixo:

3.1.7 COMANDO: CASE...WHEN


A estrutura CASE...WHEN uma estrutura de deciso
que permite a execuo de um conjunto de instrues SQL,
conforme a pesquisa e posterior encontro de um
determinado valor.
Sintaxe do comando CASE...WHEN:
CASE <valor procurado>
WHEN <valor da pesquisa1> THEN <comandos SQL>;
WHEN <valor da pesquisa2> THEN <comandos SQL>;]...
[ELSE <comandos SQL>;]
END CASE;

55
A Sintaxe do comando CASE...WHEN, tambm pode
ser a seguinte:
CASE
WHEN <valor da pesquisa1> THEN <comandos SQL>;
WHEN <valor da pesquisa2> THEN <comandos
SQL>;]...
[ELSE <comandos SQL>;]
END CASE;

O comando CASE..WHEN est demonstrado,


abaixo:

3.1.8 COMANDO: LOOP e ITERATE


O comando LOOP no tem uma condio a ser
testada. Para que a repetio termine, o MySQL determina
que o comando LEAVE finalize o lao. O comando ITERATE
usado dentro da construo LOOP... END LOOP, serve
para reiniciar a repetio, ou seja, o loop.
Sintaxe do comando LOOP:
<nome do label> : LOOP
<comandos SQL>;
<comandos SQL>;
ITERATE <nome do label>;
<comandos SQL>
<comandos SQL>;
END LOOP <nome do label>;
Quadro 12 Sintaxe LOOP.. ITERATE

Os comandos LOOP..END LOOP e ITERATE


est demonstrado, abaixo:

56

3.1.9 COMANDO: REPEAT


Esse comando permite a repetio na execuo de um
conjunto de comandos. Os comandos sero executados ao
menos uma vez, independente da condio testada. A
execuo do comando REPEAT ser mantida enquanto a
condio testada for falsa.
Sintaxe do comando REPEAT:
REPEAT
<comandos SQL>;
<comandos SQL>;
UNTIL <condio testada>
END REPEAT;

O comando REPEAT est demonstrado, abaixo:

Para melhor exemplificao, temos um exemplo


comando REPEAT:

3.1.10 COMANDO: WHILE...DO


Esta estrutura faz com que a condio seja avaliada
em primeiro lugar. Se a condio verdadeira os comandos
SQL so executados uma vez e a condio avaliada
novamente. Caso a condio seja falsa a repetio
terminada sem a execuo dos comandos SQL.
Sintaxe do comando WHILE..DO:
WHILE <condio testada> DO
<comandos SQL>;
<comandos SQL>;
<comandos SQL>;
END WHILE;

O comando WHILE...DO est demonstrado,


abaixo:

57
3.1.11 COMANDO: LEAVE
Esse comando utilizando para sair de uma
estrutura de controle, seja de repetio (REPEAT, WHILE,
LOOP, ITERATE) ou deciso (IF, CASE).
Sintaxe do comando LEAVE:
LEAVE <nome do label>;
OBSERVAO: o label pode ser o nome de uma funo,

procedimento ou gatilho, ou simplesmente o nome de um


rtulo presente nas estrutura de controle.
O comando LEAVE est demonstrado, abaixo:

3.1.12 COMANDO: CALL


Esse comando utilizando para chamar um
procedimento (store procedure) no MySQL. Posteriormente,
veremos como criar um procedimento (store procedure).
Sintaxe do comando CALL:
CALL <nome-procedimento> (parmetros do
procedimento);

ou
CALL <nome-procedimento> ();

O comando CALL est demonstrado, abaixo:

3.1.13 COMANDOS: RETURN e RETURNS


Esse comando utilizando para retornar um valor
de uma varivel armazenada no MySQL. O comando
RETURN no utilizado em procedimentos (store
procedure).

58
Sintaxe do comando RETURN:
RETURN <valor de varivel>;

O comando RETURN est demonstrado, abaixo:

O comando RETURN diferente do comando


RETURNS. Os dois so usados numa funo, o 1
(RETURNS) serve para definir qual tipo de dados ir retornar
na funo, e o 2 (RETURN) diz o valor de qual varivel ser
definida como retorno. No exemplo, acima, temos a funo
Aumenta_Sal (...) que ir retornar um valor do tipo DOUBLE,
que est armazenado na varivel maior_sal.
Sintaxe do comando RETURNS:
RETURNS <tipo da varivel>;

3.2 PROCEDIMENTOS (STORE PROCEDURE)

O MySQL reconhece
store
procedure
(procedimentos
armazenados), na nossa
apostila, vamos nos
referir a eles somente
como procedimentos.

Agora que j aprendemos a sintaxe, para que


possamos construir as primeiras rotinas que sero
executadas no MySQL. Temos que entender, que nossas
rotinas podero ser simples, com poucas linhas de cdigo ou
bastante complexas e de cdigo extenso, vai depender
muito do que se programa, como numa linguagem de
programao comum. A diferena bsica e essencial, que
esses nossos programas estaro armazenados no servidor e
podero ser chamados a partir da prpria linguagem SQL.
Assim, teremos que utilizar os procedimentos (store
procedure) e as funes (function), cujos conceitos esto
definidos no SQL e ficam armazenados no servidor,
podendo ser invocados, de acordo com a necessidade do
SGBD.
Vamos a um assunto muito interessante referente
banco de dados, mais precisamente procedimentos
armazenados (store procedure).
Um procedimento

um
cdigo
procedural,
semelhante ao utilizado em linguagens estruturadas, s que
ao invs de ter que escrever seus prprios comandos SQL
na aplicao, voc cria o procedimento (store procedure) no

59

Ateno!!
Agora a hora de usar
o comando CALL,
toda vez que quiser
executar um
procedimento
precisamos utilizar
esse comando.

banco de dados e pode ser executado por qualquer


aplicao cliente, o que melhor e muito sua performance de
execuo.
J que entendemos o que um procedimento (store
procedure). Saberemos, a partir de agora, os motivos para
se utilizar um procedimento (store procedure):
Modularizao: os procedimentos (store
procedures) utilizam a programao modular.
Eles encapsulam conjuntos de operaes sobre
os dados, ou seja, qualquer possvel alterao
no SGBD fica escondida da aplicao que
fazem o acesso o banco por meio de
procedimento (store procedure). E ainda permite
que aplicaes possam acessar o SGBD de
maneira uniforme;
Performance: quando um procedimento (store
procedure) executado no banco de dados, um
modelo daquele procedimento continua na
memria para se aproveitada posteriormente, o
que melhorar a velocidade de execuo;
Segurana: utilizando procedimento (store
procedure), o acesso no feito diretamente
nas tabelas, portanto a probabilidade de um
desenvolvedor da aplicao fazer algo de errado
que possa comprometer a base do banco de
dados diminui, o que aumenta a segurana da
aplicao desenvolvida utilizando procedimento.
Ou podem ter atributos de segurana, portanto
os usurios podem ter permisses de executar
procedimento (store procedure) , sem ter
permisses sobre os objetos referenciados
dentro do procedimento;
Trfego de rede: pode reduzir o trfego na rede
gerado pela aplicao, porque quando cdigo
SQL fica na aplicao, necessrio que o
mesmo seja enviado ao banco (compilado e
otimizado) a cada nova consulta, se tivermos
muitas linhas de SQL isso ir gerar um trfego
maior, portanto mais vantajoso ter uma linha
de cdigo para executar um procedimento (store
procedure).
Os procedimentos (store procedure), podem ser de
03 (trs) tipos:
retornam registros do banco de dados: um
simples SELECT em uma tabela;

60
retornam um simples valor: pode ser o total
de registros de uma tabela;
no retorna valor (realiza uma ao): pode
ser a insero
J que entendemos, o que um procedimento, sua
sintaxe :

CREATE PROCEDURE nome-do-procedimento ([parmetros[,...]])


BEGIN
[caractersticas ...] corpo da funo
parmetros:
[ IN | OUT| INOUT ] nome do tipo do parmetro
tipo:
Qualquer tipo de dado vlido no MySQL
caractersticas:
Linguagem SQL
| [NOT] DETERMINISTIC
| {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES
SQL DATA }
| SQL SECURITY {DEFINER | INVOKER}
| COMMENT string
corpo do procedimento:
comandos vlido no SQL
END

Onde:
nome-do-procedimento representa o nome do
procedimento que ser criado.
Os trs tipos de parmetros que pode ser utilizados
nos procedimentos so:
IN: um parmetro de entrada, ou seja, um
parmetro cujo seu valor seu valor ser utilizado
no interior do procedimento para produzir algum;
OUT: um parmetro de sada, retorna algo de
dentro do procedimento, colocando os valores
manipulados disponveis na memria ou no
conjunto de resultados;
INOUT: faz o processamento dos IN ou OUT
simultaneamente.
A caracterstica DETERMINISTIC diz que o
procedimento sempre retorna o mesmo resultado para os
mesmos parmetros de entrada, e a caracterstica NOT
DETERMINISTIC determina o contrrio da caracterstica
deterministc. Atualmente, essas caractersticas so aceitas,
pela MySQL, mas ainda no usada.
Temos a caracterstica que informa o modo de
tratamentos dos dados durante a execuo do

61

Ateno!!
A clusula IF
EXISTS, do comando
DROP
PROCEDURE OU
FUNCTION uma
extenso do MySQL.
Ela previne que um
erro ocorra se a funo
ou o procedimento no
existe mais no SGBD.
Um aviso produzido
e pode ser visualizado
SHOW

procedimento. Para CONTAINS SQL o default, determina


que os dados no podem ser lidos ou escritos, pois ele j
devem ser determinados, no bloco de comandos. O NO SQL
diz que o procedimento contm dados a serem lidos ou
escritos. O READS SQL DATA indica que teremos somente
leitura de dados, por meio do SELECT. E o MODIFIES SQL
DATA determina que tem-se escrita ou remoo de dados,
utilizando o INSERT ou DELETE.
A caracterstica SQL SECURITY pode ser usada para
especificar se o procedimento pode ser executado para usar
as permisses do usurio que criou os procedimentos, ou do
usurio que o invocou. O DEFINER o valor padro, foi um
recurso novo introduzido no SQL:2003.
A clusula COMMENT uma extenso do MySQL, e
pode ser usada para descrever o procedimento (stored
procedure).
Depois que, aprendemos a sintaxe dos procedimentos,
vamos ver alguns exemplos implementadas no MySQL, do
nosso banco de dados da empresa de desenvolvimento de
projetos utilizado desde o incio da nossa apostila:
Antes de elaborar os procedimentos, temos que ter
como objetivos, cri-los de forma que eles possam trazer
algum tipo utilizao, realmente prtica, para empresa ou
organizao, na qual forem implementados.
Poderia ser interessante, para cada departamento,
saber relacionar os projetos e seus oramentos, o usurio
pode determinar solicitar um relatrio de todos os projetos
cujo oramento for maior do R$ 10.000,00 e a data de incio
desse projeto. Abaixo, esse exemplo bem simples de
procedimento:

A gerncia de pessoal, pode solicitar os nomes dos


funcionrios que esto lotados em mais de um projeto, ou
solicitar em qual ou quais projeto(s) seu funcionrio est
lotado, a partir do cdigo desse funcionrio. Observem que
so dois procedimentos diferentes um sem e outro com
parmetros de entrada.

62
Para resolver estes problemas, vamos utilizao dos
procedimentos abaixo.

A chamada para a execuo de um procedimento


diferente da chamada para funo. No procedimento,
utilizamos o comando (CALL). Daqui pouco, aprenderemos
como utilizar funo.
Vamos invocar os procedimentos criados, e verificar se
eles realmente funcionam, no MySQL

Algumas caractersticas de um procedimento podem


ser alteradas, para isso, vamos ver a sintaxe da alterao de
um procedimento, a seguir:
ALTER PROCEDURE nome-do-procedimento[caractersticas
...]
caractersticas:
NAME novo-nome
| {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES
SQL DATA }
| SQL SECURITY {DEFINER | INVOKER}
| COMMENT string

63
Onde:
nome-do-procedimento representa o nome do
procedimento que ter sua(s) caracterstica(s) alterada(s).
O comando ALTER PROCEDURE no muito
utilizado no MySQL, uma vez que no se pode alterar nem
os parmetros nem o corpo do procedimento. Caso, se
queira fazer muitas modificaes no procedimento,
recomenda-se apagar o procedimento e criar um novo.
A seguir, vamos aprender como remover uma funo:
DROP PROCEDURE nome-do-procedimento [IF EXISTS]
nome_warning

Onde:
nome-do-procedimento representa o nome do
procedimento que ter removido do servidor de banco de
dados.
Veremos, a seguir, como remover os trs
procedimentos que foram criados no MySQL:

3.3 FUNES (Function)

Curiosidade!!
Para saber todas as
informaes sobre as
funes do SGBD,
podemos usar o
comando SHOW
FUNCTION STATUS e
SHOW PROCEDURE
STATUS, para os
procedimentos.

Vamos agora, aprender sobre funes (functions).


Funes (tambm chamadas de rotinas, ou subprogramas) so segmentos de programa que executam uma
determinada tarefa especfica. possvel ao administrador
do SGBD, escrever suas prprias rotinas, no MySQL. So as
chamadas de funes definidas pelo usurio ou rotinas
definidas pelo usurio (UDFS User Defined Functions).
Criando nossas prprias funes, temos a vantagem
de adequ-las a nosso ambiente de trabalho, de acordo
com as nossas necessidades dirias. Isso tudo, sem ter que
modificar a aplicao, uma vez a funo est implementada
direto na aplicao.
Temos como exemplo, um Banco Comercial, onde um
de seus maiores patrimnio so os dados dos correntistas,
nesse tipo de organizao a mudana de SGBD remota,
procura-se dessa forma obter o mximo possvel do servidor
de banco de dados, utilizando os recursos que lhes so
oferecidos, como a utilizao de funes. Outras
organizaes por utilizar tudo centralizado no SGBD,
centralizam tambm s regras de negcios, tornando-as
iguais para qualquer aplicao que venha a acessar o

64
servidor do banco de dados. Dessa maneira, uma funo
que venha a ser padronizada no banco de dados, por ser
executada por aplicaes diferente, seja desenvolvida em
Delphi, Java, C.
Ento, funo so programas armazenados no SGBD,
pr-compilados, invocados de forma explcita para executar
alguma lgica de manipulao de dados, e que sempre
retorna algum valor.
A diferena bsica entre o procedimento e uma funo
que a funo sempre retorna algum valor.
J que entendemos, o que uma funo, sua sintaxe
:
CREATE FUNCTION nome-da-funo ([parmetros[,...]])
[RETURNS tipo]
BEGIN
[caractersticas ...] corpo da funo
parmetros:nome do tipo do parmetro
tipo:
Qualquer tipo de dado vlido no MySQL
caractersticas:
Linguagem SQL
| [NOT] DETERMINISTIC
| {CONTAINS SQL | NO SQL | READS SQL DATA |
MODIFIES
DATA } Create Function
Quadro SQL
24 Comando
| SQL SECURITY {DEFINER | INVOKER}
Onde:
| COMMENT string

nome-da-funo representa o nome da funo que ser


corpo da funo:
criada.
comandos vlido no SQL
RETURN <valor>
END

A lista de parmetros entre parnteses deve estar


sempre presente. Se no houver parmetros, uma lista de
parmetros vazia de ( ) deve ser usada.
A funo tambm apresenta as caractersticas
DETERMINISTIC
e
NOT
DETERMINISTIC.
As
caractersticas CONTAINS SQL, NO SQL, READS SQL
DATA e MODIFIES SQL DATA, possuem as mesmas
funcionalidades utilizadas nos procedimentos.
E na questo de segurana, a caracterstica SQL
SECURITY pode ser usada para especificar se a funo
possa ser executada usando as permisses do usurio que
criou as funes, ou do usurio que a invocou. O DEFINER
o valor padro, foi um recurso novo introduzido no
SQL:2003.
A clusula COMMENT uma extenso do MySQL, e
pode ser usada para descrever a funo (function).
A clusula RETURNS pode ser especificada apenas
por uma FUNCTION. usada para indicar o tipo de retorno

65
da funo, e o corpo da funo deve conter uma instruo
RETURN e o valor de retorno.
Depois que, aprendemos a sintaxe da funo, vamos
ver alguns exemplos de funes, implementadas no MySQL,
do nosso banco de dados praticabd, utilizado desde o incio
da nossa apostila.
Antes de elaborar as funes, temos que ter como
objetivos, cri-las de forma que elas possam trazer algum
tipo utilizao, realmente prtica, para empresa ou
organizao, na qual forem implementadas.
Caso cada departamento, queira saber a classificao
dos projetos de acordo com o seu oramento, a funo est
exemplificada a seguir:

A gerncia de pessoal poderia solicitar ao SGBD, um


aumento salarial a todos os funcionrios e ter como retorno
o valor do maior salrio, aps o aumento. Vamos a
elaborao dessa funo no MySQL:

Para verificarmos, se as funes acima funcionaro e


se retornaram o que se esperava dele, podemos usar os
SELECT abaixo:
Vamos invocar as funes criadas para saber a
classificao do oramento, e verificar se elas realmente
funcionam.

66

Agora, vamos invocar a Aumenta_Sal(aumento INT) e


v sua funcionalidade, para um aumento de 10%.

Lembrando que uma funo sempre retorna algum


valor, por isso podemos utilizar o valor do retorno da funo.
E para utilizar esse valor, preciso que seja criada uma
varivel do mesmo tipo do retorno da funo, e o nome da
funo deve aparecer ao lado direito de um comando de
atribuio de valores (SET). As funes armazenadas no
MySQL podem ser utilizadas em comandos SQL da mesma
forma que as outras funes j criadas na prpria
linguagem.
Algumas caractersticas de uma funo podem ser
alteradas, para isso usamos a sintaxe, a seguir:
ALTER FUNCTION nome-da-funo [caractersticas ...]
caractersticas:
| {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES
SQL DATA }
| SQL SECURITY {DEFINER | INVOKER}

Onde:
nome-da-funo representa o nome da funo que ter
sua(s) caracterstica(s) alterada(s).
Esse comando no muito utilizando, uma vez que
no se pode alterar os parmetros ou o corpo da funo.
Caso se queira alterar, o cdigo de uma funo o ideal
remov-la e criar uma nova funo. A seguir, vamos
aprender como remover uma funo.
Portanto, para finalizar o nosso estudo sobre funo,
podemos deletar essa rotina do SGBD, para isso usamos a
sintaxe, abaixo:
DROP FUNCTION nome-da-funo [IF EXISTS] nome_warning

Onde:
nome-da-funo representa o nome da funo que ter
removida do servidor de banco de dados.
Teremos, a seguir, a remoo das funes criadas no
MySQL.

67

Para listarmos todos os procedimentos (store


procedure) e as funes (functions) armazenados no
MySQL, temos que utilizar a sintaxe a seguir:
SELECT * FROM INFORMATION_SCHEMA.ROUTINES;

Esse ltimo comando lista somente os procedimentos


e funes, gravadas na tabela ROUTINES do banco de
dados INFORMATION_SCHEMA.

68

RESUMO DO CAPTULO

Comeamos uma introduo na linguagem SQL/PSM


(SQL/Persistent Stored Modules), voltada para utilizao no
MySQL. Depois, utilizamos o estudo de caso de uma
empresa de desenvolvimento de projeto, para verificar como
modelar o banco de dados do sistema dessa empresa,
utilizando procedimentos e funes.
Portanto, a Aula 3, procurar fazer uma iniciao no estudo
de procedimentos (store procedure) e funes (functions) no
MySQL, buscando ensinar o manejo destes recursos que
de grande proveito, principalmente no sistemas que
necessitam de modularidade e otimizao quanto
performance.

Informaes para a prxima aula


Na Aula 4, teremos a oportunidade de conhecer e
implementar um gatilho (trigger) o controle de acesso de
usurios.
Bibliografia consultada

DESCOBRE. Tipos de Linguagem de Programao.


Disponvel
em
<http://www.descobre.com/forum/showthread.php?t=697>.
Acesso em 23. mar. 2010
Manual
MySQL
5.1<
http://
dev.mysql.com/doc/refman/5.1/en/index.html>. Acesso em
24.mar. 2010

69

Gatilho e Controle de
Acesso

Aula

Meta da Aula
Apresentar os gatilhos e controle de acesso
na linguagem SQL. E implementas gatilhos e

Objetivos

controle de acesso no MySQL.

Ao final desta aula, voc dever ser


capaz de:
1. Saber o que um gatilho (trigger);
2. Conhecer a sintaxe de um gatilho (trigger)
no MySQL;
3. Implementar de gatilho (trigger) no MySQL;
4. Saber o que um usurio no MySQL;
5. Criar, renomear, deletar, alterar senha de
usurio no MySQL;
6. Saber quais so os privilgios do usurio
no MySQL;
7. Atribuir e Remover privilgios no MySQL;

70

Gatilho e Controle de Aceso


4.1

GATILHO (TRIGGER)
A linguagem SQL alm de tratar os procedimentos e
funes, tambm permite a criao de gatilhos (triggers).
considerado uma lgica
de
processamento
procedural,
armazenada
no
SGBD e disparada
automaticamente pelo servidor sob condies especficas.
Gatilhos (triggers)
representam
regras
do mundo
(negcio) que definem a integridade ou consistncia do BD.
Passaram a ser padro SQL em 1999. Seu principal
objetivo monitorar o SGBD e realizar alguma ao
quando uma condio ocorre.
Os gatilhos (triggers) devem ser armazenados na
base de dados como objetos independentes e no
podem ser locais a um bloco ou pacote. So na
verdade, procedimentos disparados automaticamente pelo
SGBD em resposta a um evento especfico do banco de
dados. Portanto, so bastante semelhantes aos
procedimentos (store procedure) s que tem sua execuo
disparada
pelo
SGBD
quando
ocorre
um
acontecimento/evento desencadeador de trigerring suceder
e no aceita argumentos. O ato de executar um gatilho
(trigger) conhecido como disparar o gatilho (trigger). O
evento desencadeador pode ser uma operao DML
(INSERT, UPDATE, ou DELETE) em uma tabela da base
de dados.
Os gatilhos (triggers) podem usados para:
Segurana sobre a base de dados, e ao de
usurios, verificando quando uma operao
realizada sobre uma entidade, o gatilho (trigger)
disparado para verificar as permisses do usurio;
Melhorar a segurana no acesso aos dados;
Assegurar as restries de integridade;
Fazer a auditoria das informaes de uma tabela,
registrando as alteraes efetuadas e quem as
efetuou;
Sinalizar automaticamente a outros programas que
necessrio efetuar uma ao, quando so efetuadas
alteraes numa tabela.
A seguir so enumeradas algumas vantagens no uso
de gatilhos (triggers):
Um gatilho (trigger) sempre disparado quando o
evento ocorre, evitando assim esquecimentos ou falta
de conhecimento sobre o banco de dados;

71
So adminstrados de forma centralizada, ou seja, o
DBA (Adminstrador de Banco de Dados) define suas
situaes, eventos e aes;
A ativao central combina com o modelo
cliente/servidor, portanto a execuo da trigger
realizada no servidor, independente do aplicativo
executado pelo cliente.
Com o uso de gatilho (trigger) procura-se eliminar o
esforo manual e repetitivo de identificar e corrigir comandos
e regras mal implementados, com baixo desempenho.
Assim, o desenvolvedor da aplicao sair ganhando em
produtividade, uma vez que no ir mais perder seu tempo
em corrigir e buscar regras j prontas e controladas no
SGBD.
Por se tratar de mecanismo ativos, os gatilhos
(triggers), utilizam como requisitos para sua elaborao, o
paradigma Evento-Condio-Ao (ECA). Onde o
Evento, indica o momento do disparo da regra, a
Condio precisa ser satisfeita para que a execuo do
gatilho (trigger) prossiga e a Ao determina o que ter de
ser feito, caso a condio seja realmente vlida.
H trs tipos principais de gatilhos (triggers): DML,
insted-of e gatilhos (triggers) de sistema (DDL).
Um gatilho (trigger) DML acionado em uma
operao INSERT, UPDATE ou DELETE de uma
tabela de dados. Ele pode ser acionado antes ou
depois que a instruo executada e pode ser
acionado uma vez por linha problemtica ou uma
vez por instruo;

Os gatilhos (triggers) insted-of podem ser


definidos apenas em vises (tanto de objeto
como relacional).
Um trigger de sistema acionado quando um evento
de sistema como uma inicializao ou desativao de
banco de dados ocorrer, em vez de em uma operao
DML em uma tabela. Um trigger de sistema tambm
pode ser acionado em operaes de DDL como a
criao de uma tabela.
Devemos ter cuidado quando utilizar gatilhos (triggers),
pois erros na execuo de um gatilho (trigger) pode causar
falhas nas funes de incluir/deletar/atualizar da funo que
o disparou. No podemos criar gatilho (trigger) para disparar
outro gatilho (trigger), ou seja, na pior das hipteses gerar
uma cadeia infinita de gatilhos (triggers) e tambm no se
deve usar gatilho (trigger) na replicao da base dados,
porque quando alguma modificao feita na base dados

72
principal, um gatilho (trigger) aplica a mesma modificao na
cpia.
Cada SGBD utiliza sua prpria linguagem e sintaxe
para gatilhos (triggers). Iremos aprender agora, como
elaborar gatilhos (trigger) no MySQL. Importa ressaltar que
iremos nos ater aos gatilhos (triggers) DML.
J que aprendemos o que um gatilho (trigger), sua
sintaxe a seguir:
CREATE TRIGGER nome-do-gatilho momento-da-execuo
evento-disparador
ON nome-da-tabela FOR EACH ROW comandos vlidos no
SQL OU
BEGIN
corpo do gatilho:
comandos vlido no SQL

Onde:
nome-do-gatilho representa o nome do gatilho (trigger)
que ser criado;
momento-da-execuo diz em que tempo a ao
ocorrer, antes (BEFORE) ou depois (AFTER) do evento;
evento-disparador representa o evento que dispara o
gatilho (trigger), so os comandos INSERT, UPDATE e
DELETE do SQL;
nome-da-tabela diz o nome da tabela que ser utilizado
pelo gatilho (trigger);
Para um melhor entendimento do que seja o momento
da execuo e um evento-disparador durante a execuo de
um gatilho (trigger), observemos a Tabela 1, a seguir:
Tipo de Gatilho

Descrio

BEFORE INSERT

O gatilho disparado antes de uma ao de


insero

BEFORE UPDATE

O gatilho disparado antes de uma ao de


alterao

BEFORE DELETE

O gatilho disparado antes de uma ao de


remoo

AFTER INSERT

O gatilho disparado depois de uma ao de


insero

AFTER UPDATE

O gatilho disparado depois de uma ao de


alterao

AFTER DELETE

O gatilho disparado depois de uma ao de


remoo
Tabela 1 Tipos de Gatilhos

73
possvel combinar alguns dos modos, desde que
tenham a operao de AFTER ou BEFORE em comum,
conforme mostra a Tabela 2, abaixo:
Tipo de Gatilho

Descrio

BEFORE INSERT ou

O gatilho disparado antes de uma ao de

UPDATE ou DELETE

insero ou de alterao ou de remoo

Tabela 2 Combinao dos Tipos de Gatilhos

Depois que, aprendemos a sintaxe do gatilho (trigger),


vamos implementar no nosso banco de dados praticabd
utilizando o MySQL, alguns gatilhos (triggers) realmente
teis para a regras de negcios da nossa empresa e seus
projetos.
A empresa pode quer ter um controle de todas as datas
de previso de finalizao prevista de seus projetos. Para
isso podemos implementar um gatilho (trigger) para colher
as datas de previso de trmino do cadastro de todos os
projetos e estas sero inseridas numa outra tabela, por
exemplo, uma tabela com a seguinte estrutura.

Toda vez que um novo projeto for inserido no cadastro


de projeto, tanto ser acrescido na tabela do projeto, quanto
na nova tabela criada (DataProj), isso automaticamente
atravs do gatilho (trigger), abaixo:

Para testar o gatilho (trigger), fazemos uma insero na


tabela projeto, no campo referente data de previso do
trmino do projeto, e depois fazemos um SELECT na tabela
dataproj, pra verificarmos se a data 2015-01-12 tambm foi
inserida automaticamente nela, sintaxe :

74
Para finalizar o nosso estudo sobre gatilho (trigger),
iremos verificar como deletar um gatilho (trigger), sintaxe :
DROP TRIGGER nome-do-gatilho [IF EXISTS]
nome_warning

Onde:
nome-do-gatilho representa o nome do gatilho que ter
removido do servidor de banco de dados.
Teremos, a seguir, a remoo dos gatilhos que foram
criados no MySQL.

Para
listarmos
todos
os
gatilhos
(triggers)
armazenados no MySQL, temos que utilizar a sintaxe a
seguir:
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS;

Esse ltimo comando lista somente os gatilhos,


gravados na tabela TRIGGERS do banco de dados
INFORMATION_SCHEMA.

4.2

CONTROLE DE ACESSO
A integridade do sistema de Banco de Dados depende
muito do tipo de segurana implementado ao SGBD. Para
isso existe um DBA (Administrador de Banco de Dados)
responsvel pela segurana e controle de acesso a esse
banco de Dados. Por isso, iremos estudar como implementar
o controle de acesso e melhorar a segurana no MySQL.
Quando iniciamos os trabalhos em um servidor
MySQL, normalmente precisamos de uma identidade e uma
senha. Essa identidade o que vai fazer com que o MySQL
reconhea o usurio. Cabe portanto ao DBA (Administrador
de Banco de Dados) criar os usurios que podero usar o
MySQL,
podendo tambm renome-los e remov-los
permanentemente do SGBD.
A sintaxe para criar um usurio :
CREATE USER usurio [IDENTIFIED BY[PASSWORD]]
'senha';

Onde:
usurio representa o nome do usurio que ser criado;

75
'senha' representa a senha de acesso ao MySQL pelo
usurio criado.
Teremos, a seguir, a criao de um usurio no MySQL:

Temos tambm a possibilidade de criar o novo usurio


no MySQL j com senha cada um:

Depois de criarmos um usurio com senha no MySQL,


temos a possibilidade de alterarmos a senha desse usurio,
conforme a sintaxe abaixo:
SET PASSWORD FOR usurio PASSWORD ('nova senha');

Veremos como alterar a senha do usurio alunoEAD,


exemplificado no a seguir:

Caso se queira, renomear um usurio, a sintaxe :


RENAME USER usurio_velho TO usurio_novo;

Abaixo, um exemplo de renomeao de usurio:


Veremos, agora a exemplificao de como renomear usurio:
E para remover um usurio no MySQL, a sintaxe :
DROP USER usurio;

A exemplificao de como remover um usurio no


MySQL, a seguir:

Definido no MySQL, os usurios precisamos definir


quais privilgios eles tero direito.
O sistema de privilgios do MySQL faz a autentio de
um usurio a partir de uma determinada mquina e associa
este usurio com privilgio ao banco de dados como usar os
comandos SELECT, INSERT, UPDATE ou DELETE. Isso

76

Curiosidade!!
Existem mais privilgios
que deve ser concedido
apenas a
administradores, so
eles o REPLICATION
CLIENT,
REPLICATION
SLAVE, SUPER,
CREATE USER,
DROP USER,
RENAME USER.
Os privilgios so
armazenados em quatro
tabelas interna, no
banco MySQL, a saber:
mysql.user: privilgios
globais aplicam-se para
todos os banco de dados
em um determinado
servidor; mysql.db:
privilgios de banco de
dados aplicam-se a
todas as tabelas em um
determinado banco de
dados.
mysql.tables_priv:
privilgios de tabelas
que aplicam-se a todas
as colunas em uma
determinada tabela.
mysql.colums_priv:
privilgios de colunas
aplicam-se a uma nica
coluna em uma
determinada tabela.

garante que os usurios s possam fazer aquilo que lhes


permitido.
Quando nos conectamos a um servidor MySQL, nossa
identidade determinada pela mquina de onde nos
conectamos e nosso nome de usurio que foi especificado.
O MySQL concede os privilgios de acordo com a identidade
e com o que se deseja fazer no SGBD.
O controle de acesso do MySQL realizado em dois
passos:
1 Passo: feita a conferncia para saber se o usurio
pode ter ou no acesso. Nesse caso, o usurio tenta se
conectar, e o MySQL aceita ou rejeita a conexo
baseado na identidade do usurio e no uso de sua
senha correta.
2 Passo: Caso o usurio posso se conectar, o SGBD
verifica da solicitao feita pra saber se o usurio tem
ou no privilgios para realizar cada solicitao
requisitada. Tome como exemplo, o caso de um
usurio que tenta altera a linha de uma tabela em um
banco de dados ou uma tabela do mesmo banco, o
MySQL ir se certificar que o usurio tem o privilgio
UPDATE para a tabela ou o privilgio DROP.
4.3

PRIVILGIOS

Quando nos conectamos a um servidor MySQL, nossa


identidade determinada pela mquina de onde nos
conectamos e nosso nome de usurio que foi especificado.
O MySQL concede os privilgios de acordo com a identidade
e com o que se deseja fazer no SGBD.
Os privilgios fornecidos pelo MySQL so descritos na
tabela abaixo:
Privilgios MySQL
SELECT INSERT UPDATE DELETE INDEX ALTER CREATE DROP
GRANT OPTION RELOAD SHUTDOWN PROCESS - FILE - ALL
Tabela 4 Privilgios MySQL

Os privilgios SELECT, INSERT, UPDATE e DELETE


permitem que sejam realizadas operaes nos registros das
tabelas existentes no SGBD.
O privilgio INDEX permite a criao ou remoo de
ndices.
O privilgio ALTER permite que se altere tabelas
(adicione colunas, renomei colunas ou tabelas, altere tipos
de dados de colunas), aplicado a tabelas;
Os privilgios CREATE e DROP permite a criao de
banco de dados e tabelas, ou a remoo de banco de dados
e tabelas existentes.

77
O privilgio GRANT OPTION permite que um usurio
possa fornecer a outros usurios os privilgios que ele
mesmo possui.
Os privilgios RELOAD, SHUTDOWN, PROCESS,
FILE e ALL so usados para operaes administrativas que
so realizadas pelo DBA (Administrador do Banco de
Dados).
No MySQL, ou em qualquer SGBD, o ideal conceder
privilgios somente para usurios que realmente
necessitem, por isso deve-se ter muito cuidado ao conceder
certos privilgios. Por exemplo, o privilgio GRANT OPTION
permite que usurios possam repassar seus privilgios a
outros usurios, portanto dois usurios com diferentes
privilgios e com privilgio GRANT OPTION conseguem
combinar seus privilgios, o que pode ser um risco numa
organizao, dependo do tipo de privilgio cedido a cada
usurio desses. O privilgio ALTER pode ser usado para
subverter o sistema de privilgios, quando o usurio pode
renomear todas as tabelas do banco de dados.
Aps o entendimento, do que sejam os privilgios,
vamos v como atribuir os privilgios a um usurio sua
sintaxe :
GRANT privilgios [(coluna)] [, privilgio
[(coluna)] ...]
ON {nome_tabela funo - procedimento | * | *.* |
nome_banco.*}
TO nome_usuario [IDENTIFIED BY senha]
[, nome_usuario [IDENTIFIED BY senha] ...]
[WITH GRANT OPTION]

Onde:
privilgios: representa qual privilgio ser concedido.
colunas: opcional e especifica as colunas a que os
privilgios se aplicam. Pode ser uma nica coluna ou vrias
separadas por vrgula;
nome-tabela, funo ou procedimento, *, *.* ,
nome_banco.*: o banco de dados, tabela, funo ou
procedimento a que os privilgios se aplicam. Pode ser
especificado como: *.* neste caso os privilgios aplicam-se
a todos os bancos de dados; * os privilgios aplicam-se se
no estiver utilizando nenhum banco de dados em particular;
nome_banco.*- neste caso, os privilgios aplicam-se a todas
as tabelas do banco; banco.tabela neste caso os
privilgios aplicam-se a uma determinada tabelas. Voc
pode, ainda especificar alguma(s) coluna(s) sem particular
inserindo esta(s) em colunas;
nome-usurio: especifica um usurio do MySQL. Para
preservar a segurana este usurio no deve ser o mesmo
usurio do sistema;

78
senha: senha do usurio para acessar o servidor
MySQL;
WITH GRANT OPTION: se for especificado, o usurio
poder conceder privilgios a outros usurios.
Vejamos, a seguir, alguns exemplos de privilgios
concedidos a alguns usurios.
Nesse primeiro exemplo, temos a concesso de todos
os privilgios ao usurio aluno_E_A_D, incluindo o privilgio
que permite que o usurio possa conceder privilgios a
outros usurios, sintaxe a seguir:

No prximo exemplo, o usurio aluno_E_A_D ter os


privilgios de realizar as operaes SELECT, INSERT,
UPDATE e DELETE no nosso banco de dados praticabd,
podemos constatar que diferente do exemplo anterior, o
usurio agora no poder conceder privilgios para os
outros usurios, a sintaxe a seguir:

E para revogar direitos aos usurios do MySQL,


usamos o REVOKE, sua sintaxe a seguir:
REVOKE privilgio [(coluna)] [, privilgio [(coluna)]
...]
ON {nome_tabela | * | *.* | nome_banco.*}
FROM nome_usuario [, nome_usuario ...]
ou
REVOKE ALL PRIVILEGES, GRANT OPTION FROM nome_usurio

Onde:
privilgios: representa qual privilgio ser removido;
colunas: opcional e especifica as colunas a que os
privilgios sero removidos. Pode ser uma nica coluna ou
vrias separadas por vrgula;
nome-tabela, *, *.* , nome_banco.*: o banco de dados ou
tabela a que os privilgios se aplicam. Pode ser especificado
como: *.* neste caso os privilgios sero removidos de
todos os bancos de dados; * os privilgios removidos
aplicam-se se no estiver utilizando nenhum banco de dados

79
em particular; nome_banco.*- neste caso, os privilgios
removidos aplicam-se a todas as tabelas do banco;
nome-usurio: especifica um usurio do MySQL que
ter seus privilgios removidos;
Ou:
ALL PRIVILEGES: para remover todos privilgios do
usurio;
GRANT OPTION: para remover o privilgio do usurio
de conceder privilgio a outros usurios;
nome-usurio: especifica um usurio do MySQL que
ter seus privilgios removidos;
Temos a seguir, a remoo dos privilgios do usurio
aluno_E_A_D. Esse usurio tinha como privilgios manipular
as operaes de SELECT, INSERT, UPDATE e DELETE, no
banco de dados praticabd, a sintaxe :

No prximo exemplo temos a revogao de todos os


privilgios concedidos ao usurio aluno_E_A_D, inclusive o
privilgio de conceder privilgio a outros usurios, a sintaxe
:

80

RESUMO DO CAPTULO

Nesta aula 4, conceituamos os gatilhos (triggers) que


so uma adio valiosa ao banco de dados, podem ser
utilizados para impor restries de dados que so muito
mais complexas do que restries referenciais normais de
integridade. Na verdade, os gatilhos (triggers) so
executados quando um evento ocorre podendo ser uma
incluso, alterao ou excluso ocorre em uma tabela do
SGBD. Quando nos referimos a prtica de banco de dados,
no podemos deixar de focar no controle de acesso. No
MySQL necessrio saber manipular o usurio do banco de
dados, desde sua gerao at saber como delet-lo. Um
usurio deve ter nvel de permisses ou privilgios no SGBD
para que possa executar suas tarefas. O ideal que se um
usurio s precisa escrever numa determinada tabela, d a
ele somente permisso pra escrever, se ele s precisa l,
ento s d a ele privilgio de l. Portanto, quanto menos
privilgio o usurio tiver para executar alguma tarefa, melhor
para a segurana do MySQL.

Referncias

DESCOBRE. Tipos de Linguagem de Programao.


Disponvel
em
<http://www.descobre.com/forum/showthread.php?t=697>.
Acesso em 23. mar. 2010
Manual de Referncia do MySQL, 1997. Disponvel
em
<http://www.descobre.com/forum/showthread.php?t=697>.
Acesso em 24.mar. 2010
Manual
MySQL
5.1<
http://
dev.mysql.com/doc/refman/5.1/en/index.html>. Acesso em 24.mar.
2010
LOUCOPOULOS, P. Conceptual Modeling, in: P.
Loucopouls, Conceptual Modeling, Databases, and CASE New
York et, al: John Wiley & Sons, 1992.