1.264 Aula 8 SQL (continuação) ODBC
Subconsultas As subconsultas SQL permitem a utilização dos resultados de uma consulta como parte de outra consulta. Elas Com freqüência, são formas naturais de escrever um comando Permitem a quebra de uma consulta em partes e sua montagem Permitem algumas consultas, as quais não poderiam ser construídas de outra forma
Subconsultas Liste os escritórios nos quais as quotas de vendas excedem a soma das quotas individuais dos vendedores SELECT City FROM Offices WHERE Target >?????? é a soma das quotas dos vendedores ou SELECT SUM(Quota) FROM SalesReps WHERE RepOffice = OfficeNbr Essas características são combinadas para obter SELECT City FROM Offices WHERE Target > (SELECT SUM(Quota) FROM SalesReps WHERE RepOffice = OfficeNbr);
Subconjuntos As subconsultas sempre aparecem como parte da cláusula WHERE (ou HAVING) A subconsulta somente pode produzir uma única coluna de dados como seu resultado Somente um campo pode estar presente na subconsulta SELECT ORDER BY não é permitido; ele não faria sentido UNION não é suportado; somente um SELECT é permitido Normalmente, referimos ao nome de uma coluna da tabela principal na consulta Isso define a linha atual da tabela principal para a qual a subconsulta está sendo executada. Essa definição é chamada de referência externa Em nosso exemplo, ela é RepOffice = OfficeNbr da tabela Offices
Visões Tabelas virtuais que apresentam os dados em forma não normalizada para os usuários Elas NÃO são cópias separadas dos dados; elas fazem referência aos dados nas tabelas subjacentes O banco de dados armazena a definição da visão; os dados são atualizados quando essas tabelas subjacentes forem atualizadas Vantagens: Projetadas para atender necessidades específicas dos usuários Consultas muito mais simples para os usuários sobre visões construídas para eles Segurança: fornecem acesso somente as dados nas visões Independência: separam o usuário ou o programa das alterações nas tabelas subjacentes
Visões CREATE VIEW CustomerOrders AS SELECT CustNbr, Company, Name, OrderNbr, Prod, Qty, Amt FROM Customers, SalesReps, Orders WHERE CustRep = RepNbr AND CustNbr = Cust (Standard SQL)
Sutilezas das visões É possível alterar as visões para invalidá-las Por exemplo, Visão dos livros com preço abaixo de $5 O que acontece se você efetuar uma atualização do preço de um livro para $5,99 através da visão. Ele desaparece! Evite isso, adicionando: WITH CHECK OPTION Nem todas as visões podem ser atualizadas. A visão é para leitura somente (read-only) se: DISTINCT estiver presente no comando SELECT Expressões (médias, totais, etc.) Referências a visões que não podem ser atualizadas Cláusulas GROUP BY ou HAVING Algumas vezes: Referências a mais de uma tabela (elimina o objetivo)
Visões no MS Access As visões são construídas e armazenadas como consultas Construa o comando SELECT, incluindo JOINS das tabelas, se necessário Salve a Consulta, fornecendo-lhe um nome A seguir, você poderá efetuar a consulta da consulta (visão), bem como utilizá-la como a fonte de dados para páginas da Web, como se ela fosse uma tabela Você utilizará as visões (consultas) em FrontPage, pois ele tinha erros ao referenciar JOINs.
Exercícios de revisão Exibir todos os clientes com pedidos ou limites de crédito > $50.000 É possível listar o cliente somente uma vez? Excluir vendedores nos escritórios de vendas em Nova York (NY) com quotas acima de $40.000 Sugestão: Lembre-se de excluir de (FROM) uma única tabela. Utilize uma subconsulta.
Exercícios de revisão Exibir todos os clientes com pedidos ou limites de crédito > $50.000 É possível listar o cliente somente uma vez? Sim, mas é difícil. SELECT DISTINCT CustNbr FROM Customers, Orders WHERE CustNbr = Cust AND (CreditLimit>50000 OR Amt>50000); Excluir vendedores nos escritórios de vendas em Nova York (NY) com quotas acima de $40.000 Sugestão: Lembre-se de excluir de (FROM) uma única tabela. Utilize uma subconsulta DELETE * FROM SalesReps WHERE RepNbr IN (SELECT RepNbr FROM SalesReps, Offices WHERE OfficeNbr = RepOffice AND Quota>40000 AND State = NY ;
Índices O índice é um objeto de dados separado no banco de dados que lista as linhas da tabela de forma a permitir consulta rápida. Cada índice para cada tabela é um objeto separado As chaves primárias e estrangeiras são automaticamente indexadas Acesso rápido a colunas indexadas. Cada índice pode ser atualizado quando uma linha é atualizada; portanto, os índices tornam mais lentas as atualizações, inserções e exclusões O limite máximo prático é de 3 ou 4 índices por tabela. Se outros forem necessários ocasionalmente, adicione e descarte-os conforme a necessidade Se o banco de dados é lido com freqüência, utilize muitos índices para agilizar o desempenho Se o banco de dados é atualizado com freqüência, utilize o menor número de índices possível Índices agrupados. Rearranje fisicamente as colunas pelo índice único para maximizar a velocidade de acesso ao disco
Exemplo de índices Banco de dados de Clientes A identificação do cliente é a chave primária Nome do cliente (sobrenome, nome) Cidade, estado CEP Endereço Indexe nome, cidade/estado, CEP e endereço Quatro índices: inserção, atualização e exclusão lentas, mas pesquisa rápida Se o banco de dados do cliente é razoavelmente estável, isso é bom Lógica similar para catálogo de peças, lista de materiais, etc As máquinas de busca da Internet utilizam máquinas de recuperação de texto Indexam cada palavra no banco de dados inteiro; contam as ocorrências e classificam as coincidências. Avanços recentes (freqüência de links, utilização...) aprimoram esse processo
Segurança Opções de Segurança: Utilização do logon/senha do sistema operacional (fraco) para identificar o usuário O usuário obtém acesso a todos os bancos de dados e todas as tabelas Utilização do logon/senha do banco de dados (mais forte) Acesso restrito a bancos de dados e tabelas, mas ainda pode utilizar as aplicações Segurança em nível de aplicação (mais forte ainda, mas difícil de administrar) Cada aplicação deve pesquisar em um banco de dados comum para verificar se o usuário está autorizado; isso é mais centralizado do que BD a BD Segurança em nível de rede (a mais forte, pouco viável no momento) Utiliza infra-estrutura de diretório e chave pública (PKI), criptografia Essa é a tecnologia de ponta atual: onerosa e difícil Classes de usuários: superusuário (DBA), proprietário dos dados, usuário dos dados Atribuição de privilégios (permissões) de banco de dados GRANT e REVOKE: Por exemplo, GRANT ALL ON TableName TO PUBLIC WITH GRANT OPTION A ordem importa para GRANTs e REVOKEs. O último é que rege. O MS Access não suporta esses recursos
Transações Com freqüência, grupos de transações devem ser tratados como unidades atômicas Transação de início Inserir OrderHeader Enquanto existir mais OrderDetails (itens de linha): Selecionar Peça Atualizar inventário de Peças Inserir linha OrderDetail Resultado: Transação de compromisso Propriedades das transações (ACID) A - atômica - tudo ou nada (recuperação) C - consistência - de um estado consistente a outro (integridade) I - isolamento - não permite outra transação para visualizar alterações não compromissadas (concorrência) D - durável - uma vez comprometidas, as transações são permanentes
Transações Bancos de dados multiusuário têm outros problemas de transações Duas ações de banco de dados entram em conflito se uma ou ambas forem operações de gravação Atualizações perdidas: 7 peças no inventário As transações 1 e 2 lêem simultaneamente 7 como a quantidade atual A transação 1 termina primeiro, adiciona 3 peças, e grava 10 como quantidade A transação 2 termina depois, exclui 5 peças, e grava 2 como quantidade! Alterações não comprometidas: A transação 1 adiciona 3 peças, e grava 10 como quantidade A transação 2 lê 10 como quantidade A transação 1 é cancelada (roll back), deixando a transação 2 com dados incorretos
Transações Os bancos de dados utilizam bloqueios (locks) para concorrência. Um esquema simples é: Os comandos de gravação obtêm um bloqueio exclusivo sobre um registro, evitando leituras ou gravações Os comandos de leitura obtêm bloqueios não-exclusivos, permitindo outras leituras, mas impedindo que uma transação de gravação obtenha um bloqueio exclusivo Os bancos de dados utilizam logs para recuperação. O arquivo de log é gravado com todas as alterações efetuadas no banco de dados (isso é um gargalo importante na arquitetura) A alteração não pode ser compromissada até que o log seja gravado em memória permanente. Normalmente, as alterações são comprometidas antes de as tabelas serem realmente atualizadas no disco Se uma alteração for cancelada, o log é lido para reverter as transações. Se houver queda do sistema ou quebra de disco, o log é reexecutado a partir do último checkpoint para restaurar o banco de dados. Desligue os logs ao efetuar a carga ou recuperação de dados em lote (batch)
Desempenho Benchmarks (TPC-A a H...) www.tpc.org Caches: discos são lentos! Coloca páginas (normalmente, porções de dados com 8 kb) na memória para acesso rápido Otimizadores de consulta Muitas formas de efetuar junções; depende do tamanho da tabela, características das chaves (comprimento, 'univocidade'), etc. Estatísticas de índices UPDATE STATISTICS
API de Conectividade de Bancos de Dados Abertos (ODBC) Estágio inicial: SQL incorporada (ESQL) em cada servidor de banco de dados (início dos anos 1990) Compilada na aplicação do servidor, não pode ser alterada pelo usuário final Poderia não executar de forma razoável entre vários bancos de dados Segundo estágio: Quando as aplicações cliente-servidor surgiram (final dos anos 1990) Cada fornecedor de banco de dados forneceu uma interface de programação de aplicações (API) para permitir que os clientes consultem o banco de dados Obviamente, cada API dos fornecedores era diferente Estágio atual: ODBC (final dos anos 1990 até hoje) API comum do Windows, capaz de acessar os bancos de dados mais importantes Oracle, SQL Server, Sybase, DB2, Informix JDBC é muito similar para o ambiente Java
API de ODBC Biblioteca de chamadas de funções ODBC para a conexão de uma aplicação (Web, Windows, outras) ao DBMS, executa comandos SQL e recupera resultados Sintaxe SQL baseada no padrão SQL-92 Conjunto padrão de códigos de erro Forma padrão de conexão e logon no DBMS Representação padrão dos tipos de dados Métodos padrão para conversões de tipos de dados A ODBC contém funções core, de camada 1 e camada 2 para tratar interfaces simples e sofisticadas Esses recursos resolvem muitos problemas da SQL nãopadrão, indicados na última aula.
Arquitetura ODBC Aplicação Gerenciador do Driver ODBC Servidor Web Driver Oracle Driver SQL Server Driver Dbase Dados Servidor Oracle (fonte de dados) Dados SQL Server (fonte de dados) Dados Servidor de banco de dados
Arquitetura ODBC Aplicação (Windows, Web) Executa o processamento Chama funções ODBC para enviar comandos SQL e recuperar resultados Gerenciador de drivers Efetua a carga e descarga dos drivers solicitados pela aplicação Processa algumas chamadas de funções ODBC (supervisão) Driver ODBC Processa a maioria das chamadas de funções ODBC Envia solicitações SQL para fontes de dados específicas Modifica a solicitação da aplicação para compatibilidade com a sintaxe SQL da fonte de dados Retorna os resultados à aplicação Fonte de dados
Aplicação Solicita conexão ou sessão com a fonte de dados Envia solicitações SQL para a fonte de dados Aloca áreas de memória e define formatos para os resultados das solicitações SQL Solicita resultados Processa dados e erros Se a aplicação requer processamento das transações, ela solicita comprometimento ou cancelamento (roll back) para aceitar ou rejeitar os resultados da transação Quando concluída, encerra a conexão com a fonte de dados
Gerenciador de drivers O gerenciador de drivers é uma biblioteca dinâmica de links (DLL) fornecida pela Microsoft Ela carrega e descarrega drivers ODBC Quando a aplicação solicita uma lista dos nomes das fontes de dados instaladas, o Gerenciador de Drivers recupera as informações do registro e devolve essa lista. Processa chamadas de inicialização, validação de parâmetros e validação de seqüência para chamadas de função ODBC Liste o nome e telefone de cada representante
Driver O driver é a DLL (biblioteca) que implementa as chamadas de funções ODBC, escritas pela Microsoft ou pelo fornecedor de BD Conversão de dados para os padrões ODBC Conversão de códigos de erros para os padrões ODBC Tratamento de transações Acesso a arquivos não-dbms, como Excel, texto Suporte limitado da SQL: somente SELECT, INSERT, CREATE, DROP Ampla faixa de funções em diferentes drivers Verifique os níveis de conformidade: ODBC e SQL (não são os mesmos!) A API de ODBC oferece funções para determinar as capacidades