Anda di halaman 1dari 86

INTRODUO A SISTEMAS DE BANCO DE DADOS

2010

BANCO DE DADOS
Aplicao da Structure Query Language
Este e-book visa, atravs de exemplos prticos, aplicar os conceitos da Structure Query Language (SQL) na manipulao de Banco de Dados relacionais.

PARTES 1 AO 7

Ricardo R. Barcelar http://www.ricardobarcelar.com.br ricardobarcelar@email.com.br

APRESENTAO

APRESENTAO

objetivo deste material apresentar a Structure Query Language como linguagem padro para manipulao de bancos de dados relacionais, norteando o estudo de banco de dados atravs de exemplos prticos aplicados a um Sistema Gerenciador de Banco de Dados amplamente conhecido e utilizado, o PostgreSQL.

CELSO HENRIQUE PODEROSO DE OLIVEIRA, NAVATE e ELMASRI so referncias para os estudos traados neste material. Dessa forma, o contedo apresentado certamente poder ser utilizado como referncia na vida prtica do profissional de computao que lida diariamente com Banco de Dados.

Ricardo R. Barcelar

PROJETO FSICO DE BANCO DE DADOS

1
Parte
PROJETO FSICO DE BANCO DE DADOS

primeira etapa a fazer ao comea a trabalhar com banco de dados estudar as tcnicas utilizadas para se criar um projeto de banco de dados: Modelo EntidadeRelacionamento, Modelo Lgico usando ferramenta Case, Normalizao, Estratgias de Projeto de Banco de Dados, etc.

Conhecedores dos conceitos de Codd, Chen, e outros autores que definiram o padro relacional para banco de dados, podem avanar mais um passo: implementar o banco de dados em uma ferramenta apropriada. Mas antes, ainda necessrio conhecer alguns conceitos do Projeto Fsico e dos Sistemas Gerenciadores de Banco de Dados especificamente. O Modelo Fsico de Dados a especificao em SQL - Structure Query Language Linguagem de Consulta Estruturada - do esquema relacional para o Sistemas Gerenciadores de Banco de Dados escolhido. Nesta fase, as estruturas de armazenamento e de recuperao de informaes, bem como os mecanismos de acesso devem ser escolhidos, visando sempre o aprimoramento da performance dos aplicativos de Banco de Dados. Nesta fase devem ser especificados no apenas as tabelas criadas, mas tambm os ndices necessrios, as restries de integridade (checks e triggers), algumas operaes de incluso, excluso e atualizao de dados para cada tabela, bem como as consultas que a aplicao deve realizar.

1.1 FATORES QUE INFLUENCIAM O PROJETO FSICO DE BANCO DE DADOS


Esta fase do projeto de BD objetiva no s propor uma apropriada estruturao de dados, mas faz-lo de maneira que garanta um bom desempenho. Sendo assim, no possvel tomar decises significativas sobre projetos fsicos e anlises de desempenho, at que conheamos as consultas, as transaes e as aplicaes que devem ser executadas no banco de dados. Dessa forma, vamos discutir alguns fatores: a. Analisar as consultas e transaes do Banco de Dados importante ter uma idia das intenes de uso do banco de dados, definindo as consultas e transaes que esperamos que sejam realizadas em alto nvel, especificando o seguinte: - Os arquivos que sero acessados pela consulta;

PROJETO FSICO DE BANCO DE DADOS

- Os atributos nos quais quaisquer condies de seleo para a consulta estejam especificados; - Os atributos nos quais quaisquer condies de juno ou condies para ligar mltiplas tabelas ou objetos para a consulta estejam especificadas; - Os atributos cujos valores sero trazidos atravs da consulta. Para cada operao ou transao de atualizao, devemos especificar o seguinte: - Os arquivos que sero atualizados; - O tipo de operao em cada arquivo (insert, update, delete) - Os atributos nos quais condies de seleo para uma excluso ou atualizao estejam especificados. - Os atributos cujos valores sero alterados atravs de uma operao de atualizao. b. Analisar a freqncia esperada de solicitao (execuo) de consultas e transaes necessrio considerar as taxas de solicitao (execuo), usadas de forma estatsticas em situaes prticas para grandes volumes de processamento. c. Analisar as restries de tempo de consulta e transaes Neste caso, algumas consultas e transaes podem ter rigorosas restries de desempenho. Por exemplo, uma transao que deve ser interrompida se no for concluda em 20 segundos d. Analisar as freqncias esperadas de operaes de atualizao Um nmero mnimo de caminhos de acesso aos dados deve ser especificado para um arquivo que seja freqentemente atualizado, uma vez que atualizar os prprios caminhos de acesso desacelera as operaes de atualizao. e. Analisar as restries de Unicidade em Atributos Caminhos de acesso aos dados devem ser especificados em todos os atributos candidatos a chave ou chave primria. A existncia de um ndice facilita a pesquisa nos arquivos de dados, pois este define um caminho de dados. Realizadas as anlises iniciais, outra deciso importante definir qual Sistema Gerenciador de Banco de Dados usar. relevante levar em considerao vrios fatores, como: - O modelo fsico, visto que determinar qual a carga de trabalho que ser exigida pelo SGBD, isso j eliminar algumas opes. - O custo. Uma locadora, por exemplo, ir adquirir uma licena Oracle ou SQL Server? - Plataforma de Sistema Operacional Contudo, esta uma deciso que no ser analisada neste momento.

PROJETO FSICO DE BANCO DE DADOS

1.2 SQL - STRUCTURE QUERY LANGUAGE - LINGUAGEM ESTRUTURADA CONSULTA

DE

Como visto no mdulo passado, muito simples criar um script SQL atravs de uma ferramenta Case. No entanto, este no ser o foco desta sesso. Aqui aprenderemos a criar, sem auxlio de ferramentas case, a gerar nosso script do Banco de Dados. Para tanto necessrio conhecermos a linguagem SQL. Apesar do nome, fazer consultas a bancos de dados no a nica funo de SQL. Ela utilizada para criar tabelas, inserir, excluir e alterar dados do banco de dados, alm de outras utilizaes. A SQL foi desenvolvida na dcada de 70 pela IBM em uma das primeiras tentativas de desenvolver um banco de dados relacional. Tornou-se padro de fato depois de 1986, quando a ANSI (American National Standards Institute) endossou como linguagem padro para Banco de Dados relacionais e desde ento, o j sofreu trs atualizaes oficiais: em 1989, 1992 e 1999. Nesta ltima, algumas das mudanas mais significativas esto relacionadas com a definio dos padres para Banco de Dados Objeto-Relacionais. Devido ao sucesso da forma de consultar e manipular dados da SQL, dentro de um ambiente de banco de dados, a utilizao da SQL foi se tornando ainda maior. Cabe ressaltar que cada implementao de SQL possui uma adaptao da sintaxe para resolver determinados problemas, portanto, qualquer comando mostrado pode ser usado de forma diferente em um determinado Sistema Gerenciador de Banco de Dados. Recomenda-se a leitura do manual do fabricante para maiores informaes sobre o uso da linguagem SQL em Sistema Gerenciador de Banco de Dados comerciais. Atualmente, a linguagem SQL assume um papel muito importante nos sistemas de gerenciamento de banco de dados, podendo ter muitos enfoques. Atravs de comandos SQL, possvel montar consultas poderosas sem a necessidade da criao de um programa, ou utilizar comandos SQL embutidos em programas de aplicao que acessam os dados armazenados. Devido ao fato de possuir vrias aplicaes, a linguagem SQL prov suporte a vrias funes. Que consiste em: - DDL (Linguagem de definio de dados), onde os dados a serem armazenados so definidos e estruturados; (Create, Alter e Drop). - DML (Linguagem de manipulao de dados), que permite a incluso, remoo, seleo ou atualizao de dados armazenados no banco de dados; Controle de acesso, permitindo proteo dos dados de manipulaes no autorizadas; (Select, Insert, UpDate, Delete, Commit e Rollback). - DCL (Linguagem de controle de dados) uma subclasse da DML responsvel pelas permisses de acesso ao banco; (Grant e Revoke). Restries de Integridade, que auxiliam no processo de definio da integridade dos dados, protegendo contra corrupes, inconsistncias e falhas do sistema de computao. Alm dessas caractersticas principais, ainda podemos citar: - Vises, onde so especificadas as consultas disponveis atravs de tabelas virtuais (Views).
5

PROJETO FSICO DE BANCO DE DADOS

- Gatilhos a fim de automatizar processos no banco (Triggers). Outra caracterstica a capacidade de cancelar uma srie de atualizaes ou gravar depois de concluir uma srie de atualizaes.

1.3 CRIANDO UM BANCO DE DADOS


Esta etapa trata da Data Definition Language (DDL). O processo bsico consiste simplesmente em atribuir tipos de dado e tamanho para cada um dos atributos que foram identificados. Observao: - Cada SGBD adota um terminador de comando. O mais comum o ponto e vrgula (;) - Quanto aos comandos apresentados, os SGBD no so sensveis a letras maisculas ou minsculas. Contudo, o contedo das colunas normalmente sensvel, portanto muito cuidado.

1.3.1 Desnormalizao de dados Em uma anlise mais profunda, muitas vezes conveniente avaliar a necessidade alguns campos redundantes na tabela. Esse processo chamado de desnormalizao de dados. Ocorre que quando idealizamos o modelo de dados, utilizamos o conceito de processador perfeito, em que as informaes so transmitidas sem custo instantaneamente. Mesmo bancos de dados avanados possuem limitaes. Esta tcnica pode ser exemplificada pelo caso dos campos calculados que so eliminados na 3 Forma normal. Quando se tem um grande banco de dados que trata de Notas Fiscais, por questes de performance costuma-se driblar um pouco a regra e coloca-se o valor total da nota como um campo na tabela. Isso pode ser feito quando o banco de dados possui mecanismo de controle de transaes, em que uma eventual gravao no banco de dados implique necessariamente a gravao na outra ponta. Esta operao deve ser feita por meio de gatilhos (triggers) para garantir a integridade das informaes. 1.3.2 Definio de dados Antes de criar as tabelas no nosso banco de dados, temos que definir quais so as caractersticas de cada um dos campos. As caractersticas que o SQL exige so o tipo do dado e o tamanho de cada campo. As informaes aqui apresentadas so utilizadas pela maioria dos bancos de dados. Eventuais mudanas devem ser consultadas na documentao do Banco de dados adotado. TIPO DE DADO Integer ou Int Smallint Numeric DESCRIO Nmero positivo ou negativo inteiro. O nmero de bytes utilizado varia de acordo com o banco de dados utilizado. Mesma funo do Inteiro, mas ocupa cerca da metade do espao Nmero positivo ou negativo de ponto flutuante. Deve-se informar tamanho do campo e a quantidade de casas decimais.

PROJETO FSICO DE BANCO DE DADOS

Decimal

Semelhante ao Numeric, mas, em alguns bancos de dados, poder ter uma maior preciso aps a vrgula. Nmero de ponto flutuante de simples preciso. A diferena bsica que os valores sero armazenados em representao exponencial, portanto ser arredondado para o nvel mais prximo de preciso. Nmero de ponto flutuante de dupla preciso. Comporta-se como o Real, mas permite maior aproximao de resultados. Nmero de ponto flutuante em que voc define o nvel de preciso (nmero de dgitos significativos) Armazenamento de um nmero fixo de bits. O nmero de bits deve ser indicado, do contrrio o padro ser 1. Igual ao Bit, permitindo armazenar valores maiores. Normalmente, utilizase para armazenar imagens. Permite armazenar datas Permite armazenar horrios Permite armazenar uma combinao de data e hora Permite armazenar cadeias de caracteres (letras, smbolos e nmeros). O tamanho informado fixo e indica o tamanho mximo da cadeia de caracteres.

Real

Double Precision Float Bit Bit Varying Date Time Timestamp Character ou char

Permite armazenar cadeias de caracteres, mas com tamanho varivel. Character Varying Neste caso, especifica-se o tamanho mximo da coluna. Se for utilizado ou Varchar menos espao que o mximo definido, o espao restante no ser ocupado. Interval Intervalo de data ou hora

1.3.3 Adaptando o modelo de dados Com base nas informaes acima, adaptaremos nosso modelo de dados. Para nossos estudos usaremos o modelo lgico abaixo:

PROJETO FSICO DE BANCO DE DADOS

Figura 1- Modelo de dados

Notao dos relacionamentos 1:n FK obrigatria. Parte da chave primria 1:n FK no obrigatria n:m Muitos para muitos (cria-se a tabela associativa)

1.3.4 Criao de Tabelas Tabelas so as estruturas mais importantes de um banco de dados. Nas tabelas estar o contedo que representa cada objeto do mundo real. As prprias tabelas criadas no banco de dados ficam armazenadas em tabelas internas do gerenciador de banco de dados. o chamado Dicionrio de Dados.

PROJETO FSICO DE BANCO DE DADOS

Sintaxe: CREATE TABLE nome_da_tabela (coluna1 tipo_de_dado constraint, coluna2 tipo_de_dado constraint, coluna3 tipo_de_dado constraint

Exemplo: CREATE departamento (dep_id INTEGER NOT NULL, dep_nome VARCHAR(100), dep_atividade VARCHAR(100), empr_id INTEGER NOT NULL);

1.3.5 Constraints Integridade Referencial Restrio de Integridade (RI) Constraints so regras agregadas a colunas ou tabelas. Assim, pode-se definir um campo como obrigatrio ou no, ou aceitar apenas alguns valores predefinidos. No caso de regras aplicadas a tabelas, tem-se a definio de chaves primrias (PK) e estrangeiras (FK). Um bom Sistema Gerenciador de Banco de Dados deve evitar a entrada de informao incorreta ou inconsistente em sua base de dados, garantindo, com isso, a qualidade da informao inserida. Uma restrio de integridade (RI) uma condio especificada no esquema da base de dados para restringir a informao a ser armazenada. As RI so especificadas e conferidas em dois momentos diferentes: - Na especificao da RI: se d na definio do esquema da base de dados pelo usurio ou pelo administrador da base de dados (DBA); - Na conferncia da RI: feita pelo banco de dados toda vez que uma relao modificada por uma aplicao sendo executada.

1.3.5.1 TIPOS DE CONSTRAINTS MAIS COMUNS As constraints variam muito de um banco para outro. a) Chave Primria: a coluna identificadora de um registro na tabela. Para representla basta acrescentar a palavra chave PRIMARY KEY seguida do nome da coluna. Exemplo: ... PRIMARY KEY (cliente_id), ...

b) Chave Estrangeira: o campo que estabelece o relacionamento entre duas tabelas. Dessa forma, deve-se especificar na tabela que contm a chave estrangeira quais so essas colunas e a qual tabela est relacionada. Ao determinar este tipo de relacionamento, fica garantida a integridade das informaes. Os valores presentes na coluna definida com chave estrangeira devem ter um correspondente na outra tabela.

PROJETO FSICO DE BANCO DE DADOS

Exemplo1: ... FOREING KEY nome_chave (coluna) REFERENCES (tabela) ON UPDATE ao ON DELETE ao Ao: Determina qual ao o banco de dados deve tomar quando for excluda ou alterada uma linha da tabela que contm referncia a esta chave. Pode ser: - SET NULL: Altera o contedo da coluna para nulo, perdendo a referncia, sem deixar valores inconsistentes. - SET DEFAULT: Altera o contedo da coluna pra um valor especificado na clusula DEFAULT, se houver. - CASCATE: Exclui ou altera todos os registros que se relacionam com a ele. - NO ACTION: Em caso de alterao, no modifica os valores que se relacionam a eles. - RESTRICT: No permite a excluso da PK. Exemplo2:

CREATE TABLE funcionario (fun_id fun_admissao DATE, dept_id INTEGER, PRIMARY KEY (fun_id),

INTEGER,

fun_nome

VARCHAR(50),

FOREIGN KEY (dept_id) REFERENCES departamento ON DELETE CASCADE ON UPDATE NO ACTION

c) DEFAULT: Atribui um contedo padro a uma coluna da tabela. Exemplo: ... prod_quantidade INTEGER DEFAULT 1, ...

d) NOT NULL: Indica que o contedo de uma coluna no poder ser Nulo. Lembre-se, em banco de dados SQL, colunas sem valor atribudo possuem contedo Nulo.

10

PROJETO FSICO DE BANCO DE DADOS

Exemplo: ... cliente_nome VARCHAR(50) NOT NULL, ...

e) UNIQUE: Indica que no pode haver repetio no contedo da coluna. No a mesma coisa que chave primria. A chave primria, alm de no permitir repetio, no pode conter valores nulos, dentre outras caracterstica no existentes nesta restrio. Exemplo: ... cliente_CPF NUMERIC(11) UNIQUE, ...

f) CHECK: Definio de domnio: Um domnio uma expresso de valores possveis para o contedo de uma coluna. Exemplo: ... sexo CHAR(1) CHECK (UPPER(sexo) = M OR UPPER(sexo) = F),

1.3.6 Alterao da estrutura da tabela Para alterar a estrutura de uma tabela, utilizamos o comando ALTER TABLE.

1.3.6.1 ACRESCENTAR NOVAS COLUNAS O comando utilizado para acrescentar novas colunas muito semelhante ao da criao de colunas em uma tabela: Sintaxe: ALTER TABLE nome_da_tabela ADD coluna1 tipo_de_dado constraint, coluna2 ... tipo_de_dado constraint, Exemplo: ALTER TABLE departamento ADD dep_ramal NUMBER(4) UNIQUE

1.3.6.2 ACRESCENTAR NOVAS CONSTRAINTS O comando utilizado para acrescentar novas constraints muito semelhante ao da criao de constraints em uma tabela:

11

PROJETO FSICO DE BANCO DE DADOS

Sintaxe: ALTER TABLE nome_da_tabela ADD (constraint)

Exemplo: ALTER TABLE departamento ADD PRIMARY KEY (dep_id)

1.3.6.3 MODIFICAR COLUNAS O comando utilizado para modificar qualquer caracterstica de uma coluna. Sintaxe: ALTER TABLE nome_da_tabela MODIFY (nome-coluna constraint) Exemplo: ALTER TABLE departamento

tipo_dado MODIDY dep_ramal INTEGER NOT NULL

No necessrio repetir o que no estamos modificando.

1.3.6.4 EXCLUINDO ELEMENTOS Pelo padro SQL, deveria ser possvel excluir colunas ou constraints de uma tabela. Alguns bancos de dados no permitem a excluso de colunas. Sintaxe: ALTER TABLE nome_da_tabela DELETE elemento Exemplo: ALTER TABLE departamento DELETE dep_ramal

ALTER TABLE departamento DELETE PRIMARY KEY

Abaixo um exemplo onde vrias alteraes esto sendo realizadas em um s comando: ALTER TABLE fornecedores ADD cgc NUMBER(14), DROP tipofornecedor, ADD CONSTRAINT ck_email CHECK (e_mail CONTAINING @ OR e_mail IS NULL)

1.3.7 Eliminando uma Tabela Para eliminar uma tabela do banco de dados, utilizamos o comando DROP TABLE seguido do nome da tabela. Alguns bancos somente permitiro esta operao se esta no estiver relacionada outra tabela.

12

PROJETO FSICO DE BANCO DE DADOS

Sintaxe: DROP TABLE nome_da_tabela

Exemplo: DROP TABLE departamento

5. EXERCCIOS
Usando a Linguagem SQL crie o Schema de banco de dados para o seguinte modelo lgico:

13

NDICE

2
Parte
NDICE

uando criamos a estrutura de um banco de dados temos que usar artifcios que melhorem a performance na recuperao dos dados que l sero armazenados. Dentre vrias tcnicas existentes para melhorar a esta performance existe a criao de ndices.

O ndice um arquivo auxiliar associado a uma Tabela. Sua funo acelerar o tempo de acesso s linhas de uma Tabela, cria ponteiros para os dados armazenados em colunas especificas. O Banco de dados usa o ndice de maneira semelhante ao ndice remissivo de um livro, verifica um determinado assunto no ndice e depois localiza a sua posio em uma determinada pgina.

1.1 CRIAO DE NDICE


O ndice serve para prover um acesso rpido a linhas das tabelas. Por meio dele possvel unir uma ou mais colunas por onde o acesso mais freqente. Exemplo: Temos uma tabela de pessoas e normalmente queremos fazer buscas em ordem alfabtica. O nome, no uma boa chave primria para a tabela por ser alfanumrica, o que deixa as pesquisas mais lentas e tambm pela repetio de nomes. Dessa forma, cria-se um ndice para o nome da pessoa. Assim, garante-se um acesso mais rpido aos nomes, visto que os dados buscados estariam fora de seqncia. Os valores indexados so armazenados em um objeto do banco de dados em ordem, o que permite ao Sistema Gerenciador de Banco de Dados pesquisar primeiro no ndice, para depois buscar na tabela. importante ressaltar que alguns bancos de dados necessitam de ndices constantemente atualizados, pois eventualmente estes perdem a referncia ao dado. 1.1.1 Quando Criar um ndice O ndice quando criado com critrios bem definidos traz uma enorme vantagem, mas por outro lado pode trazer enormes problemas, visto que todo trabalho de um Sistema Gerenciador de Banco de Dados envolve um custo. No conveniente sair criando ndices para cada um dos campos da tabela sem que haja uma razo para isto. Quando um ndice criado uma das tarefas do Sistema Gerenciador de Banco de Dados mant-lo atualizado a cada nova incluso, excluso e alterao nos dados. Alm do

14

NDICE

mais, o ndice tambm ocupa espao no banco de dados, pois criado um novo objeto que manter informaes indexadas e armazenar a referncia linha fsica da tabela. NOTA: Se so criados muitos ndices, pode-se prejudicar o desempenho do banco de dados Se so criados poucos ndices, pode-se prejudicar o desempenho da aplicao. Quando criar ndices? a) Chaves Primrias: se o banco de dados no cri-las automaticamente, necessrio faz-lo manualmente. b) Chave Estrangeira: sempre recomendvel criar, principalmente quando a tabela que faz referncia muito grande. c) Colunas utilizadas freqentemente na clusula WHERE ou JOIN do comando SELECT. Quando no criar ndices? a) Colunas com muitos valores iguais. b) Colunas com muito contedo NULO (no inicializados). c) Tabelas muito pequenas. NOTA: Sempre que uma consulta estiver muito lenta, verifique a possibilidade de criar ndice para facilitar a busca. Para criar um ndice, utilize a seguinte sintaxe: Sintaxe: Exemplo:

CREATE INDEX nome_index CREATE INDEX idx_dep_nome ON nome_tabela (coluna [ASC|DESC]) ON departamento(dep_nome) CREATE INDEX idx_dep_varios ON departamento(dep_nome,dep_ramal) Para excluir um ndice, utilize a seguinte sintaxe: Sintaxe: DROP INDEX nome_index Exemplo: DROP INDEX idx_dep_varios

No possvel modificar ndices. Para alterar um ndice, elimine-o e, depois, recrie-o. NOTA: Ao eliminar uma tabela, os ndices e as constraints so eliminados automaticamente.

15

NDICE

1.2 ACESSO A DADOS EM UM SISTEMA GERENCIADOR DE BANCO DE DADOS


Para compreender melhor a utilizao de ndices importante conhecer a estrutura de acesso a dados em um Sistema Gerenciador de Banco de Dados.

Figura 2 - Organizao de um SGBD

Neste contexto, observamos que os bancos de dados so armazenados fisicamente como arquivos de registros, que so geralmente armazenados em discos magnticos. Assim, os meios de armazenamento formam uma hierarquia de armazenamento que inclui duas categorias principais: - Armazenamento Principal: Operados diretamente pela CPU, como a Memria Principal e Memria Cache. - Armazenamento Secundrio: Inclui os discos magnticos, ticos e fitas. Geralmente possuem uma capacidade maior, porm so mais lentos e no podem ser acessados diretamente pela CPU.

Figura 3 - Estrutura de armazenamento

16

NDICE

A maioria dos bancos de dados est armazenada sob maneira permanente (ou persistente) sob a forma de armazenamento secundrio. Geralmente, o Sistema Gerenciador de Banco de Dados possui diversas opes disponveis para organizar os dados, e o processo relativo ao projeto de banco de dados fsico envolve escolher entre as opes, as tcnicas de organizao de dados. Os dados armazenados em disco so organizados na forma de arquivos de registros. Cada qual uma coleo de valores de dados que podem ser interpretados como fatos sobre entidades, seus atributos e seus relacionamentos. Para acessar uma informao no banco de dados considera-se o tipo de requisio e a estrutura utilizada para organizao e acesso s chamadas pginas de dados. 1.2.1 Organizao dos dados em Memria Secundria - Arquivos Heap ou pile (aglomerado): Melhor opo quando o acesso tpico uma busca seqencial, sem ordem, recuperando todos os registros. Os registros so posicionados no arquivo pela ordem na qual foram includos. So utilizados pelos ndices secundrios e utilizados para coletar e armazenar registros de dados para utilizao futura. Exemplo: um simples arquivo de registros de dados. - Arquivos Ordenados: Melhor opo se os registros devem ser recuperados em alguma ordem, ou quando somente uma poro contgua dos registros ordenados necessria. Exemplo: Arquivo de dados, possivelmente ordenado, alm de vrios ndices. - Arquivos Hashed: Melhor para selees de igualdade. Uma funo hash aplicada ao valor do campo de um registro e retorna o endereo do bloco do disco no qual o registro est armazenado. Para a maioria dos registros, precisamos somente do acesso a um nico bloco para recuperar aquele registro. No adequado para acesso seqencial ordenado. Existem outras maneiras ou possibilidades para organizar arquivos, como rvores-B e arquivos de registro mistos, que implementam relacionamentos entre registros de diferentes tipos fisicamente como parte da estrutura de armazenamento.

1.3 INDEXAO
Como visto, os ndices so estrutura de dados que recebem como entrada uma propriedade de registro (por exemplo, um valor de um ou mais campos) e os encontra com essa propriedade rapidamente. Um ndice permite localizar um registro sem ter que examinar mais que uma pequena frao dos registros possveis. Assim sendo, podemos concluir que os campos cujos valores o ndice se baseia formam a chave de pesquisa. NOTA ndices so estruturas de dados auxiliares cujo nico propsito tornar mais rpido o acesso a registros baseado em certos campos, chamados campos de indexao.

17

NDICE

1.3.1. Tipos de ndices - ndices primrios - baseado na chave de ordenao; - ndices de agrupamentos (clustering) - baseado no campo de ordenao no-chave de um arquivo; - ndices secundrios - baseado em qualquer campo no ordenado de um arquivo; - ndices multinveis; - rvores B e B+; - Tabelas Hash; Um dos mais antigos esquemas de ndice utilizados em sistema de banco de dados chamado de arquivo indexado seqencialmente, que so projetados para aplicaes que requerem tanto o processamento seqencial de um arquivo inteiro quanto o acesso aleatrio a registros individuais. Estes ndices podem ser: - Densos: quando o nmero de entradas do ndice igual ao nmero de registros no arquivo de dados. Cada registro no arquivo de ndice contm o endereo de um registro no arquivo de dados. Ponteiros
Figura 4 - ndice denso sobre um arquivo de dados seqenciais

- Esparos: Usa-se menos espao de armazenamento que o ndice denso ao custo de um tempo um pouco maior para localizar um registro dada a sua chave. quando o nmero de entradas do ndice igual ao nmero de blocos do arquivo de dados. Apenas alguns registros de dados so representados no arquivo de ndices. Em geral, aponta para o 1 registro de bloco.

18

NDICE

Figura 5 - ndice esparso sobre um arquivo de dados seqenciais

Ponteiros

1.3.1.1 NDICE PRIMRIO o ndice associado a uma chave primria. Nada mais do que um arquivo ordenado, cujos registros so de tamanho fixo com dois tampos. O primeiro, do mesmo tipo do campo chave de ordenao (chave primria) e o segundo um ponteiro para um bloco do disco ou arquivo de dados. Utiliza ndice esparo.

19

NDICE

Figura 6 - ndice Primrio

1.3.1.2 NDICE DE AGRUPAMENTO (CLUSTERING) Se os registros de um arquivo estiverem ordenados fisicamente por um campo que no seja chave, ou seja, que no possui um valor distinto, esse campo chamado de campo clustering. Semelhante ao ndice primrio possui dois campos de ordenao, no entanto o primeiro campo do mesmo tipo do campo clustering e o segundo um ponteiro para o bloco. Neste sentido sempre h a reserva de um bloco inteiro para cada valor de campo clustering, melhorando operaes de incluso e excluso. Em simples palavras um ndice associado a um campo no chave. Utiliza ndice esparo.

20

NDICE

Figura 7 - ndice de Agrupamento

1.3.1.3 NDICE SECUNDRIO No ndice secundrio o campo de indexao um campo no ordenado do arquivo de dados. Pode haver muitos ndices secundrios para um mesmo arquivo. Dois casos: - O campo de indexao um campo chave (s vezes chamado de chave secundria). - O campo de indexao no chave.

21

NDICE

possvel que mais de um registro tenha o valor da chave. Isso ocorre, por exemplo, quando a chave de pesquisa no a chave primria; Um ndice secundrio um ndice denso, normalmente com duplicatas. O ndice consiste em pares de chaves-ponteiro. Neste caso, sempre que so permitidas chaves de pesquisas duplicadas.

Figura 8 - ndice Secundrio

Outra possibilidade para ndices secundrios a entrada de ndice para um bloco de dados onde a menor chave de pesquisa nova, isto , a chave no apareceu em um bloco anterior; Se no h chave de pesquisa nova no bloco, ento sua entrada de ndice contm a nica chave de pesquisa encontrada nesse bloco; Pode-se encontrar os registros de uma chave de pesquisa K examinando-se o ndice para a primeira entrada cuja chave : - Igual a K - Menor que K, mas a prxima chave maior que K Segue-se o ponteiro da entrada. Se for encontrado pelo menos um registro com a chave de pesquisa K, ento a busca continua em blocos adicionais, at encontrar todos os registros com a chave de pesquisa K.

Figura 9 - ndice Secundrio

22

NDICE

Usa o ndice esparso indicando a nova chave de pesquisa mais baixa em cada bloco. ORGANIZANDO AS IDIAS: Campos ordenados ndice primrio ndice de agrupamento Campos no ordenados ndice Secundrio (chave) ndice Secundrio (no chave)

Campo chave Campo no chave

Tipo de ndice Primrio Agrupamento Secundrio (chave) Secundrio (no chave)

Denso ou Esparo N de blocos no arq. de dados Esparo N de valores distintos do campo de Esparo indexao N de reg. no arq. de dados Denso N de reg. no arq. de dados Denso N de valores distintos de indexao Esparo Nmero de Entradas

1.3.1.4 NDICES MULTINVEIS Uma pesquisa binria aplicada ao ndice para localizar ponteiros para um bloco do disco ou para um registro no arquivo que possui um valor de campo ndice especfico. Se o arquivo de ndices se torna muito grande para ser armazenado em bloco de disco, interessante index-lo em mais de um nvel.A vantagem que um ndice pequeno pode ser mantido em memria e o tempo de busca mais baixo; por outro lado, muitos nveis de ndices podem aumentar a complexidade do sistema, sendo mais recomendado a utilizao de outra estrutura como a que veremos mais a frente: rvore-B.

Figura 10 - ndices Multinveis

23

NDICE

NOTA Um ndice multinvel um ndice de ndice. - Primeiro nvel: arquivo ordenado pela chave de indexao, valores distintos, entradas de tamanho fixo. - Demais nveis: ndice primrio sobre o ndice do nvel anterior e assim sucessivamente at que no ltimo nvel o ndice ocupe apenas um bloco. - Nmero de acessos a bloco: um a cada nvel de ndice, mais um ao bloco do arquivo de dados.

Figura 11 - ndice Primrio de dois Nveis

A figura acima exemplifica um ndice primrio de dois nveis que se parece com a organizao ISAM (Indexed Sequential Acess Method - Mtodo de Acesso Seqencial Indexado). O problema dos ndices multinveis so arquivos fisicamente ordenados, portanto, ineficientes na insero e remoo. Para solucionar este problema podem-se adotar as seguintes solues: - Deixar algum espao em cada um dos blocos para insero de novas entradas. - Estruturas de dados: rvores B e suas variaes. a) Gerenciamento de ndices nas Modificaes de Dados Os arquivos seqenciais apresentam problemas com o tempo, visto que um bloco no mais suficiente para armazenar o contedo que era antes armazenado. Para contornar esse problema possvel adotar as seguintes solues:
24

NDICE

- Criar blocos de estouro (overflow). Blocos de estouro no tm entradas em um ndice esparso; - Inserir novos blocos na ordem seqencial; - Se no houver lugar para inserir informao em um bloco, alguma informao poder ser transferida para outro bloco. De igual forma, blocos vazios podero ser combinados. 1.3.1.5 RVORE B rvores B e B+ so casos especiais de estruturas de dados bastantes conhecidas do tipo rvore. Uma rvore formada por ns, e cada n na rvore, exceto um n especial denominado raiz, possui um n pai e diversos ns filhos. Um n que no possui filhos chamado de n folha. Um modo de implementar uma rvore possuir tantos ponteiros em cada n quantos forem os ns filhos daquele n. E para percorrer todos os ns, da rvore e da sub-rvore necessrio fazer uso da recursividade.

Figura 12 - rvore de Grau 3

a) rvore de Pesquisa Uma rvore de pesquisa um tipo especial de rvore que se utilizada para guiar a pesquisa por um registro, dado o valor de um dos campos do registro. A rvore de busca projetada com dois objetivos: - Manter a rvore balanceada; e - Evitar o desperdcio de espao dentro de um n, custa de maior complexidade nos algoritmos de insero e remoo. Regras: - Os ns da sub-rvore esquerda contm valores menores que a raiz; - Os ns da sub-rvore direita contm valores maiores ou iguais a raiz; - As sub-rvores so rvores binrias de pesquisa.

25

NDICE

Figura 13 - Distribuio nos ns

b) rvore B Em computao, rvore B ou B-Tree uma estrutura de dados rvores que so muito utilizadas em banco de dados e sistema de arquivos. Para inserir ou remover variveis de um n, o n no poder ultrapassar sua ordem e nem ser menor que sua ordem dividida por dois. rvores B no precisam ser rebalanceadas como so freqentemente as rvores de busca binria com rvore AVL. rvores B tm vantagens substanciais em relao a outros tipos de implementaes quanto ao tempo de acesso e pesquisa aos ns. Uma rvore B de ordem "m" (mximo de filhos para cada n) uma rvore que atende as seguintes propriedades: - Cada n tem no mximo "m" filhos - Cada n (exceto a raiz e as folhas) tem pelo menos "m/2" filhos - A raiz tem pelo menos dois filhos se a mesma no for uma folha - Todas as folhas aparecem no mesmo nvel e no carregam informao - Um n no-folha com "k" filhos deve ter k-1 chaves As vantagens da rvore B so: - Melhor desempenho por ter um nmero menor de ns do que uma rvore binria. Por exemplo: Menos ns significa menos altura que resulta em menos acessos ao disco. - Por garantir poucos ponteiros entre os ns, h uma economia de espao. - Maior rapidez em buscas pela utilizao de chaves primrias. - Sua estrutura dinmica, ajustando automaticamente o balanceamento da rvore, a cada incluso/excluso. - Permite um tempo de acesso de dados menor, em uma busca aleatria, por causa de suas ramificaes. Algoritmos Insero 1. Primeiro pesquise a chave, para ter a certeza de que esta no existe na rvore. 2. Busque a posio onde esta ser inserida. Teste para ver se o n est cheio. 3. Se n estiver vazio, insira o valor dentro dele, seno execute uma subdiviso do n da seguinte forma: 3.1. Verifique se o n-pai est vazio, se sim execute 3.1.1. Passe o elemento do meio do n para seu pai. 3.1.2. Divida o n em dois ns iguais.

26

NDICE

3.2. Se o n pai estiver cheio, repita as duas linhas acima recursivamente. (Caso todos os ns-pai estiverem cheios, inclusive a raiz, deve ser criada uma nova raiz aumentando assim a altura da rvore. 3.3. Somente aps satisfazer todas divises necessrias, insira nova chave. Excluso 1. Primeiro pesquise a chave para ter a certeza de que esta existe na rvore. 2. Se existir, verifique se est em folha, e faa a excluso. 3. Se existir e no estiver em folha, substitua esta chave pela menor chave do filho a direita. 3.1. Se o nmero de chave no n, for maior do que (Ordem/2 - 1), ento termine a rotina. 3.2. Seno redistribua as chaves entre os ns vizinhos. Busca 1. Indique a chave que ser procurada. 2. Pesquise desde a raiz at encontr-la, e ento retorne o n e a posio desta. 3. Se a chave no for encontrada, continue o lao at encontrar um nil das folhas. Exemplo:

Figura 14 - Operaes na rvore

1.3.1.5 HASHING So particularmente adequados para pesquisas por igualdade. A idia principal usar uma funo de hashing. Esta funo mapeia um valor da chave de pesquisa (atributo de uma tabela) em um registro ou balde (bucket) de registros.

27

NDICE

Figura 15 - Hashing

A balde uma unidade de armazenamento que contm um ou mais registros (um balde tipicamente um bloco do disco). Numa organizao de ficheiro em hashing, obtemos o balde de um registro a partir do valor da sua chave de pesquisa. Mais concretamente, o balde obtido atravs do clculo da funo de hash para aquela chave de pesquisa. A funo de hash h uma funo do conjunto de todos os valores da chave K para o conjunto dos endereos de todos os baldes B. A funo de hash usada para localizar registros para as operaes de acesso, insero, bem como eliminao. Observe os exemplos de busca, insero e excluso. A desvantagem do hashing esttico pode conduzir a longas cadeias de transbordo. Busca Insero

Excluso

28

NDICE

Longas cadeias de transbordo podem desenvolver-se e degradar o desempenho. a) Hashing Esttico O hashing esttico escolhe a funo hash com base no tamanho do arquivo atual, ou com base no tamanho antecipado do arquivo com base em um ponto no futuro. Esta tcnica reorganiza periodicamente a estrutura de hash. b) Hashing Dinmico Diferente do hashing esttico a funo hash modificada dinamicamente para acomodar o crescimento ou encolhimento do banco de dados, usando o hashing extensvel. c) Hashing Extensvel Divide e une os buckets enquanto o banco de dados cresce e encurta. A Eficincia do espao mantida e a funo hash gera valores por intervalos relativamente grandes. Outra caracterstica que os buckets so criados por demanda.

29

DATA MANIPULATION LANGUAGE - DML

3
Parte
DATA MANIPULATION LANGUAGE - DML

ma vez criada a estrutura fsica do banco de dados necessrio popular as tabelas. Para isso utilizam-se os comandos da DML (Data Manipulation Language). Nesta seara encontramos comandos como Insert, Update, Delete, Commit e Rollback.

DML(Linguagem de Manipulao de Dados): Permite a incluso, remoo, seleo ou atualizao de dados armazenados no banco de dados; Controle de acesso, permitindo proteo dos dados de manipulaes no autorizadas;

O ndice um arquivo auxiliar associado a uma Tabela. Sua funo acelerar o tempo de acesso s linhas de uma Tabela, cria ponteiros para os dados armazenados em colunas especificas. O Banco de dados usa o ndice de maneira semelhante ao ndice remissivo de um livro, verifica um determinado assunto no ndice e depois localiza a sua posio em uma determinada pgina.

3.1 INSERT
Comando responsvel por adicionar um ou mais registros na tabela de Banco de Dados. Os campos que forem omitidos recebem valores NULOS (NULL). Sintaxe: INSERT [TRANSACTION transaction] INTO <object> [(col [, col ])] {VALUES (<val> [, <val> ]) | <select_expr>}; <object> = tablename | viewname <val> = {:variable | <constant> | <expr> | <function> | udf ([<val> [, <val> ]]) | NULL | USER | RDB$DB_KEY | ? } Exemplo: INSERT INTO clientes (id, nome) VALUES (1, Nome do Cliente);

30

DATA MANIPULATION LANGUAGE - DML

NOTE BEM: A lista de colunas opcional no comando Insert; Caso no seja definida, assume-se a seqncia da criao da tabela; Para maior clareza do cdigo e evitar erros em caso de reestruturao da tabela recomenda-se utilizar a lista de colunas. Valores alfanumricos devem ser especificados entre aspas simples exemplo; Valores numricos no devem conter esse separador. Valores do tipo data devem ser tratados de acordo com as especificaes do SGBD; Ao incluir uma linha no Banco de Dados, o gerenciador checar as restries de integridade (Constraints). Assim chaves primrias, estrangeiras, domnios, etc so checadas no momento da incluso. Caso alguma restrio for violada, a linha no ser includa e uma mensagem ser emitida pelo SGBD. As colunas que no tiverem valores atribudos tero contedo NULL ou default, caso no haja a restrio NOT NULL. Para inserir um valor nulo deve informar NULL no lugar correspondente a coluna. 3.1.1 Inserindo Vrias Linhas Para incluir diversas linhas em uma tabela, utiliza-se o comando INSERT em conjunto com o comando SELECT. Isso ir copiar as linhas de uma tabela para outra; A lista de colunas do SELECT deve corresponder a totalidade de colunas da tabela. Exemplo: INSERT INTO vendas_old CURRENTE DATE;

SELECT

FROM

vendas

WHERE

data_venda

Outra forma usando o comando INSERT por vrias vezes consecutivas acompanhado do finalizador ponto-e-virgula . Ou tambm aps o comando VALUES colocando os dados entre parnteses separados por vrgula. Exemplo: INSERT INTO vendas_old (prod_id, prov_valor) VALUES (1, 2.00), (2, 3.00), (3, 5.00), (4, 10.00); 3.1.2 Laboratrio INSERT INTO autor (aut_id, aut_nome) VALUES (1, Renato Russo); INSERT INTO autor (aut_id, aut_nome) VALUES (2, Ton Jobim); INSERT INTO musica (mus_id, mus_nome, mus_duracao) VALUES (1, sera, 00:02:28); INSERT INTO musica (mus_id, mus_nome, mus_duracao) VALUES (2, Ainda Cedo, 00:03:55); INSERT INTO gravadora (grav_id, grav_nome, grav_tel, grav_contato) VALUES (1, EMI, 1122334455, Jos Vitor); INSERT INTO cd(cd_id, cd_nome, cd_preco, dt_lancamento, grav_id) VALUES (1, Mais do Mesmo, 20.50, 21.12.1998, 1);

31

DATA MANIPULATION LANGUAGE - DML

3.1.3 Exerccios a) Popule as tabelas do banco de dados conforme representado abaixo:

ATENO: Observe a sequncia de insero dos dados.

3.2 UPDATE
Comando responsvel alterao de ou um mais registros na tabela de Banco de Dados. Sintaxe: UPDATE [TRANSACTION transaction] {table | view} SET col = <val> [, col = <val> ] [WHERE <search_condition> | WHERE CURRENT OF cursor]; Exemplo: UPDATE CLIENTE SET DATA_INCLUSAO = CURRENT DATE;

32

DATA MANIPULATION LANGUAGE - DML

3.2.1 Where Comando responsvel por especificar qual registro da tabela ser alterado quando usado em conjunto com a clusula UPDATE. NOTE BEM: O contedo a ser atualizado deve respeitar o tipo de dado da coluna. A condio expressa no comando servir para definir quais linhas devem ser atualizadas. Caso a clusula WHERE contenha a chave primria somente uma linha da ser atualizada. Todas as restries de integridade (Constraints) sero avaliadas pelo SGBD. 3.2.2 Laboratrio Se quisermos alterar o preo de um CD, podemos utilizar o seguinte comando filtrando na clusula WHERE a chave primria da tabela CD: Exemplo: UPDATE cd SET cd_preco = 21,00 WHERE cd_id = 1; Se o aumento for para todos os cds de uma determinada gravadora, utilizaremos como filtro da clusula WHERE grav_id: Exemplo: UPDATE cd SET cd_preco = 22,00 WHERE grav_id = 1; Imagine que ocorra um aumento de preo generalizado para todos os CDs em 5%. Assim multiplica-se o prprio preo do CD por 1,05. Exemplo: UPDATE cd SET cd_preco = cd_preco * 1,05; Outros Exemplos: UPDATE cd SET cd_preco = 15 WHERE cd_id = 1; UPDATE autor SET aut_nome = B. Manilow WHERE aut_id = 2; UPDATE cd SET cd_preco = cd_preco * 1,10 WHERE grav_id = 3; UPDATE gravadora SET grav_nome = E.M.I, grav_tel = 2144332211 WHERE grav_id = 1;

3.3 DELETE
Comando responsvel pela excluso de ou um mais registros na tabela de Banco de Dados.

33

DATA MANIPULATION LANGUAGE - DML

Sintaxe: DELETE [TRANSACTION transaciona] FROM table {[WHERE <search_condition>] | WHERE CURRENT OF cursor}; Exemplo: DELETE FROM VENDAS WHERE DATA_VENDA <= 1-JAN-1999; 3.3.1 Where Comando responsvel por especificar qual registro da tabela ser excludo quando usado em conjunto com a clusula DELETE. NOTE BEM: O comando DELETE pode, da mesma forma que o comando UPDATE, afetar uma ou mais linhas de uma tabela. Desta forma o escopo da excluso ser definido pela clusula WHERE. Se for especificado na clusula WHERE a chave primria, somente uma linha ser excluda. Antes de uma excluso, o gerenciador sempre far uma checagem na integridade referencial.

3.4 CONTROLE BSICO DE TRANSAES


Uma vez realizadas as operaes de incluso, alterao e excluso, a modificao realizada no estar ainda no banco de dados. Ela visvel apenas na seo atual. Para que os comandos de Insert, Update e Delete sejam enviados para o banco necessrio utilizar os comandos COMMIT ou descartados pelo comando ROLLBACK.

3.5 LABORATRIO
Neste primeiro exemplo, apenas o autor com cdigo 1 ser excludo (desde que no haja relacionamentos com outras tabelas): Exemplo: DELETE FROM autor WHERE aut_id = 1; Neste caso todos os CDs da gravadora 2 sero excludos: Exemplo: DELETE FROM cd WHERE grav_id = 2;

34

PESQUISA BSICA EM T ABELAS

4
Parte
PESQUISA BSICA EM TABELAS

gora que j sabemos criar, incluir, alterar e excluir informaes nas tabelas, veja como podemos extrair informaes do banco de dados. Para tanto o comando utilizado o SELECT. Junto dele h uma imensa possibilidade de comandos como veremos a seguir.

4.1 SELECT
o comando utilizado para realizar buscas/pesquisas no banco de dados. Atrs dele h uma extenso de possibilidades que vo desde a simples extrao do contedo de todas as linhas e colunas de uma tabela at a unio de diversas tabelas, clculos, agrupamentos, ordenaes e filtragem de linhas e colunas. Sintaxe: SELECT [DISTINCT | ALL] {* | Coluna [, coluna, ...]} FROM tabela Onde: DISTINCT: No mostra eventuais valores repetidos; ALL: Mostra todos os valores (Propriedade Default do comando select); *: Mostra todas as colunas da tabela; NOTE BEM: Para execuo dos exemplos utilizaremos estrutura criada na aula 3 DML.

Exemplos: O exemplo mais simples de uma consulta extrair todas as informaes de uma tabela: SELECT * FROM cd; O exemplo a seguir demonstra como filtrar apenas algumas colunas da tabela: SELECT cd_id, cd_nome FROM cd; SELECT grav_id, grav_nome, grav_tel FROM gravadora;

35

PESQUISA BSICA EM T ABELAS

4.1.1 Ordenando o resultado Em muitas situaes a ordem mostrada nem sempre a que esperamos. Para que os dados sejam mostrados da maneira que melhor nos atende usa-se a clusula ORDER BY seguida pela coluna que desejamos que seja ordenada: Exemplo: SELECT aut_id, aut_nome ORDER BY aut_nome; SELECT cd_id, cd_nome ORDER BY cd_id;

FROM autor

FROM cd

Se forem especificadas mais de uma coluna a ser ordenada o gerenciador primeiro ordenara pela primeira coluna e em seguida pelas demais: Exemplo: SELECT grav_id, cd_nome FROM cd ORDER BY grav_id, cd_nome; 4.1.2. Filtrando linhas Para filtrar linhas em uma pesquisa, utilizamos a clusula WHERE. Assim, definido uma expresso lgica (condio) que ser validada e mostrar apenas as linhas que atenderem ao critrio estabelecido. Sintaxe: SELECT [DISTINCT | ALL] {* | Coluna [, coluna, ...]} FROM tabela WHERE condio Para um resultado satisfatrio devemos saber exatamente como construir condies que satisfaam s nossas necessidades de busca para atingir nossos objetivos. Sempre que a condio especificada for verdadeira o resultado ser mostrado. Para tanto necessrio utilizar-se de alguns operadores como veremos a seguir. 4.1.2.1 OPERADORES RELACIONAIS Estes operadores devem ser usados na definio das condies. Podemos testar igualdade, diferena, maior, menor, maior ou igual, menor ou igual. Os operadores devem ser colocados entre os argumentos que esto sendo comparados. OPERADOR = < <= SIGNIFICADO Igual Menos que Menor ou igual a EXEMPLO aut_id = 2 cd_preco < 10 cd_preco <= 10
36

PESQUISA BSICA EM T ABELAS

> >= != ou <>

Maior que Maior ou igual a Diferente

cd_preco > 10 cd_preco <= 10 aut_id != 2 ou aut_id <> 2

Exemplo: SELECT cd_nome, cd_preco FROM cd WHERE cd_preco > 12; NOTE BEM: Da mesma forma que podemos comparar uma coluna com um valor, podemos comparar com outra coluna. Sempre quando fazemos esse tipo de comparao, devemos obedecer ao tipo de dado que estamos comparando.

4.1.2.2 OPERADORES LGICOS Muitas vezes, apenas uma condio no suficiente para determinarmos o critrio de busca. Sempre que isso ocorrer, podemos utilizar operadores lgicos. OPERADOR AND OR NOT ou ! AND Indica que as duas condies devem ser verdadeiras para que seja mostrada a linha. Exemplo: SELECT cd_nome, cd_preco, grav_id FROM cd WHERE cd_preco > 10 AND grav_id = 2; OR Utilizamos o operador OR sempre que quisermos que o resultado final seja verdadeiro. Exemplo: SELECT cd_nome, cd_preco, grav_id FROM cd WHERE cd_preco > 11 OR grav_id = 2 NOTE BEM No h limitao no uso e na combinao de condies usando OR e AND. conveniente utilizar parnteses para determinar o que se quer comparar. SIGNIFICADO e ou no/negao EXEMPLO Condio-1 AND Condio-2 Condio-1 OR Condio-2 NOT Condio

37

PESQUISA BSICA EM T ABELAS

Exemplo: SELECT cd_nome, grav_id, cd_preco FROM cd WHERE (grav_id = 2 OR grav_id = 3) AND (cd_preco >= 17.50) NOT ou ! utilizado para inverter o resultado de uma expresso lgica, negando o resultado da condio. Caso a condio seja verdadeira, ser retornado falso e vice-versa. Exemplo: SELECT cd_nome, cd_preco FROM cd WHERE NOT (cd_preco > 15);

4.1.2.3 OPERADORES ESPECIAIS Existem alguns operadores que so utilizados para determinar melhor as linhas que queremos filtrar. So eles: IS NULL, IS NOT NULL, BETWEEN, LIKE e IN . IS NULL Sabemos que nem todas as colunas tm valores inicializados. Logo esse comando utilizado para saber os campos que no foram inicializados: Exemplo: SELECT * FROM GRAVADORA WHERE grav_tel IS NULL IS NOT NULL Compara a negao do comando anterior. Somente aqueles que tiverem contedo sero mostrados: Exemplo: SELECT * FROM GRAVADORA WHERE grav_tel IS NOT NULL BETWEEN Esse operador serve para determinar um intervalo de busca. Quando desejarmos um intervalo entre nmeros, datas, etc utilizaremos o BETWEEN para simplificar a forma de escrevermos o comando. Normalmente utilizado em conjunto com o AND. Exemplo: SELECT cd_nome, cd_dt_lancamento FROM CD WHERE cd.cd_dt_lancamento BETWEEN '01.01.1979' AND '31.12.2000';

38

PESQUISA BSICA EM T ABELAS

LIKE Com esse operador podemos comparar cadeias de caracteres utilizando padres de comparao para um ou mais caracteres. O caractere percentual (%) substitui zero, um ou mais caracteres e sublinha (_) substitui um caractere. EXPRESSO LIKE A% LIKE %A LIKE %A% LIKE A_ LIKE _A LIKE _A_ LIKE %A_ LIKE _A% APLICAO Todas a palavras que iniciem com a letra A Todas a palavras que terminem com a letra A Todas a palavras que tenham a letra A em qualquer posio String de dois caracteres que tenha a primeira letra A String de dois caracteres que tenha o ltimo caractere letra A String de trs caracteres cuja segunda letra seja A Todas as palavras que tenham a letra A na penltima posio Todas as palavras que tenha a letra A na segunda posio

Exemplos: SELECT * FROM autor WHERE aut_nome LIKE 'R%'; SELECT * FROM gravadora WHERE grav_nome LIKE '_o%'; Um problema que pode surgir quando queremos fazer buscas utilizando os caracteres de substituio t-los na cadeia de caracteres que est sendo pesquisada. Neste caso devemos usar um caractere especial denominado ESCAPE. Exemplo: SELECT * FROM cd WHERE cd_nome LIKE '%\_%'ESCAPE '\'; IN Permite comparar o valor de uma coluna com um conjunto de valores. Utilizamos para substituir uma srie de comparaes seguidas da clusula OR. Exemplo: SELECT * FROM I WHERE aut_id IN (1, 3) ; Sua maior utilizao so em subquerys (ser visto posteriormente).

4.2. EXERCCIOS
a) Liste todos os campos e linhas da tabela GRAVADORA;
39

PESQUISA BSICA EM T ABELAS

b) Liste todas as linhas dos campos CD_ID, CD_NOME, CD_PRECO da tabela CD; c) Liste todas as linhas dos campos AUT_ID, AUT_NOME da tabela AUTOR em ordem alfabtica; d) Repita o comando anterior em ordem alfabtica decrescente; e) Liste todos os CDs da gravadora 3; f) Liste as colunas CD_NOME, CD_PRECO dos CDs cujos preos de venda sejam inferiores a 20,00 e sejam da GRAVADORA 3; g) Liste as colunas da tabela gravadora cujo GRAV_CONTATO seja nulo; h) Repita o comando anterior desta vez listando GRAV_CONTADO no nulo; i) j) Liste os CDs cujos CD_PRECO esteja entre 15,00 e 30,00; Liste todos os CDs cuja CD_DT_LANCAMENTO seja posterior ao ano 01/01/2000;

k) Liste as MUSICAS cujo nome comece com A da tabela MUSICA; l) Liste os CDs cuja segunda letra do CD_NOME seja a letra E;

m) Liste os CDs que possuam a letra O em qualquer posio do CD_NOME; n) Liste os CDs que possuam CD_PRECO inferior a 30,00 em ordem decrescente de CD_DT_LANCAMENTO; o) Liste as msicas cuja MUS_ID seja 1, 3, 5;

40

CLCULOS E FUNES USUAIS

5
Parte
CLCULOS E FUNES USUAIS

m recurso bastante til e importante de SQL a possibilidade de se realizar clculos e totalizaes de valores unitrios. Podemos realizar clculos quando realizamos buscas no banco de dados simplesmente aplicando um dos operadores aritmticos a coluna.

Exemplo: Um aumento de 5% em todos os CDs: SELECT cd_id, cd_nome, cd_preco, preco_venda * 1.05 FROM cd; Em alguns Sistemas Gerenciadores de Banco de Dados existem outras funes alm das aritmticas, como a funo POWER do Oracle e Sysbase que permite calcular exponenciao.

5.1 OPERADORES
Estes so os operadores utilizados no SQL: OPERADOR + * / SIGNIFICADO Soma Subtrao Multiplicao Diviso

A precedncia igual a da matemtica, ou seja, a multiplicao e a diviso tm prioridade sobre a soma e subtrao. Para alterar a prioridade deve-se utilizar parnteses (Operao). Exemplo: 15 / 5 * 3, Resultado = 9 15 / (5 * 3), Resultado = 1 SELECT cd_id, cd_nome, cd_preco - (cd_preco * 0.10) FROM cd

41

CLCULOS E FUNES USUAIS

5.1.1. CHARACTER_LENGTH / LENGTH Retorna o nmero de caracteres contidos em uma cadeia de caracteres. Esta funo no existe em todos os SGBD, como acontece no Firebird. Exemplo: SELECT CHARACTER_LENGTH (Renato Russo); SELECT CHARACTER_LENGTH (cd_nome) FROM cd WHERE cd_id = 10; 5.1.2. Alfanumricos Em SQL possvel concatenar alfanumricos e existem algumas funes para manipul-los. Para concatenar caracteres, utiliza-se dois pipes ( || ). Exemplo: SELECT grav_id || ' - ' || grav_contato FROM gravadora;

5.1.3. UPPER e LOWER Ao realizar buscas alfanumricas no banco de dados notamos que os parmetros so case sensitives. Assim sendo, possvel usar os comandos UPPER E LOWER para transformar a cadeia de caracteres para maisculo e/ou minsculo. Exemplo: SELECT * FROM autor WHERE UPPER(aut_nome) = RENATO RUSSO; SELECT UPPER(aut_nome) FROM autor; 5.1.4. SUBSTRING Essa funo requisito para SQL-92 ao nvel intermedirio. Retorna uma parte da cadeia de caracteres. Exemplo: SELECT SUBSTRING(aut_nome from 1 FOR 3), aut_nome FROM autor; 5.1.5. Manipulao de Datas Em colunas do tipo data podemos realizar uma srie de clculos e operaes cronolgicas, como calcular o nmero de dias entre duas datas, somar, subtrair dias, meses etc. O padro especifica 04 (quatro) tipos de dados relacionados data e hora:
42

CLCULOS E FUNES USUAIS

Tipo Date Time Timestamp Interval

Descrio Apenas data Apenas Hora Data/Hora Intervalo entre dois tipos

O padro SQL definiu algumas funes acrescentando CURRENT_: - CURRENT_DATE - CURRENT_TIME - CURRENT_TIMESTAMP Exemplos: SELECT * FROM cd WHERE cd_dt_lancamento = CURRENT_DATE; Para saber a quantidade de dias que j se passaram depois do lanamento do CD usaramos o comando: SELECT CURRENT_DATE, cd_dt_lancamento, (CURRENT_DATE cd_dt_lancamento) FROM cd Adicionar dias em uma data: SELECT cd_dt_lancamento + 7 FROM cd; SELECT cd_dt_lancamento + INTERVAL 7 DAY FROM cd; 5.1.6. EXTRACT Essa funo extrai e retorna um valor de um campo do tipo data. possvel extrair apenas o dia, o ms, o ano, a hora, etc. Exemplo: SELECT cd_dt_lancamento, EXTRACT(MONTH FROM cd_dt_lancamento) FROM cd; SELECT cd_dt_lancamento, EXTRACT(DAY FROM cd_dt_lancamento) FROM cd; Caso seja necessrio realizar a concatenao de dados do tipo DATE necessrio utilizar o comando CAST para converter o tipo do dado para um tipo STRING.

SELECT cd_dt_lancamento, CAST(EXTRACT(MONTH FROM


43

CLCULOS E FUNES USUAIS

cd_dt_lancamento) AS VARCHAR) ||'/'|| CAST(EXTRACT(DAY FROM cd_dt_lancamento) AS VARCHAR) FROM cd;

5.2. EXERCCIOS
a. Monte uma pesquisa que mostre a data atual. b. Escreva uma busca que mostre CD_NOME, CD_PRECO e CD_PRECO com 20% de aumento. c. Escreva uma busca igual anterior, porm acrescente uma coluna mostrando a diferena entre o CD_PRECO e CD_PRECO com 20% de aumento. d. Escreva uma busca que mostre GRAV_NOME, GRAV_CONTATO em uma nica coluna separados por um hfen. e. Escreva uma busca que mostre todos os autores que tenham a letra A no nome. f. Escreva uma busca que mostre a primeira letra da MUS_NOME e a MUS_DURACAO da tabela msica. g. Escreva uma busca que mostre o CD_NOME e o nmero de dias entre a data atual e a data de lanamento. h. Escreva uma busca semelhante anterior que mostre uma coluna com 15 dias aps a CD_DT_LANCAMENTO. i. Escreva uma busca que retorne o ano de lanamento do CD_ID = 1, 2 e 3; j. Escreva uma consulta que retorne os 05 primeiro caracteres de MUS_NOME e outra coluna com MUS_NOME.

44

PESQUISA EM MLTIPLAS T ABELAS

6
Parte
PESQUISA EM MLTIPLAS TABELAS

os captulos anteriores as pesquisas foram realizadas em apenas uma tabela. No entanto, observamos no modelo criado, assim como acontece sempre, que uma tabela est relacionada outra, sendo necessrio extrair informaes de duas ou mais tabelas relacionadas ao mesmo tempo. Esta tarefa recebe o nome de unio ou juno de tabelas. Isso se d por meio das chaves primrias e chaves estrangeiras, que so no modelo fsico as colunas que as tabelas tm em comum. Para os exemplos utilizados nesta aula fundamental fazer uso do Modelo Lgico para melhor visualizar os relacionamentos.

Figura 16 - Modelo Lgico de Dados

45

PESQUISA EM MLTIPLAS T ABELAS

6.1. ALIAS
Ao realizar pesquisa em diversas tabelas so referenciadas colunas pertencentes s tabelas da relao. Dessa forma, necessrio distinguir a qual tabela pertence dada coluna. Podemos fazer isso de duas formas: a) Colocando o nome da tabela na frente do nome da coluna. Sintaxe: SELECT tabela.coluna FROM tabela; b) Utilizando um alias ou apelido para a tabela e colocando-o na frente da coluna. Sintaxe: SELECT t.coluna FROM tabela t; ainda possvel usar alias em nome de colunas, fazendo uso da clusula AS; Sintaxe: SELECT coluna AS nome_desejado FROM tabela;

6.2. UNIO DE TABELAS


Para realizar a unio de tabelas basta acrescentar aps a clusula FROM do comando SELECT as tabelas que queremos unir utilizando aps a clusula WHERE a condio de unio entre elas (Chave Primria e Chave Estrangeira). Sintaxe: SELECT [tabela1.]coluna [, [tabela2.]coluna, ...] FROM tabela1, tabela2 [, ...] WHERE tabela1.PK = tabela2.FK Uma prtica recomendvel utilizar o mesmo nome nos campos de chave primria e chave estrangeira, pois dessa forma facilita a identificao dos campos ao realizar a unio das tabelas. possvel colocar diversas tabelas na clusula FROM. No devemos esquecer, porm, que necessrio especificar as chaves primrias e chaves estrangeiras de cada relacionamento. Em caso de dvidas, consulte o Modelo de Dados para estabelecer quais so as colunas comuns entre as tabelas. Da a importncia de se ter um bom projeto de Banco de Dados claro e preciso. A clusula WHERE deve conter todo canal de relacionamento entre as tabelas listadas na clusula FROM sob pena de ocorrer o Produto Cartesiano.

46

PESQUISA EM MLTIPLAS T ABELAS

6.3. PRODUTO CARTESIANO


Ocorrer um produto cartesiano sempre que: - A condio de unio entre as tabelas for omitida (no houver clusula WHERE); - Condio de unio entre as tabelas for invlida (clusula WHERE incorreta); - Todas as linhas da primeira tabela estiverem unidas a todas as linhas da segunda tabela. - Nesta situao, as linhas da primeira tabela sero combinadas com as linhas da segunda, demonstrando um resultado na maior parte das vezes indesejado. - Esse procedimento muito utilizado para efetuar testes de performance no banco devido a grande quantidade dedados. Exemplo: SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome FROM gravadora, cd Ao invs de se mostrar todos os dados, deseja-se visualizar os CDs e suas respectivas gravadoras. Emprega-se ento, a Unio entre tabelas. Exemplo: SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome FROM gravadora, cd WHERE cd.grav_id = gravadora.grav_id Usando alias: SELECT c.cd_id, c.cd_nome, g.grav_nome FROM gravadora g, cd c WHERE c.grav_id = g.grav_id

6.4. UNIO REGULAR (INNER JOIN OU EQUI-JOIN)


Denomina-se unio regular as unies que tm a clusula WHERE unindo chave primria e chave estrangeira como visto anteriormente. O padro determina uma sintaxe alternativa para esse comando. Quando a chave primria e a chave estrangeira tm o mesmo nome em ambas as tabelas possvel simplificar o comando usando o comando NATURAL JOIN. Exemplo: SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome FROM cd NATURAL JOIN gravadora; Outras duas maneiras definidas no padro SQL determinar qual(is) coluna(s) utilizar na unio usando a clusula USING e caso o nome das colunas no sejam iguais, determinar quais so as colunas com a clusula ON. Ambas produzindo o mesmo efeito.
47

PESQUISA EM MLTIPLAS T ABELAS

Exemplo: SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome FROM cd JOIN gravadora USING (grav_id); SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome FROM cd JOIN gravadora ON gravadora.grav_id = cd.grav_id;

6.5. UNIO DE M AIS DE DUAS TABELAS


Freqentemente necessrio unir mais de duas tabelas para obter uma informao consistente. Suponha que queira saber o nome da msica, a faixa e o nome do CD em que est a msica. No modelo de dados observamos a necessidade de se consultar trs tabelas no Banco de Dados. Exemplo: SELECT c.cd_nome, f.fai_numero, m.mus_nome FROM cd c, faixa f, musica m WHERE c.cd_id = f.cd_id AND m.mus_id = f.mus_id O cdigo abaixo produziria o mesmo efeito: SELECT c.cd_nome, f.fai_numero, m.mus_nome FROM faixa f INNER JOIN cd c ON c.cd_id = f.cd_id INNER JOIN musica m ON m.mus_id = f.mus_id Observe que possvel realizar a unio de tantas tabelas quanto forem necessrias. SELECT a.aut_nome, g.grav_nome FROM autor a, cd c, gravadora g, faixa f, musica_autor ma, musica m WHERE a.aut_id = ma.aut_id AND m.mus_id = ma.mus_id AND m.mus_id = f.mus_id AND c.cd_id = f.mus_id AND g.grav_id = c.grav_id

6.6. UNIES EXTERNAS (OUTER-JOIN)


Observa-se na unio entre tabelas que quando uma linha no satisfaz a condio de unio entre as tabelas, ela no ser mostrada no resultado da busca. Isto acontece porque o banco de dados, no podendo estabelecer a relao entre as colunas que esto sendo unidas na busca, coloca NULL onde o dado no existe.

48

PESQUISA EM MLTIPLAS T ABELAS

Exemplo: SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome FROM gravadora, cd WHERE cd.grav_id = gravadora.grav_id No resultado observamos que alguns dados de gravadora so omitidos. Define-se Unio Externa como aquela que inclui linhas no resultado da busca mesmo que no haja relao entre as duas tabelas. Para que os dados omitidos sejam mostrados utilizaremos o comando SELECT utilizando Unio Externa. 6.6.1. Unio Externa Esquerda (Left Outer-Join) Como o nome diz, a unio pela esquerda incluir todas as linhas da primeira tabela na expresso, ou seja a tabela da esquerda ser a tabela base para a unio. Observe esse comando e depois inverta a posio das tabelas GRAVADORA e CD. Exemplo: SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome FROM gravadora LEFT OUTER JOIN cd ON (gravadora.grav_id = cd.grav_id) Neste caso, todas as gravadoras so mostradas independente de haver ou no dados relacionados na tabela CD. 6.6.2. Unio Externa Direita (Right Outer-join) Ao contrrio da anterior, a unio realizada pela direita, pois incluir todas as linhas da tabela da direita na expresso da unio, ou seja a tabela da direita ser a tabela base para a unio. Exemplo: SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome FROM gravadora RIGHT OUTER JOIN cd ON (gravadora.grav_id = cd.grav_id) NOTA: Se a tabela da referncia (direita ou esquerda) for a que contm a chave estrangeira, ocorrer uma unio regular entre as tabelas. 6.6.3. Unio Externa Total (Full Outer-join) Realiza uma unio independente da coluna opcional estar direita ou esquerda. Neste caso, so geradas linhas que no existem em uma ou em ambas as tabelas.

49

PESQUISA EM MLTIPLAS T ABELAS

Exemplo: SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome FROM gravadora FULL OUTER JOIN cd ON (gravadora.grav_id = cd.grav_id) Neste caso a consulta age como uma unio externa a direita ou a esquerda por no haver campos nulos na coluna de chave estrangeira de CD.

6.7. EXERCCIOS
a. Faa uma busca que mostre todos os CDs e o nome de suas respectivas gravadoras. b. Faa uma pesquisa que mostre o produto cartesiano das tabelas MUSICA e CD. c. Realize uma consulta se utilizando da sintaxe JOIN que mostre todas MUSICAS e o nome de seus respectivos CDs. d. Crie uma pesquisa que retorne como resultado todas as gravadoras e seus respectivos CDs mesmo que estes no possuam CDs associados. e. Crie uma pesquisa que mostre o AUTOR e suas MUSICAS ordenadas por AUTOR. f. Acrescente a pesquisa anterior o nome do CD que foi gravado a msica. g. Crie uma pesquisa que mostre em quais gravadoras os autores tem realizado suas gravaes.

50

FUNES DE GRUPO E AGRUPAMENTO

7
Parte
FUNES DE GRUPO E AGRUPAMENTO

t agora trabalhamos com funes que tratavam apenas de uma linha. Contudo, em diversas situaes necessrio trabalhar com vrias linhas da consulta. Dessa forma, necessrio conhecer funes especiais denominadas funes de grupo e agrupamento.

7.1. FUNES DE GRUPO


Funes de grupo operam conjuntos de linhas visando a fornecer um resultado para o grupo. Estes grupos podem ser constitudos desde toda a tabela at subgrupos da tabela. Existem diversas funes de grupo que so implementadas pelo padro SQL. As principais funes so: FUNO COUNT SUM AVG MIN MAX STDDEV VARIANCE 7.1.1. COUNT Diferente das outras funes de grupo, o COUNT retorna o nmero de linhas que atende a uma determinada condio. Podemos utiliz-lo com um asterisco entre parnteses, para indicar que queremos saber a quantidade total de linhas independente de haver linhas com colunas nulas ou no. Exemplos: SELECT COUNT(*) FROM gravadora; SELECT COUNT(grav_contato) FROM gravadora; Efeito semelhante pode ser conseguido com o seguinte comando: DESCRIO Retorna nmero de linhas afetadas pelo comando. Retorna o somatrio do valor das colunas especificadas Retorna a mdia aritmtica dos valores das colunas Retorna o menor valor da coluna de um grupo de linhas Retorna o maior valor da coluna de um grupo de linhas Retorna o desvio-padro da coluna Retorna a varincia da coluna

51

FUNES DE GRUPO E AGRUPAMENTO

Exemplos: SELECT COUNT(grav_contato) FROM gravadora WHERE grav_contato IS NOT NULL; Diferente de: SELECT COUNT(*) FROM gravadora WHERE grav_contato IS NULL; Outra maneira utilizando o comando DISTINCT. Observe a diferena entre os dois comandos: Exemplos: SELECT COUNT(DISTINCT aut_id) FROM musica_autor; SELECT COUNT(aut_id) FROM musica_autor; 7.1.2. SUM Retorna o valor total de uma determinada coluna em um determinado grupo de linhas. Assim se quisermos saber o total do preo de venda dos CDs, utilizamos o comando: Exemplo: SELECT SUM(cd_preco) FROM cd; possvel realizar clculos baseados na somatria ou mesmo incluir outras colunas e operaes no comando. Exemplo: SELECT SUM(cd_preco) * 1.2 FROM cd; 7.1.3. AVG Extrai a mdia aritmtica de um determinado grupo de linhas. Para saber o preo mdio dos CDs da loja execute o seguinte comando: Exemplo: SELECT AVG(cd_preco) FROM cd;

52

FUNES DE GRUPO E AGRUPAMENTO

7.1.4. MIN Retorna o menor valor de uma coluna em um grupo de linhas. Podemos utiliz-la em colunas do tipo data ou alfanumricas. Para saber o preo de venda do CD mais barato execute o seguinte comando: Exemplos: SELECT MIN(cd_preco) FROM cd; SELECT MIN(cd_dt_lancamento) FROM cd; SELECT MIN(cd_nome) FROM cd; 7.1.5. MAX Retorna o maior valor de uma coluna em um grupo de linhas. Podemos utiliz-la em colunas do tipo data ou alfanumricas. Para saber o preo de venda do CD mais caro execute o seguinte comando: Exemplos: SELECT MAX(cd_preco) FROM cd; SELECT MAX(cd_dt_lancamento) FROM cd; SELECT MAX(cd_nome) FROM cd; 7.1.6. STDDEV (No funciona em alguns bancos de dados.) Retorna o desvio padro de uma determinada coluna. Para saber o desvio padro dos preos de venda dos CDs da loja execute o seguinte comando: Exemplo: SELECT STDDEV(cd_preco) FROM cd; 7.1.7. VARIANCE (No funciona em alguns bancos de dados.) Retorna a varincia de uma determinada coluna.

53

FUNES DE GRUPO E AGRUPAMENTO

Para saber a varincia do preo de venda dos CDs da loja execute o seguinte comando: Exemplo: SELECT VARIANCE(cd_preco) FROM cd;

7.2. AGRUPANDO RESULTADOS


possvel agrupar valores com base em determinadas colunas. Desta forma, estaremos trabalhando um pequeno grupo de dados. Para isso usamos a clusula GROUP BY. 7.2.1. GROUP BY O comando GROUP BY deve vir antes da clusula ORDER BY e depois do WHERE (se houver necessidade de utiliz-lo). utilizado com uma funo de grupo (COUNT, SUM, AVG, MIN ou MAX). Para saber quantas msicas h em cada CD: Exemplo: SELECT cd_id, COUNT(*) FROM faixa GROUP BY cd_id; Para o preo mdio de venda de cada CD agrupado por gravadora: Exemplo: SELECT grav_id, AVG(cd_preco) FROM cd GROUP BY grav_id; possvel realizar mais de uma funo de grupo dentro de um mesmo SELECT. Neste exemplo, alm do preo de venda, temos a quantidade de CDs de cada gravadora: Exemplo: SELECT grav_id, AVG(cd_preco), COUNT(*) FROM cd GROUP BY grav_id;

7.3. AGRUPAMENTOS COM MAIS DE UMA TABELA


Podemos unir mais de uma tabela com as regras j citadas.

54

FUNES DE GRUPO E AGRUPAMENTO

Exemplo: SELECT c.grav_id, g.grav_nome, AVG(c.cd_preco) FROM cd c, gravadora g WHERE c. grav_id = g.grav_id GROUP BY c.grav_id, g.grav_nome NOTA necessrio colocar todas as colunas que fazem parte do comando SELECT na clusula GROUP BY. Caso se deseje ordenar o resultado, basta acrescentar o comando ORDER BY no final do comando aps o comando GROUP BY: Exemplo: SELECT c.grav_id, g.grav_nome, AVG(c.cd_preco) FROM cd c, gravadora g WHERE c. grav_id = g.grav_id GROUP BY c.grav_id, g.grav_nome ORDER BY g.grav_nome desc

7.4. RESTRINGINDO O RESULTADO


Em algumas situaes os dados agrupados podem ser restringidos ou filtrados. At agora vimos que toda tabela era afetada pelo comando GROUP BY. Contudo, nem sempre isso desejvel. Para isso podemos utilizar a clusula WHERE em conjunto com GROUP BY ou utilizar a clusula HAVING. Retornar o total de autores agrupados por MUS_ID sendo este menor que 3: Exemplo: SELECT mus_id, COUNT(*) FROM musica_autor WHERE mus_id < 3 GROUP BY mus_id; ou SELECT mus_id, COUNT(*) FROM musica_autor GROUP BY mus_id HAVING mus_id < 3; NOTE BEM Usando o filtro da clusula WHERE as linhas so filtradas antes do agrupamento; Usando HAVING, as linhas so filtradas depois do agrupamento. A nica restrio que a clusula HAVING s pode usar as colunas que fazem parte do GROUP BY. Para o WHERE isso no acontece. Nunca use na clusula WHERE uma funo de grupo para filtrar os grupos. Dessa forma, o comando abaixo invlido:
55

FUNES DE GRUPO E AGRUPAMENTO

Exemplos: SELECT GRAV_ID, AVG(cd_preco) FROM cd WHERE AVG(cd_preco) > 12 GROUP BY grav_id A forma correta seria: SELECT grav_id, AVG(cd_preco) FROM cd GROUP BY grav_id HAVING AVG(cd_preco) > 12

7.5. EXERCCIOS
a. Verifique o maior e menor valor entre os preos de venda dos CDs. b. Verifique a diferena entre o maior e menor valor dos preos de venda dos CDs. c. Verifique a quantidade de dias compreendidos entre a data mais atual e a data mais antiga das datas de lanamento dos CDs; d. Mostre atravs de uma consulta o tempo total do CD 1 (cd_id = 1); e. Mostre atravs de uma consulta a mdia de durao das msicas cujo nome comece com a letra A; f. Faa uma consulta que retorne a quantidade de CDs cadastrados. g. Faa uma consulta que retorne a o nome do CD e a mdia de durao das msicas em cada CD, desde que esta mdia no seja superior a 4. h. Faa uma consulta que retorne os autores que so autores de mais de uma msica.

56

SUBCONSULTAS

8
Parte
SUBCONSULTAS SUBQUERIES

as sesses anteriores exploramos largamente o comando SELECT utilizando-o em conjunto com uma gama de funes. Ainda neste contexto, possvel incluir subconsultas dentro das consultas principais.

8.1. SUBQUERY
As subqueries fazem parte do padro SQL-86 logo, todos os bancos de dados relacionais que utilizam SQL devem permitir essa utilizao. Sintaxe: SELECT colunas FROM tabela WHERE expresso operador (SELECT colunas FROM tabela WHERE ...) H trs tipos de subquery: a) Subquery de uma linha: o retorno do SELECT interno ser uma nica linha. b) Subquery de mltiplas linhas: o retorno do SELECT interno ser mais de uma linha. c) Subquery de mltiplas colunas: o retorno do SELECT interno ser conter mais de uma linha e coluna. 8.1.1. Subquery de uma linha Neste caso, primeiro realizada a busca em uma tabela e, com base no resultado, pesquisada a outra tabela. Exemplo: SELECT cd_nome, cd_preco FROM cd WHERE cd_preco > (SELECT AVG(cd_preco) FROM cd) Acima utilizada uma subquery para verificar a mdia de preo dos CDs e, com base nesse resultado, extrado o resultado da busca do primeiro SELECT.

57

SUBCONSULTAS

Exemplo: SELECT grav_id, cd_nome, cd_preco FROM cd c WHERE cd_preco > (SELECT AVG(cd_preco) FROM cd WHERE grav_id = c.grav_id) Acima so buscados apenas os CDs que tenham preo de venda superior a mdia da prpria gravadora. Muito cuidado ao usar essa construo, porque ele tende a consumir muito recurso do banco de dados, pois a cada linha do primeiro SELECT ser extrado a mdia no segundo SELECT. Assim necessrio saber qual a gravadora do primeiro SELECT, para poder calcular o segundo SELECT. NOTA - Coloque as subqueries entre parnteses. - Coloque a subquery direita do operador. - No use a clusula ORDER BY em uma subquery. Se for necessrio ordenar faa-o no SELECT principal. - Use operadores de grupo apenas em buscas que potencialmente retornem mais de uma linha. - Use operadores de linha apenas em buscas que retornem uma nica linha. Exemplo: SELECT grav_id, cd_nome, cd_preco FROM cd WHERE grav_id = (SELECT grav_id FROM cd WHERE cd_id = 2) AND cd_preco > (SELECT cd_preco FROM cd WHERE cd_id = 5);

8.1.1.1. SUBQUERY EM CLUSULA HAVING A utilizao semelhante a clusula WHERE. A subquery ser executada primeiro e o resultado da busca servir de base para filtrar as linhas do GROUP BY. Exemplos: SELECT grav_id, MIN(cd_preco) FROM cd GROUP BY grav_id HAVING MIN(cd_preco) > (SELECT cd_preco FROM cd WHERE cd_id = 2) SELECT grav_id, MAX(cd_preco) FROM cd c GROUP BY grav_id HAVING MAX(cd_preco) > (SELECT AVG(cd_preco) FROM cd WHERE grav_id = c.grav_id)

58

SUBCONSULTAS

8.1.1.2. COMANDO EXISTS Verifica o nmero de linhas retornadas pela subquery. Caso contenha uma ou mais linhas, ento o resultado ser mostrado. Exemplo: SELECT grav_id, grav_nome FROM gravadora WHERE EXISTS (SELECT * FROM cd WHERE cd.grav_id = gravadora.grav_id) Note que quando se est utilizando esse operador, no importa o que o comando SELECT interno ir buscar. Interessa apenas se ele retorna ou no linhas, Por esse motivo usado o * em vez de uma coluna em especial. 8.1.2. Subquery de mltiplas linhas Neste caso o SELECT interno retorna mais de uma linha. No possvel utilizar operadores simples como igualdade, diferena, maior ou menor. Utilizam-se operadores de grupo para realizar a comparao, como: - ANY - ALL - IN 8.1.2.1. IN Imagine que queremos saber quais CDs tm o preo igual ao menor preo de cada gravadora. Inicialmente devemos saber qual o menor preo de cada gravadora. SELECT MIN(cd_preco) FROM cd GROUP BY grav_id Para saber quais so os CDs escreveramos o seguinte comando: SELECT cd_id, cd_nome, cd_preco FROM cd WHERE cd_preco IN (19, 23, 11) Para fazer isso em um nico comando, escreveramos o comando da seguinte forma: SELECT cd_id, cd_nome, cd_preco FROM cd WHERE cd_preco IN (SELECT MIN(cd_preco) FROM cd GROUP BY grav_id)

59

SUBCONSULTAS

8.1.2.2. ANY (Compara com qualquer valor) Esse operador permite comparar operadores simples (=,<,>,!=) com um grupo de linhas. Imagine que desejamos saber quais CDs tm preo inferior a qualquer outro da gravadora com cdigo 2, mas que no sejam da gravadora 2. Inicialmente preciso saber qual o preo de venda de cada CD que no seja da gravadora 2: SELECT cd_id, cd_nome, cd_preco FROM cd WHERE grav_id != 2 Depois precisamos saber quais os preos dos CDs da gravadora 2 com o comando da seguinte forma: SELECT cd_preco FROM cd WHERE grav_id = 2 Agora realizamos a pesquisa na tabela de CD para comparar os preos inferiores a esses: SELECT cd_id, cd_nome, cd_preco FROM cd WHERE cd_preco < ANY (SELECT cd_preco FROM cd WHERE grav_id = 2) AND grav_id != 2 8.1.2.3. ALL Esse operador usado em combinao com operadores simples (<,>) para que os valores retornados de todas as linhas do SELECT interno sejam comparados com o SELECT externo. Imagine que queiramos saber quais CDs tm o preo de venda menor que a mdia de preo de venda de todas as gravadoras. Inicialmente necessrio saber a mdia de preos por gravadora: SELECT AVG(cd_preco) FROM cd GROUP BY grav_id; Depois verificamos quais so os CDs com preo inferior a todos anteriores. SELECT cd_id, cd_nome, cd_preco FROM cd WHERE cd_preco < ALL (SELECT AVG(cd_preco) FROM cd GROUP BY grav_id)

60

SUBCONSULTAS

8.1.3. Subquery de mltiplas colunas A tcnica consiste em colocar as colunas unidas na clusula WHERE do SELECT externo e realizar a busca no SELECT interno dessas colunas unidas da mesma forma. Essa tcnica tende a ser muito lenta, mas pode ser feita em qualquer banco de dados. Temos vrios CDs indicados no cadastro e queremos conhecer os dados do CD dentre os menores CDs indicados de cada gravadora. Para isso temos que saber o menor CD indicado de cada gravadora. Utilizamos o || para unir as colunas. Exemplo: SELECT grav_id || cast(MIN(cd_indicado) as varchar) FROM cd GROUP BY grav_id Agora realizamos a busca dos dados que atendem essas caractersticas: SELECT cd_id, cd_nome, grav_id, cd_indicado FROM cd WHERE (grav_id || cast (cd_indicado as varchar)) IN (SELECT grav_id || cast(MIN(cd_indicado) as varchar) FROM cd GROUP BY grav_id) Outra tcnica consiste em colocar as colunas de busca entre parnteses no SELECT externo, entretanto no est disponvel em alguns bancos de dados. Exemplo: SELECT cd_id, cd_nome, grav_id, cd_indicado FROM cd WHERE (grav_id, cd_indicado) IN (SELECT grav_id, MIN(cd_indicado) FROM cd GROUP BY grav_id) NOTA: Quando um SELECT interno contiver valores nulos, no deve ser utilizado NOT IN como operador de comparao. Isso porque qualquer comparao com nulo retorna nulo.

8.1.4. Subquery na Clusula FROM Podemos utilizar uma subquery na clusula FROM de um comando SELECT. Essa estrutura no est disponvel para todos os bancos de dados, mas faz parte do padro SQL. Sua utilizao muito parecida com as vises (Views). Imagine que queremos extrair o nome do CD, seu preo e o preo mdio da gravadora, e o preo mdio da gravadora extrado por uma subquery na prpria clusula FROM:

61

SUBCONSULTAS

Exemplo: SELECT a.cd_nome, a.cd_preco, b.preco_medio FROM cd a, (SELECT grav_id, AVG(cd_preco) as preco_medio FROM cd GROUP BY grav_id) b WHERE a.grav_id = b.grav_id AND a.cd_preco > b.preco_medio Veja que foi substituda a segunda tabela por um comando SELECT e que a tabela recebeu o apelido de b.

8.2. EXERCCIOS
a) Faa uma lista de CDs usando subquery que foram gravados pela gravadora 2. b) Faa uma lista que mostre os CDs que custam mais que a mdia de preo dos CDs gravados pela gravadora 1. c) Faa uma consulta usando a clusula HAVING que retorne o CD mais barato que a mdia de preo dos CDs. d) Faa uma lista que mostre os CDs cujas msicas tem durao maior que 00:02:00. e) Faa uma lista que mostre quais CDs tem preos superiores a qualquer CD da gravadora 1 excluindo os da prpria gravadora 1.

62

VISES/VIEW

9
Parte
VISES/VIEW

nteriormente aprendemos a criar consultas em bancos de dados com a linguagem SQL usando uma srie de funes que permitem a extrao dos dados de diversas formas. Nesta sesso veremos a utilizao de vises (Views), tambm chamadas de tabelas virtuais em sistemas de bancos de dados. As views so um modo especial de enxergar dados de uma ou vrias tabelas. um objeto de banco de dados criado a partir de um comando SELECT. importante saber que ela armazenada no dicionrio de dados e possui a mesma estrutura de uma tabela. As views permitem restringir o acesso aos dados, por exemplo, utilizando o comando SELECT podemos filtrar linhas e coluna que no devam ser mostradas a todos os usurios. As buscas complexas tornam-se simples, pois ao DBA possvel criar consultas complexas em forma de vises e ao usurio realizar as buscas necessrias nessa viso. Outro aspecto a independncia de dados: as vises podem ser criadas visando atender necessidades genricas e no apenas s relacionadas a pessoa ou programas. Podemos buscar dados em diversas tabelas. A eliminao de cdigos outra razo: normalmente os cdigos no devem ser mostrados aos usurios, pois so utilizados apenas para estabelecer relacionamento entre as tabelas. Dessa forma facilita a compreenso dos dados pelo usurio.

9.1. CLASSIFICAO
As vises podem ser classificadas de duas formas: a) Simples: - Os dados so extrados de uma nica tabela; - No contm funes. - No possuem dados agrupados. - Podem utilizar comandos DML para manipular os dados. b) Complexas: - Os dados so extrados de vrias tabelas. - Podem conter funes. - Podem conter dados agrupados. - No podem utilizar comandos DML para manipulao de dados, exceto no Oracle, pois possui recursos especficos para isso.

63

VISES/VIEW

9.2. CRIAO DA VISO


Para criar uma viso, utilizamos o comando CREATE VIEW: Sintaxe: CREATE VIEW nome AS query/subquery Exemplo: CREATE VIEW vCD AS SELECT cd_id, cd_nome, cd_preco FROM cd; Como visto anteriormente esta uma viso simples. Como uma viso sempre baseada em um comando SELECT, podemos criar vises extremamente complexas. Exemplos: CREATE VIEW vPRECO_CD AS SELECT grav_id, cd_nome, cd_preco FROM cd WHERE grav_id = (SELECT grav_id FROM cd WHERE cd_preco > 10.00) CREATE VIEW vCD_FAIXA AS SELECT cd_id, item_faixa FROM item_cd WHERE mus_id IN (SELECT mus_id FROM musica WHERE UPPER(mus_nome) LIKE %A) CREATE VIEW VGRAV_MAX AS SELECT grav_id, cd_preco FROM cd a WHERE cd_preco > (SELECT AVG(cd_preco) FROM cd WHERE grav_id = a.grav_id)

9.3. BUSCANDO CONTEDO DE VISES


Utilizamos o comando SELECT para buscar o contedo de vises exatamente como fazemos com qualquer tabela. Exemplo: SELECT * FROM vCD; SELECT * FROM vCD_FAIXA; Podemos, ainda, incluir qualquer outra clusula do comando SELECT, mesmo em pesquisa realizadas em vises.

64

VISES/VIEW

Exemplo: SELECT * FROM VPRECO_CD WHERE cd_preco > 8;

9.4. UTILIZAO DE COMANDOS DML EM VISES


Somente em vises simples possvel utilizar comandos DDL. O padro SQL determina as condies em que uma viso pode ser atualizada: - Deve ser criada em uma nica tabela; - Deve conter apenas um SELECT; - Se foi criada com base em outra viso, a primeira viso dever ser passvel de atualizao; - O comando SELECT no pode conter colunas calculadas; - No deve utilizar GROUP BY; - No deve conter a clusula DISTINCT; - Pode conter uma subquery, desde que o SELECT interno tenha como base a mesma tabela do SELECT externo; - Incluses s podem ser feitas caso a viso contenha a chave primria da tabela base. - Excluses e alteraes em vises sem a chave primria da tabela base so permitidas, porm desaconselhveis, pois no se sabe ao certo o resultado que pode aparecer. Isso chamado de Materializao de Views.

9.5. EXCLUINDO UMA VISO


Para excluir uma viso, utilizamos o comando DROP VIEW; Ao excluir uma viso no estamos excluindo os dados (linhas e colunas), visto que apenas uma tabela virtual. Sintaxe: DROP VIEW nome; Exemplo: DROP VIEW vCD;

9.6. EXERCCIOS
a) Crie uma viso que mostre uma lista de CDs que foram gravados pela gravadora 2. b) Crie uma viso que mostre os CDs e suas respectivas gravadoras. c) Crie uma viso que mostre as msicas e seus respectivos autores. d) Construa uma viso que mostre as msicas sua durao e a que CD pertence. e) Construa uma viso que mostre os autores e em quais gravadoras possuem CD gravado.
65

PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES

10
Parte
PROCEDIMENTOS ARMAZENADOS
m muitas situaes ser necessrio armazenar procedimentos escritos com a finalidade de se utilizar recursos como loop, estruturas de deciso, etc. Para isso, utiliza-se os procedimentos armazenados o qual definimos como um programa escrito em uma linguagem prpria que armazenado como parte do banco de dados. Em outras palavras Procedimento Armazenado ou Stored Procedure uma coleo de comandos em SQL disponveis em Banco de dados. Encapsula tarefas repetitivas, aceita parmetros de entrada e retorna um valor de status (para indicar aceitao ou falha na execuo). O procedimento armazenado pode reduzir o trfego na rede, melhorar a performance, criar mecanismos de segurana, etc. (Wikipdia, a enciclopdia livre, 2009).

10.1. VANTAGENS DO USO DE STORED PROCEDURES


- Reduo de trfico de rede. - Aumenta a performance da aplicao, particularmente em uma WAN ou em uma conexo de baixa velocidade. - Utilizando stored procedure, elimina-se o processo de parsed, ou seja, da query ter que ser analisada gramaticalmente e submetido ao otimizador para formulao de um plano de execuo. - So analisadas, otimizadas e armazenadas em uma forma executvel no momento em que so adicionadas ao banco de dados. - possvel executar operaes muito mais complexas que uma simples query. - Pode ser usada por aplicaes distintas. - Facilita a manuteno, pois possvel alter-la sem ter que recompilar a aplicao. - Proporciona mais segurana ao banco de dados, acessando tabelas que o usurio no tem acesso.

10.2. QUANDO USAR STORED PROCEDURES


- Sempre que a metodologia de desenvolvimento do software permitir. - No existem desvantagens em usar procedimentos armazenados, entretanto existem duas limitaes: - Deve ser possvel passar qualquer informao varivel para a stored procedure (parmetros). - Operaes complexas podem ser limitadas.

66

PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES

10.3. STORED PROCEDURES NO POSTGRESQL


Como visto, Stored Procedures so programas desenvolvidos em determinada linguagem de script e armazenados no servidor, local onde sero processados. Tambm so conhecidos como funes, este o motivo pelo qual as Stored Procedures no PostgreSQL so referenciadas como Function. O PostgreSQL conta com trs formas diferentes de criar funes: a) Funes em Linguagem SQL: So funes que utilizam a sintaxe SQL e se caracterizam por no possurem estruturas de condio (if, else, case), estruturas de repetio (while, do while, for), no permitirem a criao de variveis e utilizam sempre algum dos seguintes comandos SQL: SELECT, INSERT, DELETE ou UPDATE. b) Funes de Linguagens Procedurais: Ao contrrio das funes SQL, aqui permitido o uso de estruturas de condio e repetio e o uso de variveis. As funes em linguagens procedurais caracterizam-se tambm por no possurem apenas uma possibilidade de linguagem, mas vrias. Normalmente a mais utilizada conhecida como PL/PgSQL, linguagem semelhante ao conhecido PL/SQL da Oracle. Existem outras linguagens como, por exemplo, o PL/Perl, PL/Python e PL/Tcl, que possuem sintaxe igual ou semelhante s linguagens que lhes deram origem. c) Funes em Linguagens Externas ou de Rotinas Complexas: So funes normalmente escritas em C++ que trazem consigo a vantagem de utilizarem uma linguagem com diversos recursos, na qual pode-se implementar algoritmos com grande complexidade. Tais funes so empacotadas e registradas no Sistema Gerenciador de Banco de Dados para seu uso futuro. Existem ainda outras linguagens como PL/Ruby, PL/sh e PL/Java, no entanto, estas so definidas por projetos independentes. Dentre elas destacam-se as funes criadas com PL/Java devido a sua crescente demanda entre usurios do PostgreSQL. Para criar uma funo utilizando SQL no PostgreSQL utiliza-se o comando CREATE FUNCTION: Sintaxe: CREATE [OR REPLACE] FUNCTION nome ([tipo_do_parametro1],[...]) RETURNS tipo_retornado AS ' Implementao_da_funo; ' LANGUAGE 'SQL'; - CREATE FUNCTION o comando que define a criao de uma funo, [OR REPLACE] informa que se acaso existir uma funo com este nome, a atual funo dever sobrescrever a antiga. - RETURNS tipo_retornado informa o tipo de dado que ser retornado ao trmino da funo. Tais tipos de retornos so os convencionais como o INTEGER, FLOAT, VARCHAR, etc. As funes em SQL tambm permitem o retorno de mltiplos valores e para isso informase como retorno SETOF. Na implementao haver as linhas de programao para a implementao da stored procedure. - LANGUAGE indica para a funo em qual linguagem ela est sendo implementada.

67

PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES

Na passagem de parmetros funo no se utiliza o nome nas variveis declaradas nos parnteses da assinatura da funo. Utiliza-se o tipo da varivel de parmetro separado por vrgula. Para acessar o valor dos parmetros, utiliza-se o $ mais o nmero da posio que ocupa nos parmetros, seguindo a ordem da esquerda para a direita. Exemplo: CREATE FUNCTION soma(INTEGER, INTEGER) RETURNS INTEGER AS ' SELECT $1 + $2; ' LANGUAGE 'SQL'; O fato de que as funes utilizando SQL sempre retornam valor faz com que seja sempre necessrio que a ltima linha de comando da funo utilize o comando SELECT. Exemplo: CREATE FUNCTION cubo(INTEGER) RETURNS FLOAT AS ' SELECT $1 ^ 3; ' LANGUAGE 'SQL'; Tambm possvel criar funes que fazem interao entre uma determinada consulta e parmetros utilizados na funo. Na funo abaixo se obtm o total de CDs gravados por determinada gravadora, passando como parmetro o id da gravadora (grav_id): Exemplos: CREATE FUNCTION cdGravados(INTEGER) RETURNS INTEGER AS ' SELECT COUNT(cd_id) FROM cd WHERE grav_id = $1; ' LANGUAGE 'SQL'; CREATE OR REPLACE FUNCTION cdGravados2(in INT, out f1 INT, out f2 TEXT, out f3 NUMERIC) AS $$ SELECT CAST(cd_id as integer), CAST(cd_nome AS text), CAST(cd_preco AS numeric) FROM cd WHERE GRAV_id = $1 $$ LANGUAGE SQL; NOTA: Dependendo da configurao escolhida na instalao do PostgreSQL ser necessrio ajustar o tipo do retorno fazendo uso da funo CAST. Exemplo: CAST(COUNT(cd_id) as INTEGER) Para usar a funo utiliza-se a clusula SELECT.

68

PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES

Exemplo: SELECT cdGravados(4); Como mencionado, tambm possvel retornar vrias linhas de uma consulta em uma funo. Para isso, utilizamos o tipo de retorno SETOF. No prximo exemplo criada uma funo em que retorna todos os CDs mais caros que determinado valor passado por parmetro. Exemplo: CREATE OR REPLACE FUNCTION precoMaior(NUMERIC(10,2)) RETURNS SETOF cd AS' SELECT * FROM cd WHERE cd_preco > $1; ' LANGUAGE 'SQL'; Quando as funes possuem o seu retorno referenciado em uma tabela ou uma View, ou seja, quando a funo retorna um resultset, devemos utilizar a funo da seguinte maneira: Exemplo: SELECT * FROM precoMaior(5.2); A excluso de uma funo se faz atravs do comando DROP, como visto na DDL. Sintaxe: DROP FUNCTION nome_da_funcao(); Quando a funo, na sua assinatura contiver parmetros no ser possvel sua excluso atravs do comando DROP FUNCTION nome_da_funcao(), ou seja, para excluir uma funo necessrio passar toda a sua assinatura. Exemplo: DROP FUNCTION precoMaior(NUMERIC(10,2)); Ainda existe o fato que no momento da excluso poder excluir a funo passando mais um parmetro, como no exemplo a seguir: Exemplo: DROP FUNCTION cd_grav (psql INTEGER) RESTRICT; DROP FUNCTION cd_grav (psql INTEGER) CASCADE; Passando o RESTRICT como parmetro, a excluso da funo ser recusada caso existam dependncias de objetos em torno da funo (como por exemplo, Triggers e operadores). Com o CASCADE esses objetos sero excludos juntamente com a funo.

69

PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES

Nota: Se a funo for removida e recriada, a nova funo no mais a mesma entidade que era antes. Ficaro invlidas as regras, vises, gatilhos, etc. existentes que fazem referncia antiga funo. Use o comando CREATE OR REPLACE FUNCTION para mudar a definio de uma funo, sem invalidar os objetos que fazem referncia funo. 10.4.1. PL/pgSQL A PL/pgSQL uma linguagem estrutural estendida da SQL que tem por objetivo auxiliar as tarefas de programao no PostgreSQL. Ela incorpora SQL caractersticas procedurais, como os benefcios e facilidades de controle de fluxo de programas que as melhores linguagens possuem como loops estruturados (for, while) e controle de deciso (if, then, else). Dessa forma, programar em PL/pgSQL significa ter a disposio um ambiente procedural totalmente desenvolvido para aplicaes de bancos de dados, beneficiando-se do controle transacional inerente das aplicaes deste tipo. 10.4.2. Elementos da Linguagem A criao de Stored Procedures inclui todas as construes de uma linguagem de programao estruturada, como: - Comentrios: -- Este um comentrio - Bloco de comandos (BEGIN/END): possvel usar construes como IF-THEN-ELSE e loops WHILE que somente podem conter um comando. - Comandos de atribuio: var1 := var2 * var3 - Operador de concatenao: || (duas barras verticais) Alm desses elementos possvel usar as expresses condicionais: - BETWEEN - LIKE IN - EXISTS - ANY - ALL - IS NULL - IS NOT NULL 10.4.3. Estrutura da Linguagem A PL/pgSQL estruturada em blocos, assim, todo o texto de definio de uma funo precisa estar em um bloco. Sintaxe: [<<label>>] [DECLARE declaraes] BEGIN contedo 1; contedo 2; contedo n; END;
70

PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES

- DECLARE a rea para declarao de variveis. As variveis declaradas nessa sesso so inicializadas recebendo seus valores default sempre que existe uma entrada nesse bloco. Como na maior parte das linguagens existentes, na PL/pgSQL, variveis com o mesmo nome possuem o seu escopo definido para o bloco imediatamente posterior sua declarao. Exemplo: CREATE OR REPLACE FUNCTION mostra_valor(valor INT) RETURNS INTEGER AS $$ DECLARE valor INTEGER := $1; BEGIN RAISE NOTICE 'O valor da varivel aqui %', Valor; RETURN valor; END; $$ LANGUAGE 'PLPGSQL'; Executando a funo: SELECT mostra_valor(12); Como visto possvel usar as mesmas estruturas de controle disponveis nas linguagens de programao: Exemplo: CREATE OR REPLACE FUNCTION formatarCPF(cpf VARCHAR(11)) RETURNS VARCHAR(14) AS $$ BEGIN IF char_length(cpf) != 11 THEN RAISE NOTICE 'Formato invlido: %', $1; RETURN 'ERRO'; END IF; RETURN SUBSTRING(cpf FROM 1 FOR 3) || '.' || SUBSTRING(cpf FROM 4 FOR 3) || '.' || SUBSTRING(cpf FROM 7 FOR 3) || '-' || SUBSTRING(cpf FROM 10 FOR 2); END; $$ LANGUAGE PLPGSQL; SELECT formatarCPF('11111111111'); Alm de todos os recursos advindos da estrutura de programao permitido fazer interao com a estrutura do banco de dados nas operaes da DML como no exemplo abaixo:

71

PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES

Exemplo: CREATE OR REPLACE FUNCTION alteraPreco(id INTEGER, preco NUMERIC(10,4)) RETURNS VARCHAR(50) AS $$ DECLARE valorMax NUMERIC(10,4) := 100; valorMin NUMERIC(10,4) := 1; BEGIN IF $2 >= valorMin and $2 <= valorMax THEN UPDATE CD SET cd_preco = $2 WHERE cd_id = $1; RETURN 'Preo alterado com sucesso'; ELSE RETURN 'O valor inserido est fora da faixa delimitada para preos de CDs'; END IF; END; $$ LANGUAGE PLPGSQL; SELECT alteraPreco(1, 16.5); SELECT alteraPreco(2, 120); As verses 8.3 e posteriores do PostgreSQL permitem o retorno de conjuntos de linhas e colunas de uma funo atravs da funcionalidade RETURN QUERY. O RETURN QUERY aceita o tipo RECORD como valor de retorno tornando fcil retornar resultados de consultas genricas. Exemplo: CREATE OR REPLACE FUNCTION cd_grav (psql integer) RETURNS SETOF RECORD AS $$ BEGIN RETURN QUERY SELECT cd_nome, grav_nome FROM cd, gravadora WHERE cd.grav_id = gravadora.grav_id AND gravadora.grav_id = $1; -- Consulta RETURN; -- Retorna as linhas END; $$ LANGUAGE plpgsql; A diferena desta forma de programar est na chamada da funo. Ao utilizar valor de retorno do tipo RECORD, deve ser indicada a lista de campos a serem retornados e seus tipos. Esta pode ser vista como uma limitao, embora na prtica tambm seja uma forma de se garantir a confiabilidade dos resultados retornados na execuo de comandos SQL dentro de funes pela validao dos valores retornados. Exemplo: SELECT * FROM cd_grav(2) AS ( c1 VARCHAR(50), c2 VARCHAR(50) );

72

PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES

Esses so alguns recursos possveis com Stored Procedures/Functions no PostgreSQL. Contudo, importante saber que existe um gama de outros recursos possveis fazendo uso do PgSQL, assim como acontece com outros bancos de dados, como o Oracle.

10.4. EXERCCIOS
a) Crie uma Stored Procedure no PostgreSQL que faa inseres na tabela de msica. b) Crie uma Stored Procedure no PostgreSQL que retorne quais msica foram gravadas em determinado CD passando como parmetro o id do CD (cd_id).

73

TRIGGERS (G ATILHOS OU AUTOMATISMOS)

11
Parte
TRIGGERS (GATILHOS OU AUTOMATISMOS)

esenvolver uma aplicao para gerenciar os dados significa criar uma aplicao que faa o controle sobre todo ambiente desde a interface, passando pela manuteno dos dados e as regras de negcios do sistema. Assim, o sistema que deve controlar e tomar as decises sobre o que fazer em determinadas situaes. Em um programa para controlar os produtos de uma empresa, quando a quantidade de um produto atingir certa quantidade o sistema dever avisar o operador/usurio para providenciar a reposio do mesmo. Ao trabalhar com base de dados Cliente/Servidor como SQL Server, Oracle, Informix, PostgreSQL dentre outras, possvel usar um recurso muito poderoso chamado Trigger. Triggers so rotinas armazenadas no banco de dados e utilizadas quando um comando Insert, Update ou Delete executado em uma tabela ou at mesmo uma viso (view). Trigger significa gatilho e disparada quando os comandos da DML so disparados. So executadas automaticamente sem a interferncia do usurio, ou seja, so procedimentos armazenados que so acionados por algum evento e em determinado momento. As principais aplicaes das triggers esto relacionadas s validaes, restries de acesso, rotinas de segurana e consistncia de dados. Triggers so iguais a stored procedures com as seguintes excees: - So chamadas automaticamente; - No tem parmetros; - No retornam valores. A criao de uma trigger envolve duas etapas: - Um comando SQL que vai disparar o Trigger (INSERT, DELETE, UPDATE) - A ao que a trigger vai executar (Geralmente um bloco de cdigos SQL) O gatilho fica associado com uma tabela e executa uma funo especifica. Na maioria dos bancos de dados estes eventos podem ser inseres (INSERT), atualizaes (UPDATE) e excluses (DELETE), e podem ser executadas em dois momentos: - Antes da execuo do evento (BEFORE); - Depois da execuo do evento (AFTER). Uma trigger executada automaticamente mediante seis eventos da DML: - BEFORE UPDATE (Antes da atualizao); - AFTER UPDATE (Aps a atualizao); - BEFORE INSERT (Antes da insero); - AFTER INSERT (Aps a insero);

74

TRIGGERS (G ATILHOS OU AUTOMATISMOS)

- BEFORE DELETE (Antes da excluso); - AFTER DELETE (Aps a excluso);

11.1. BEFORE OU UPDATE


Uma trigger deve ser disparada antes de o registro ser atualizado caso queira alterar o valor de uma ou mais colunas antes que a linha seja atualizada, ou queira bloquear a alterao da linha gerando uma exceo, como por exemplo: usar uma trigger BEFORE UPDATE para evitar que o usurio apague o registro de um cliente que tenha comprado nos ltimos dois anos. Triggers do tipo AFTER quando se deseja garantir que a atualizao que disparou a trigger seja completada com sucesso antes de executar outras aes, como por exemplo: inserir uma linha em uma tabela de salario_historico sempre que o salrio de um funcionrio for alterado.

11.2. USANDO OLD E NEW


No corpo de uma trigger possvel usar tanto os valores antigos ou novos de qualquer registro. Para isso basta utilizar os comandos OLD e NEW. Exemplo: old.aut_nome new.aut_nome Com esses comandos possvel criar registros de histrico, calcular percentual de alterao de valores, etc.

11.3. TRIGGERS NO POSTGRESQL


Um diferencial das triggers no PostgreSQL que elas so sempre associadas a funes de triggers e em outros Bancos de Dados elas so criadas no corpo da trigger. 11.3.1. Tipos de Triggers O PostgreSQL possui dois tipos de triggers: - Triggers-por-linha - Triggers-por-instruo A trigger-por-linha disparada uma vez para cada registro afetado pela instruo que disparou a trigger. A trigger-por-instruo disparada somente uma vez quando a instruo executada.

75

TRIGGERS (G ATILHOS OU AUTOMATISMOS)

11.3.2. Funes de Trigger e Linguagens Procedurais Funes de triggers so funes que no recebem nenhum parmetro e retornam o tipo trigger. Essas funes recebem uma estrutura chamada TriggerData, e esta passada internamente para a funo pelo PostgreSQL. O PostgreSQL disponibiliza duas variveis importantes para serem usadas em conjunto com as triggers-por-linha: NEW e OLD. A varivel NEW, no caso do INSERT, armazena o registro que est sendo inserido. No caso do UPDATE, armazena a nova verso do registro depois da atualizao. A varivel OLD, no caso do DELETE, armazena o registro que est sendo excludo. No caso do UPDATE, armazena a antiga verso do registro depois da atualizao. As funes de triggers devem ser escritas em alguma linguagem procedural disponvel no banco de dados1. Cada linguagem, que suporta triggers, possui o seu prprio mtodo para tornar os dados de entrada da trigger disponveis para a funo. Estes dados de entrada incluem o tipo de evento da trigger, assim como as opes informadas na criao da trigger. Para uma trigger no nvel de linha, os dados de entrada tambm incluem as linhas NEW para as triggers de INSERT e UPDATE, e a linha OLD para os triggers de UPDATE e DELETE. Sintaxe: CREATE TRIGGER nome { BEFORE | AFTER } { evento [OR ...] } ON tabela FOR EACH { ROW | STATEMENT } EXECUTE PROCEDURE funo ( argumentos ) Onde: Nome: O nome da Trigger. Tabela: O nome da tabela na qual a trigger estar vinculada. Evento: INSERT, DELETE ou UPDATE. Funo: Pode-se usar, neste caso, uma stored procedure para execuo de determinada tarefa. row|statement: especifica se a trigger deve ser disparada uma vez para cada linha afetada pelo evento ou apenas uma vez por comando SQL. Se no for especificado nenhum dos dois, o padro FOR EACH STATEMENT. Exemplo: Para este primeiro exemplo necessrio alterar nosso banco de dados: ALTER TABLE autor ADD aut_cpf CHAR(14); Prximo passo criar a funo que faz a insero de determinado valor nesta tabela:

Essas linguagens podem ser vrias, como Ruby, Perl, Python, entre outras. Atualmente existem quatro linguagens procedurais disponveis na distribuio padro do PostgreSQL: PL/pgSQL, PL/Tcl, PL/Perl e PL/Python. Mas possvel que o usurio defina outras linguagens. Para instalar novas linguagens no PostgreSQL, consulte a documentao oficial do PostgreSQL, que pode ser obtida no seguinte endereo: http://pgdocptbr.sourceforge.net/.

76

TRIGGERS (G ATILHOS OU AUTOMATISMOS)

Exemplo: CREATE OR REPLACE FUNCTION ftFormataCPF() RETURNS trigger AS $$ BEGIN IF char_length(new.aut_cpf) = 11 THEN new.aut_cpf := SUBSTRING(new.aut_cpf FROM 1 FOR 3) || '.' || SUBSTRING(new.aut_cpf FROM 4 FOR 3) || '.' || SUBSTRING(new.aut_cpf FROM 7 FOR 3) || '-' || SUBSTRING(new.aut_cpf FROM 10 FOR 2); RETURN new; END IF; END; $$ LANGUAGE plpgsql; Por fim, criando a trigger: Exemplo: CREATE TRIGGER tFormataCpf BEFORE INSERT ON autor FOR EACH ROW EXECUTE PROCEDURE ftFormataCPF (); Verificando seu funcionamento: INSERT INTO autor (aut_id, aut_nome, aut_cpf) VALUES (102, 'teste function2', '00000000002'); 11.3.3. Parmetros Especiais Dentre as funes que foram apresentadas para triggers possvel utilizar uma grande quantidade de argumentos com a finalidade de criar controles e mtodos de auditoria nos bancos de dados PostgreSQL. Todas elas so facilmente encontradas no manual do PostgreSQL. Desses, um dos argumentos mais importantes o TG_OP que permite identificar qual operao est sendo realizada: INSERT, UPDATE e DELETE. Muito til para criar mecanismos de auditoria nos dados contidos em determinada tabela. Acompanhe atentamente o exemplo abaixo: Exemplo: Primeiramente vamos criar uma tabela de histrico: CREATE TABLE historico_cd ( hcd_id INTEGER, hcd_preco_novo NUMERIC(14,2), hcd_preco_antigo NUMERIC(14,2), hcd_data_hora TIMESTAMP, hcd_operacao VARCHAR(50) );

77

TRIGGERS (G ATILHOS OU AUTOMATISMOS)

Depois criamos a funo: CREATE OR REPLACE FUNCTION auditaCD() RETURNS trigger AS $$ BEGIN IF (TG_OP = 'INSERT') THEN INSERT INTO historico_cd (hcd_id, hcd_preco_novo, hcd_preco_antigo, hcd_data_hora, hcd_operacao) VALUES (NEW.cd_id, NEW.cd_preco, NULL, CURRENT_TIMESTAMP, INSERT); RETURN NEW; ELSIF (TG_OP = 'UPDATE') THEN INSERT INTO historico_cd (hcd_id, hcd_preco_novo, hcd_preco_antigo, hcd_data_hora, hcd_operacao) VALUES (OLD.cd_id, NEW.cd_preco, OLD.cd_preco, CURRENT_TIMESTAMP, UPDATE); RETURN NEW; ELSIF (TG_OP = 'DELETE') THEN INSERT INTO historico_cd (hcd_id, hcd_preco_novo, hcd_preco_antigo, hcd_data_hora, hcd_operacao) VALUES (OLD.cd_id, NULL, OLD.cd_preco, CURRENT_TIMESTAMP, DELETE); RETURN NEW; END IF; END; $$ LANGUAGE plpgsql; Por fim, criamos a Trigger: CREATE TRIGGER tg_auditaCD AFTER INSERT OR UPDATE OR DELETE ON cd FOR EACH ROW EXECUTE PROCEDURE auditaCD(); Verificando seu funcionamento: INSERT INTO cd (cd_id, grav_id, cd_nome, cd_preco, cd_dt_lancamento) VALUES (100, 1, 'teste trigger1', 10.00, '2009-1115'); UPDATE cd SET cd_preco = 20.00 WHERE cd_id = 100; DELETE FROM cd WHERE cd_id = 100; 11.3.4. Triggers Recursivas Se uma funo de trigger executar comandos SQL, estes comandos podem disparar triggers novamente. Isto conhecido como cascatear triggers. No existe limitao direta do nmero de nveis de cascateamento. possvel que o cascateamento cause chamadas recursivas da mesma trigger; por exemplo, um trigger para INSERT pode executar um

78

TRIGGERS (G ATILHOS OU AUTOMATISMOS)

comando que insere uma linha adicional na mesma tabela, fazendo com que a trigger para INSERT seja disparada novamente. responsabilidade de o programador evitar recurses infinitas nestes casos. 11.3.5. Alterando uma Trigger possvel alterar o nome de trigger usando a sintaxe abaixo: Sintaxe: ALTER TRIGGER nome ON tabela RENAME TO novo_nome; 11.3.6. Excluindo uma Trigger Para excluir uma trigiger basta executar o comando abaixo: Sintaxe: DROP TRIGGER nome ON tabela [ CASCADE | RESTRICT ] Onde: Nome: o nome da trigger a ser removida. Tabela o nome da tabela para a qual a trigger est definida. [ CASCADE | RESTRICT ]: indica que ao remover a trigger vamos remover tambm todos os objetos que dependem dela (CASCADE) ou recusaremos sua excluso (RESTRICT). 11.3.7. Desabilitando/Habilitando uma Trigger Para desabilitar/habilitar uma trigger execute o comando abaixo: Sintaxe: ALTER TABLE nome_tabela [DISABLE|ENABLE] TRIGGER nome_trigger; Para desabilitar todas as triggers da tabela, execute o seguinte comando: Sintaxe: ALTER TABLE nome_tabela [DISABLE|ENABLE] TRIGGER ALL;

11.4. EXERCCIO
a) Crie uma trigger responsvel por verificar, no momento da insero na tabela de CD, se o preo do CD maior de 1,00 e inferior a 100,00.

79

SEGURANA DE BANCO DE DADOS

12
Parte
SEGURANA DE BANCO DE DADOS

odemos dizer que segurana em banco de dados garante que os usurios tenham permisso para fazer o que realmente precisam fazer. Para tanto, os Sistemas Gerenciadores de Banco de Dados precisam de certas limitaes, na qual os usurios no podero violar. Estas especificaes so criadas pelo DBA (Administrador de Banco de Dados). Todas as decises acerca dos direitos que devem ser concedidos a determinado usurio so decises polticas e no tcnicas. Assim sendo, tais competncias fogem a alada dos Sistemas Gerenciadores de Banco de Dados.

12.1. VISO DE SEGURANA


O Sistema Gerenciador de Banco de Dados deve fornecer ao usurio uma representao conceitual dos dados (viso), sem fornecer muitos detalhes de como as informaes esto armazenadas. Muitas verificaes de autorizao podem aplicar-se ao tempo de execuo, entretanto a abordagem de segurana de que se baseia uma viso um tanto inbil, pois um usurio pode precisar de direitos diferentes sobre subconjuntos diferentes da mesma tabela. Existem muitos aspectos relativos aos problemas de segurana, dentre eles os aspectos legais, sociais e ticos. O que deve ser analisado se quem faz a solicitao da informao tem direito legal sobre ela. Outro aspecto a se analisar so os controles fsicos. Considera-se a sala a sala do servidor um lugar inviolvel, pois l esto todas as informaes. Para que o sistema seja capaz de decidir que limitaes se aplicam a determinada solicitao necessrio reconhecer a fonte daquela solicitao, isto , deve ser capaz de reconhecer de que usurio especfico partiu aquela demanda. Neste sentido necessrio atribuir mecanismos de autenticao para os responsveis pela solicitao sejam identificados, como um meio de garantir a auditoria sobre os feitos daquele usurio nos dados armazenados.

12.2. INSTRUES GRANT E REVOKE


O mecanismo de viso possibilita dividir o banco de dados em partes conceituais de modo que a informao sensvel fique oculta aos usurios no autorizados. Por meio das instrues GRANT e REVOKE possvel atribuir restries aos usurios de acordo com um perfil previamente estabelecido. Esses representam a principal interface que

80

SEGURANA DE BANCO DE DADOS

concede ao usurio capacidade de desempenhar qualquer operao atravs de comandos SQL.

12.3. OUTROS ASPECTOS DE SEGURANA


As vises e o mecanismo de GRANT e REVOKE no so os nicos meios de se implementar segurana em banco de dados. Na verdade, no existe nenhum ponto no Sistema Gerenciador de Banco de Dados que proporcione um conjunto amplo de controles de segurana. Dessa forma, um suposto infiltrador suficientemente determinado capaz de passar por todos os controles j mencionados. Para situaes em que os dados sejam sensveis, torna-se necessrio um arquivo ou banco de dados especial, onde o sistema registra automaticamente todas as operaes desempenhadas por determinado usurio. A isso chamamos de Log. Outro nvel de segurana pode ser proporcionado pela codificao de dados. A idia bsica consiste no armazenamento fsico dos dados no disco e antes de serem transmitidos so codificados (Criptografados).

12.4. CRIAO DE USURIOS NO POSTGRESQL


Para possibilitar a utilizao da base de dados por usurios distintos, cada um trabalhando em uma sesso diferente necessrio realizar a criao de um usurio no Sistema Gerenciador de Banco de Dados atribuindo-lhe um nome para autenticao e senha. A este usurio criado podero ser concedidas permisses diversas assegurando-lhe acesso aos dados, bem como concedendo e restringindo operaes sobre as informaes. O comando usando no PostgreSQL para criar usurio o CREATE USER. No entanto, nas verses mais modernas possvel faz-lo diretamente atravs do comando CREATE ROLE, possibilitando a utilizao de mais recursos. Sintaxe: CREATE USER|ROLE nome [ [ WITH ] opo [ ... ] ] Onde, opo pode ser: SYSID id_do_usurio | CREATEDB | NOCREATEDB | CREATEUSER | NOCREATEUSER | IN GROUP nome_do_grupo [, ...] | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'senha' | VALID UNTIL 'data_e_hora' Parmetros: - Nome: O nome do usurio. - id_do_usurio: A clusula SYSID pode ser utilizada para escolher o identificador de usurio do PostgreSQL do novo usurio. Normalmente no necessrio, mas pode ser til se for necessrio recriar o dono de um objeto que ficou rfo. Se no for especificado, ser utilizado por padro o maior identificador de usurio atribudo acrescido de um (com mnimo de 100).

81

SEGURANA DE BANCO DE DADOS

- CREATEDB NOCREATEDB: Estas clusulas definem a permisso para o usurio criar banco de dados. Se for especificado CREATEDB, o usurio sendo definido ter permisso para criar seus prprios bancos de dados. Se for especificado NOCREATEDB, nega-se ao usurio a permisso para criar banco de dados. Se nenhuma destas clusulas for especificada, o padro NOCREATEDB. - CREATEUSER NOCREATEUSER : Estas clusulas determinam se o usurio pode ou no criar novos usurios. CREATEUSER tambm torna o usurio um superusurio, o qual pode passar por cima de todas as restries de acesso. Se nenhuma destas clusulas for especificada, o padro NOCREATEUSER. - nome_do_grupo: O nome de um grupo existente onde o usurio ser includo como um novo membro. Podem ser especificados nomes de vrios grupos. - Senha: Define a senha do usurio. Se no se pretende utilizar autenticao por senha esta opo pode ser omitida, mas o usurio no poder mais se conectar se for decidido mudar para autenticao por senha. A senha poder ser definida ou mudada posteriormente atravs do comando ALTER USER. - ENCRYPTED UNENCRYPTED: Estas clusulas controlam se a senha ser armazenada criptografada, ou no, nos catlogos do sistema; Se no for especificada nenhuma destas clusulas, o comportamento padro ser determinado pelo parmetro de configurao password_encryption. Se a cadeia de caracteres da senha j estiver criptografada no formato MD5, ento a cadeia de caracteres ser armazenada como est, independentemente de ser especificado ENCRYPTED ou UNENCRYPTED (porque o sistema no pode descriptografar a cadeia de caracteres criptografada contendo a senha). Esta funcionalidade permite a restaurao de senhas criptografadas efetuadas por uma operao de dump/restore. Deve ser observado que os clientes antigos podem no possuir suporte para o mecanismo de autenticao MD5, necessrio para trabalhar com as senhas que so armazenadas criptografadas. - data_e_hora: A clusula VALID UNTIL define uma data e hora aps a qual a senha do usurio no mais vlida. Se esta clusula for omitida, a conta ser vlida para sempre. A clusula VALID UNTIL define uma data de expirao para a senha apenas, e no para a conta do usurio per se. Em particular, a obedincia data de expirao no imposta ao se conectar utilizando um mtodo de autenticao no baseado em senha. Deve ser usado o comando ALTER USER para mudar os atributos de um usurio, e DROP USER para remover um usurio. Deve se usado ALTER GROUP para adicionar ou remover usurios de grupos de forma semelhante como acontece com a criao do usurio. O PostgreSQL inclui o programa createuser que possui a mesma funcionalidade do CREATE USER (na verdade, chama este comando), mas pode ser executado a partir da linha de comando.

82

SEGURANA DE BANCO DE DADOS

Exemplos: Criar um usurio sem senha: CREATE USER Jonas; CREATE ROLE Jonas; Criar um usurio com senha: CREATE ROLE manuel WITH PASSWORD 'jw8s0F4'; Criar um usurio com uma senha vlida at o fim de 2009. Aps o primeiro segundo de 2010 a senha no ser mais vlida: CREATE ROLE miriam WITH PASSWORD 'jw8s0F4' VALID UNTIL '2010-0101'; Criar uma conta onde o usurio pode criar bancos de dados: CREATE ROLE manuel WITH PASSWORD 'jw8s0F4' CREATEDB; Criar um usurio com poderes de superusurio: CREATE ROLE administrador WITH SUPERUSER xxxxx;

ENCRYPTED

PASSWORD

Para alterar determinado usurio, basta utilizar o comando ALTER ROLE de maneira semelhante como ocorre com o comando CREATE ROLE: Exemplo: Conceder permisso para o usurio criar outro usurios e bancos dedados: ALTER ROLE miriam CREATEROLE CREATEDB; Para excluir usurio do banco de dados utiliza-se o comando DROP: DROP ROLE Manoel; Para saber quais usurio esto cadastrados no PostgreSQL basta fazer uma consulta na tabela do sistema pg_user: SELECT username FROM pg_user;

12.5. CRIANDO GRUPOS DE USURIOS


No PostgreSQL possvel criar grupos de usurios. Lembrando que todas as permisses atribudas ao grupo sero repassadas aos usurios pertencentes a ele. Sintaxe: CREATE GROUP nomedogrupo; Exemplos: CREATE GROUP adm;

83

SEGURANA DE BANCO DE DADOS

Adicionar e remover usurio de um grupo: Exemplo: ALTER GROUP adm ADD USER miriam, administrador; ALTER GROUP adm DROP USER miriam; Para excluir um grupo, basta usar o comando padro para excluso de objetos no banco de dados, DROP. Lembrando que o comando DROP remove apenas o grupo e no os usurios do grupo. Exemplo: DROP GROUP adm; Para listar todos os grupos criados necessrio consultar a tabelas do sistema pg_group: SELECT gronome FROM pg_group;

12.6. CONCEDENDO PRIVILGIOS AOS USURIOS


Nesta etapa importante lembrar que o superusurio tem o direito de fazer o que bem entender nos bancos de dados existentes. Outro aspecto relativo ao proprietrio de um objeto no banco de dados. Sendo ele o dono do objeto ele tambm tem todas as permisses para fazer o que bem entender com esse objeto. So vrios os privilgios que um usurio pode receber, dentre eles: - SELECT - INSERT - UPDATE - DELETE - RULE - REFERENCES - TRIGGER - CREATE - TEMPORARY - EXECUTE - USAGE - LOGIN - CONNECT A concesso de privilgios se d atravs do comando GRANT e sua revogao atravs do comando REVOKE. Sintaxe: GRANT privilgio ON objeto TO usurio; REVOKE privilgio ON objeto FROM usurio; Exemplos: GRANT SELECT, INSERT, UPDATE ON cliente TO miriam; Para atribuir e retirar permisso ao grupo: GRANT SELECT, DELETE ON cliente TO adm; REVOKE UPDATE ON cliente FROM miriam; Para remover os privilgios de todos os usurios: REVOKE ALL ON cliente FROM PUBLIC;
84

SEGURANA DE BANCO DE DADOS

Os privilgios especiais do dono da tabela so sempre inerentes condio de ser o dono, no podendo ser concedidos ou revogados. No entanto, o dono do objeto pode revogar seus prprios privilgios, tornando-se um usurio comum como os demais no que se refere ao objeto na qual proprietrio. Em geral, somente o dono e o superusurio podem conceder ou revogar privilgios para um objeto.

12.7. OBSERVAES IMPORTANTES


O usurio do sistema (superusurio) deve ser um usurio criado exclusivamente para o PostgreSQL. Nunca devemos torn-lo dono de um executvel. Os nomes de usurio so globais para todos os bancos de dados.

85

REFERNCIAS

REFERNCIAS
ELMASRI, Ramez; Sistema de Banco de Dados - Fundamentos e Aplicaes - 4 Edio, Pearson Education, 2005. OLIVEIRA, Celso Henrique Poderoso; SQL Curso Prtico; Novatec, 2002. Momjian, Bruce; PostgreSQL: Introduction and Concepts. E-Book; Addison-Wesley, 2001. PostgreSQL Manual (With user comments) do PostgreSQL 8.3. Disponvel em <http://www.postgresql.org/files/documentation/pdf/8.3/postgresql-8.3-A4.pdf>

86