Banco de Dados II Profa MSc. Tanisi Carvalho Profa MSc. Simone Vicari Notas de Aula Banco de Dados II Sumário 1 GERÊNCIA DE TRANSAÇÕES ................................................................................................................. 3 1.1 PROPRIEDADES DA TRANSAÇÃO ................................................................................................................ 4 1.2 ESTADOS DA TRANSAÇÃO ......................................................................................................................... 4 2 CONTROLE DE CONCORRÊNCIA ......................................................................................................... 7 2.1 PROBLEMAS ASSOCIADOS À EXECUÇÃO CONCORRENTE DE TAS................................................................ 8 2.2 MECANISMOS PARA CONTROLE DE CONCORRÊNCIA ................................................................................. 9 2.2.1 Bloqueio simples ................................................................................................................................ 9 2.2.2 Bloqueio de Duas Fases (2PL) ........................................................................................................ 10 2.3 DEADLOCK ............................................................................................................................................... 12 2.3.1 Prevenção de Deadlock ................................................................................................................... 12 2.3.2 Detecção e Recuperação de Deadlock ............................................................................................ 13 2.4 GRANULARIDADE MÚLTIPLA .................................................................................................................. 13 3 RECUPERAÇÃO APÓS FALHAS ........................................................................................................... 17 3.1 PROJETO DE UM SUBSISTEMA DE RECOVERY........................................................................................... 17 3.2 PROCEDIMENTOS PARA RECUPERAÇÃO DE FALHAS BASEADOS EM LOG ................................................ 18 3.2.1 Checkpoints ..................................................................................................................................... 20 4 SEGURANÇA EM SGBDS ........................................................................................................................ 22 4.1 AUTORIZAÇÃO DE ACESSO ...................................................................................................................... 23 4.1.1 Criando usuários ............................................................................................................................. 23 4.1.2 Concedendo/Revogando privilégios de acesso ................................................................................ 23 4.1.3 Roles ................................................................................................................................................ 24 4.1.4 Sinônimos ........................................................................................................................................ 25 5 VISÕES ........................................................................................................................................................ 26 5.1 USO DE VISÕES ........................................................................................................................................ 27 5.2 PROBLEMAS ASSOCIADOS ÀS VISÕES ....................................................................................................... 28 6 RESTRIÇÕES DE INTEGRIDADE ......................................................................................................... 29 6.1 CLASSIFICAÇÃO DAS RESTRIÇÕES DE INTEGRIDADE................................................................................ 29 6.1.1 Segundo seu alcance........................................................................................................................ 29 6.1.2 Segundo o momento do teste ........................................................................................................... 29 6.1.3 RIs que regulamentam a atualização de valores ............................................................................. 29 6.1.4 RIs que devem ser testadas na ocorrência de eventos externos ...................................................... 30 6.2 RESTRIÇÕES DE INTEGRIDADE NO MODELO RELACIONAL ....................................................................... 30 6.2.1 Restrição de domínio ....................................................................................................................... 30 6.2.2 Restrição de valor nulo (NULL) ...................................................................................................... 31 6.2.3 Restrição de chave primária............................................................................................................ 31 6.2.4 Restrição de integridade referencial ............................................................................................... 31 6.3 ESPECIFICAÇÃO DE RESTRIÇÕES DE INTEGRIDADE .................................................................................. 31 7 ANEXOS ...................................................................................................................................................... 33 7.1 ARQUITETURA BÁSICA DE UM SGBD...................................................................................................... 33 7.2 ARQUITETURA DO GERENCIADOR DE BANCO DE DADOS ......................................................................... 34 -2- Banco de dados II 1 Gerência de Transações Um conceito bastante importante no contexto de sistemas gerenciadores de banco de dados (SGBDs) é o conceito da transação: A transação é uma unidade de trabalho do usuário (da aplicação) que é atômica do ponto de vista da aplicação [DAT 81] A transação é uma unidade de execução de programa que acessa e, possivelmente, atualiza vários itens de dados. Geralmente, é o resultado da execução de um programa escrito em uma linguagem de manipulação de dados de alto nível ou em uma linguagem de programação (por exemplo, SQL, COBOL, C ou Pascal) [SIL 99] A partir dos dois conceitos acima é importante definir que: a transação sempre leva o banco de dados de um estado inicial consistente a um outro final, também consistente; a transação é atômica, ou seja, a transação deve ser tratada pelo SGBD como uma unidade única, ou todas as alterações devem estar no BD ou nada deve acontecer. Normalmente, as transações definidas em linguagens de manipulação apresentam comandos para marcar o início e o fim da transação (begin transaction/end transaction). A Figura 1.1-1 apresenta um exemplo de uma transação que retira R$ 100,00 de uma Conta Bancária. A Figura 1.1-2 apresenta o mesmo exemplo em SQL. Begin transaction Read(Cta=x, saldo) Saldo = saldo - 100 (valor informado) Write(cta=x, saldo) end transaction Figura 1.1-1: Exemplo de transação Como pode ser observado na Figura 1.1-2, não aparece o comando de início de transação. O padrão SQL92 define que uma transação inicia a partir do primeiro comando SQL, todos os comandos subseqüentes são considerados da mesma transação até que seja encontrado um comando de fim de transação (COMMIT ou ROLLBACK). UPDATE CONTA SET saldo = saldo - 100 WHERE nro_conta = x; COMMIT; Figura 1.1-2: Exemplo de transação em SQL Capítulo 1: Gerência de Transações Banco de Dados II 1.1 Propriedades da Transação Para garantir a integridade do banco de dados é necessário que o sistema de banco de dados mantenha as seguintes propriedades da transação: Atomicidade: o programa que representa a transação deve, ou executar por completo e com sucesso sobre o banco de dados, ou deve parecer nunca ter executado (Lei do Tudo-Ou-Nada). Essa propriedade é, normalmente, garantida pelo SGBD, através de seu componente de recuperação após falhas; Consistência: a transação só pode realizar operações corretas, do ponto e vista da aplicação, sobre o banco de dados. Isto é, a transação não pode transgredir qualquer restrição de integridade (RI) declarada ao SGBD (restrições de integridade de chave primária e restrições de integridade de chave estrangeira. Isolamento: em um ambiente multiusuário (multiprogramado), a execução de uma transação não deve ser influenciada pela execução de outras. Essa propriedade é, normalmente, garantida pelo SGBD, através do módulo de Controle de Concorrência (scheduler); Durabilidade: os resultados de uma transação que termina com sucesso devem permanecer inalterados, no banco de dados, até que outra transação os altere e também termine com sucesso. Isto é, os resultados de transações que terminam com sucesso devem sobreviver a falhas ( de transação, de sistema ou de meio de armazenamento. A Durabilidade também é garantida pelo componente de recuperação após falhas. As transações que seguem estas quatro propriedades são também conhecidas como transações ACID. 1.2 Estados da Transação Uma transação pode concluir sua execução com sucesso ou não. Quando uma transação não conclui com sucesso, a propriedade da atomicidade deve ser garantida, isso significa que todas as modificações feitas sobre o banco de dados, por essa transação, devem ser desfeitas (rollback). Se, no entanto, a transação conclui com sucesso seus efeitos estão materializados no banco de dados e ela é dita committed. Podemos dizer que uma transação, ao longo da sua execução, passa por vários estados: ativa: é o estado inicial, uma transação fica nesse estado enquanto estiver executando; em efetivação: após a execução da última declaração; em falha: após a descoberta de que a execução normal não poderá se realizar; abort: depois que a transação foi desfeita e o banco de dados foi restabelecido ao estado anterior ao início da execução da transação; commit: após a conclusão com sucesso da transação. A Figura 1.3 apresenta o diagrama de estados correspondente a uma transação. Capítulo 1: Gerência de Transações -4- Banco de Dados II Em efetivação Commit Ativa Em Falha Abort Figura 1.3: Diagrama de Estados da Transação Enquanto uma transação estiver executando ela estará no estado ativa. No momento em que a transação concluir a execução da última declaração ela entra no estado de efetivação. Uma transação não vai direto para o estado de commit, porque o SGBD precisa concluir uma série de operações como, por exemplo, atualizar arquivos de log, atualizar o banco de dados, para garantir as propriedades de atomicidade e durabilidade. O estado de efetivação é uma preparação para o commit. Pode ocorrer que durante esse estado ocorra alguma falha e a transação não possa ser concluída normalmente. Nessa situação, a transação passa de um estado de efetivação para um estado em falha onde todos os efeitos da transação deverão ser desfeitos. Uma transação passará para o estado de commit quando todas as operações necessárias estiverem concluídas. A partir desse momento a aplicação teria conhecimento de que a transação realmente concluiu. O estado abort se dará quando uma vez detectada a falha o estado do banco de dados, anterior à falha, tenha sido estabelecido. A Figura 1.4 apresenta um esquema mostrando a relação existente entre o programa de aplicação e a execução de uma transação pelo SGBD (Gerente de Transações). Capítulo 1: Gerência de Transações -5- Banco de Dados II Ações da Aplicação Ações do Gerente de Transações Begin Transaction (BOT) Inicia ações padrão para UNDO. Garantia de atomicidade da TA Seqüência de operações DML associadas a RIs Execução das operações DML e teste de Ris imediatas, com mensagem de erro End of Transaction (EOT) Teste de Ris Postergadas com mensagem de erro e UNDO Ações padrão para REDO. Garantia de durabilidade Avisa aplicação/usuário do final da TA Figura 1.4: Ações da Aplicação x Ações do Gerente de Transações Uma transação começa a executar quando uma instrução Begin Transaction é encontrada. O gerente de transações deve então executar um conjunto de ações para garantir a atomicidade de uma transação no caso de uma falha. A aplicação continua executando as suas operações. estas operações são processadas pelo SGBD, as restrições de integridade associadas são testadas. A aplicação envia a declaração de fim de Transação. A partir desse momento a transação está em estado de efetivação, o SGBD testa as restrições de integridade postergadas, que só podem ser testadas no fim, executada as ações de REDO para garantir a durabilidade e, por fim, envia um aviso a aplicação de que a transação foi concluída com sucesso. Nesse ponto, a transação passa a ser commit e seus efeitos estão materializados no banco de dados. No caso de uma falha, o sistema precisa executar um conjunto de operações para garantir a atomicidade e a transação é abortada. Bibliografia utilizada no capítulo: [BER 87] BERNSTEIN, Philip A; HADZILACOS, Vassos; GOODMAN, Nathan. Concurrency Control and Recovery in Database Systems. Reading:Addison-Wesley, 1987. [DAT 81] DATE, Chris. J. An Introduction to Database Systems. Reading:Addison-Wesley, 1983, p. 112123. [IOC 95] IOCHPE, Cirano. Notas de Aula CMP97 – Sistemas de Banco de Dados. Curso de PósGraduação em Ciência da Computação, 1995. [SIL 99] SILBERSCHATZ, Abraham.; KORTH, Henry F.; SUDARSHAN, S. Sistema de Banco de Dados. 3ª edição., São Paulo: Makron Books, 1999. Capítulo 1: Gerência de Transações -6- Banco de dados II 2 Controle de Concorrência O controle de concorrência é a atividade de coordenar a ação de processos que operam em paralelo, acessam dados compartilhados e, portanto, interferem uns com os outros. Quando duas ou mais transações executam concorrentemente, suas operações podem ser processadas, pelo sistema de computação, de forma intercalada (interleaving). A Figura 2-1 apresenta um exemplo da execução serial das transações T1, T2 e T3 e da execução interleaving das mesmas transações. T1 T1 T2 T2 T3 T1 T3 T2 T1 tempo Figura 2-1: Exemplos de execuções das transações T1, T2 e T3 A execução concorrente das transações permite um melhor aproveitamento dos recursos do sistema. A execução de uma transação geralmente envolve operações de E/S liberando o uso da CPU, tornando-a ociosa. Esse tempo de CPU pode ser destinado à execução de outra transação. A idéia central é manter em paralelo o processamento da E/S e da CPU melhorando, assim, o throughput do sistema (número de transações executadas por unidade de tempo). Um outro aspecto é que em um sistema podem existir transações longas e transações curtas. Se a execução for seqüencial, então pode ocorrer da transação curta ter que aguardar pela transação longa acarretando em um tempo de resposta maior (tempo que uma transação leva para começar a responder à solicitação realizada). A Figura 2-1 apresenta um exemplo dessa situação, a transação T3 tem que aguardar a execução de T1 e T2; já na execução interleaving, o tempo de T3 é melhorado. Na Figura 2-2 temos a arquitetura do SGBD do ponto de vista de gerência de transações: gerente de transações: executa as operações do banco de dados e das transações, passando-as para o scheduler; scheduler: controla a ordem da execução das operações read, write, commit e abort de diferentes transações que são executadas, garantindo o isolamento. As ações do scheduler podem ser: executar, rejeitar ou postergar a operação que chega para o scheduler; Capítulo 2: Controle de Concorrência -7- Banco de dados II gerente de recuperação: responsável pela finalização das transações (garante a atomicidade e a durabilidade); gerente de buffers: armazena parte do banco de dados em memória durante a execução das transações. É responsável pela tansferência dos dados entre o disco e memória principal. T1 T2 T3 .... Tn Gerente de Transações Scheduler Gerente de Dados Gerente de Recuperação Falhas Gerente de Buffers Banco de Dados /LOG Figura 2-2 Gerência de Transações 2.1 Problemas associados à execução concorrente de TAs Quando se tem transações executando concorrentemente pode-se levar o banco de dados a um estado inconsistente. Problemas que podem existir sem um mecanismo de controle de concorrência: Atualização perdida: ocorre quando uma atualização de uma transação é sobreescrita pela atualização de outra transação, fazendo com que uma delas seja perdida; a) execução serial T1 read(x) x=x-10 write(x) read(y) Y=y+10 write(y) commit b) execução não serial T1 T2 read(x) x=x-10 read(x) x=x+100 write(x) Commit write(x) read(y) y=y+n write(y) commit T2 read(x) x=x+100 write(x) commit Capítulo 2: Controle de Concorrência -8- Banco de dados II TAs não recuperáveis: Uma transação não pode se basear em dados de uma transação que ainda não foi efetivada (princípio da recuperabilidade). T3 read(x) x=x-10 write(x) T4 read(x) x=x+100 write(x) commit read(y) rollback T4 considerou T3 concluída com sucesso o que não é verdadeiro!!! 2.2 Mecanismos para Controle de Concorrência Os mecanismos de controle de concorrência têm por objetivo permitir a concorrência garantido o princípio da serializabilidade. Serão estudados três implementações de mecanismos de controle de concorrência: marcas de tempo (timestamp); versões. bloqueios (locking); 2.2.1 Bloqueio simples Consiste em estabelecer bloqueios sobre o dado a ser acessado pela transação, de modo a restringir o acesso a este dado. A unidade de bloqueio, geralmente, é a de registro. Quanto menor for a granularidade de bloqueio, maior o grau de concorrência. São definidos dois tipos de bloqueios: Exclusivo (E): se uma transação obteve um bloqueio E em um dado, então a transação pode ler e escrever neste dado. Compartilhado (C): se uma transação obteve um bloqueio C em um dado, esta transação e as demais podem somente ler este dado Matriz de Compatibilidade de Bloqueios: C E Capítulo 2: Controle de Concorrência -9- Banco de dados II C E X X X Quando uma transação Ti deseja acessar um dado, ela deve primeiro bloqueá-lo com um dos dois tipos de bloqueio, dependendo da operação desejada. Se o dado já está bloqueado com tipo incompatível, Ti precisa esperar até que todos os bloqueios incompatíveis sejam liberados. Tão logo o dado deixe de ser utilizado o bloqueio deve ser liberado. T1 lock_E(x) read(x) x=x-1 write(x) unlock(x) T2 lock_E(x) espera ... ... ... lock_E(x) x=x+100 write(x) unlock(x) Um dos problemas associados a este protocolo é o fato dos bloqueios serem liberados muito cedo. Observe o exemplo abaixo: T3 T4 sum=0 lock_C(x) read(x) unlock(x) sum=sum+x lock_C(y) lock_E(x) x=x-10 write(x) unlock(x) commit read(y) unlock(y) sum-sum+y O protocolo de bloqueio simples não garante o isolamento por completo. No exemplo acima, caso T4 seja abortada T3 foi efetivada com valores de x que não existiram no banco de dados (atomicidade para T4). 2.2.2 Bloqueio de Duas Fases (2PL) O mecanismo de bloqueio de duas fases (Two-Phase Lock), garante a serializabilidade tratando os bloqueios em duas fases: fase de aquisição (growing phase): nesta fase a transação apenas adquire os bloqueios; Capítulo 2: Controle de Concorrência - 10 - Banco de dados II fase de liberação (shrinking phase): nesta fase a transação somente libera bloqueios. A partir do momento que o primeiro bloqueio é liberado nenhum bloqueio pode ser adquirido pela transação. O Strict 2PL garente execuções concorrentes serializáveis, recuperáveis, evita o cascating abort e liberando os bloqueios apenas no commit ou rollback. O mecanismo funciona de forma análoga ao mecanismo de bloqueios simples, diferenciando-se apenas pela forma como são tratadas a aquisição e a liberação de bloqueios. T1 read(x) x=x-10 T2 T1 Lock_E(x) x=x-10 T2 read(x) x=x+100 write(x) commit write(x) read(y) y=y+10 write(y) commit lock_E(x) espera ... ... ... ... ... ... ... ... ... continua ... write(x) lock_E(y) read(y) y=y+10 write(y) commit unlock(x,y) A implementação do mecanismo 2PL tem algumas variações conforme mostra a Figura 2-3. As variações caracterizam-se pela forma como são implementadas as fases de aquisição e liberação de bloqueios. 2PL Estrito 2PL Básico BOT EOT BOT 2PL Conservativo EOT BOT EOT Figura 2-3: Variações do mecanismo 2PL Na versão 2PL Básico, os bloqueios são liberados à medida que a transação deixa de utilizá-los. Isso pode acarretar num problema conhecido como aborto em cascata (cascading abort). Uma vez que o bloqueio foi liberado, este dado pode ser utilizado por qualquer outra transação, assim se a transação não concluir com sucesso, outras transações terão se baseado em um dado intermediário levando a uma inconsistência do banco de dados. Capítulo 2: Controle de Concorrência - 11 - Banco de dados II A implementação estrita resolve esta situação liberando os bloqueios apenas no final e em um momento único, garantindo com isso que o problema de aborto em cascata não ocorra. Esta implementação pode ter ainda uma otimização, permitindo que os bloqueios compartilhados sejam liberados deixando apenas os bloqueios exclusivos. A implementação estrita é a mais utilizada comercialmente. Uma característica dos protocolos baseados em bloqueios são as situações de impasse (deadlocks). Uma situação de impasse ocorre quando uma transação está a espera de um dado que está bloqueado por uma segunda transação e esta está a espera de um dado segurado pela primeira. As situações de deadlock são indesejáveis, pois degradam o desempenho. Este assunto será detalhado na próxima sessão. A implementação conservativo evita que o deadlock ocorra, pois solicita todos os dados de antemão. Esta abordagem, no entanto, tende a diminuir o throughput do sistema, visto que uma transação não vai utilizar todos os dados ao mesmo. Além disso, é difícil saber quais dados serão utilizados por uma transação. Esta implementação pode levar a outro problema conhecido como postergação definida, situação em que uma transação fica a espera de um evento que nunca venha a ocorrer. Uma outra característica dos protocolos de bloqueios é que alguns sistemas permitem iniciar o bloqueio como compartilhado e depois passar este bloqueio para o modo exclusivo (lock upgrade/downgrade). A vantagem disso é que pode-se retardar a aquisição de bloqueios no modo exclusivo, permitindo assim um maior grau de concorrência. Tanto para o upgrade ou downgrade a matriz de compatibilidade de bloqueios deve ser obedecida. Isso pode acarretar em situações de deadlock. 2.3 Deadlock Uma situação que pode ocorrer em sistemas concorrentes é conhecida por impasse ou deadlock (abraço mortal). O deadlock está associado a utilização de recursos compartilhados que só podem ser utilizados de forma exclusiva, no caso de banco de dados, os dados utilizados pelas transações. Um sistema está em deadlock sempre que uma transação Ti está esperando por um item de dado que está bloqueado por uma transação Tj e Tj está esperando por um item de dado que está bloqueado por Ti. Há dois métodos para resolver um deadlock: utilizar alguma técnica que evite a sua ocorrência; possuir mecanismos para detecção e recuperação de deadlock. 2.3.1 Prevenção de Deadlock Há duas abordagens para a prevenção de deadlock. Uma garante que nenhum ciclo de espera poderá ocorrer pela ordenação de solicitações de bloqueio, ou pela aquisição de todos os bloqueios juntos. A outra faz com que a transação seja refeita, em vez de esperar por um bloqueio, sempre que a espera possa potencialmente decorrer em deadlock. Capítulo 2: Controle de Concorrência - 12 - Banco de dados II Pela primeira abordagem, cada transação é obrigada a bloquear todos os itens de dados antes de sua execução. Além disso, ou todos os dados são bloqueados de uma só vez ou nenhum será. Há duas desvantagens nesse protocolo: a dificuldade de prever, antes da transação começar, quais itens de dados deverão ser bloqueados. Segundo, a utilização do item de dado pode ser bastante reduzida já que os dados podem ser bloqueados e não ser usados por um longo período de tempo. Pela segunda, são utilizados timeouts para decidir se uma transação deve ficar em wait ou deve ser refeita (REDO). Se o tempo de espera ultrapassar um valor x, a transação é abortada independente de ter ocorrido o deadlock ou não. 2.3.2 Detecção e Recuperação de Deadlock As técnicas de detecção e recuperação são utilizadas quando o subsistema de controle de concorrência não possui nenhum mecanismo de prevenção de deadlock. Normalmente a detecção é feita pela geração de um grafo de espera, onde a ocorrência de ciclos indica a presença de deadlock. Para recuperar do deadlock é necessário que uma ou mais transações sejam selecionadas como vítimas para serem abortadas. Para a seleção das vítimas podem ser utilizados critérios como, por exemplo, a transação mais recente, o quanto falta para uma transação terminar, quantas atualizações a transação realizou ou até mesmo nenhum critério (por facilidades de implementação). Um problema é decidir quando o algoritmo de detecção deve ser acionado. Se os intervalos forem curtos, muito overhead. Se forem intervalos longos, pode-se levar muito tempo para verificar que um deadlock ocorreu. Grafo de espera: é criado um nó para cada transação do sistema se Ti está esperando por um dado utilizado por Tj, é criada uma borda Ti Tj quando o dado é liberado, a borda é removida ocorre um dealock quando o grafo contiver um ciclo T1 T2 2.4 Granularidade Múltipla Os exemplos de bloqueios apresentados até agora se referiam a bloquear um registro por vez. Existe, porém, situações em que é vantajoso bloquear diversos itens de dados, tratando-os como uma unidade de acesso do que bloquear um registro. Por exemplo: atualização de todos os dados de um arquivo; Capítulo 2: Controle de Concorrência - 13 - Banco de dados II leitura de todos os dados do banco de dados; Nessas situações é mais interessante bloquear todo o arquivo, pois em uma única solicitação todo o arquivo estará bloqueado e o tempo necessário para realizar os bloqueios (de cada registro) é evitado. Em contrapartida, se a transação necessita de apenas um registro, bloquear todo o arquivo é desnecessário e, também, elimina a concorrência. É importante, então, que o sistema permita definir múltiplos níveis de granularidade de bloqueio. A granularidade de bloqueio é, então, a porção de itens de dados que pode ser bloqueada por uma transação. As granularidades mais usuais são: registro (tupla); página; arquivo (tabela). Isso pode ser implementado através de uma árvore de granularidade, onde cada nodo representa a porção de dados (grão) que está sendo bloqueada e existe uma hierarquia entre os nodos. Observe a Figura 2-4: BD A2 A1 Arq a ra1 ... Arq b ran rb1 ... Arq c rbn rc1 ... rcn Figura 2-4: Árvore de Granularidades Um banco de dados (BD) pode ser dividido em áreas (A). Cada área pode ser dividida em um ou mais arquivos e cada arquivo possui um ou mais registros. Princípio do bloqueio de grãos: quando uma transação bloqueia um determinado grão (ou nodo), ela bloqueia também todos os nodos filhos deste grão no mesmo modo de bloqueio; quando uma transação bloqueia um grão, todos os seus ancestrais devem ser bloqueados intencionalmente no mesmo modo de bloqueio. Modos de bloqueio: compartilhado (C): o nodo e toda a sua subárvore estão bloqueados explicitamente no modo compartilhado; Capítulo 2: Controle de Concorrência - 14 - Banco de dados II exclusivo (E): o nodo e toda a sua subárvore estão bloqueados explicitamente no modo exclusivo; compartilhado intencional (CI): um nodo com este bloqueio significa que algum bloqueio compartilhado explícito está sendo mantido na sua subárvore; exclusivo intencional (EI): um nodo com este bloqueio significa que algum bloqueio exclusivo explícito está sendo mantido na sua subárvore; compartilhado e exclusivo intencional (EI): um nodo está bloqueado explicitamente no modo compartilhado e algum nodo na sua subárvore está bloqueado explicitamente no modo exclusivo; CI EI C CEI E CI V V V V F EI V V F F F C V F V F F CEI V F F F F E F F F F F Regras: 1) respeitar a matriz de compatibilidade dos modos de bloqueio 2) a raiz da árvore precisa ser bloqueada primeira e pode ser bloqueada em qualquer modo 3) um nodo n pode ser bloqueado por Ti no modo C ou CI apenas se os pais de n estão correntemente bloqueados por Ti no modo EI ou CI 4) Um nodo n pode ser bloqueado por Ti no modo E, CEI, ou EI apenas se os pais de n estão correntemente bloqueados por Ti no modo EI ou CEI 5) Ti pode bloquear um nodo apenas se ele não desbloqueou nenhum nodo antes (segue a técnica de bloqueio de duas fases) 6) Uma Ti pode desbloquear um nodo apenas se nenhum dos filhos estiver bloqueado por Ti. O protocolo de granularidade múltipla exige que os bloqueios sejam feitos de cima para baixo (top-down – da raiz para as folhas), enquanto a liberação deve ser de baixo para cima (bottom-up – das folhas para a raiz). Esse protocolo aumenta a concorrência e reduz o overhead por bloqueio. Isso é particularmente útil em aplicações que misturam: Capítulo 2: Controle de Concorrência - 15 - Banco de dados II Transações curtas que mantêm acesso em poucos itens de dados; Transações longas que produzem relatórios a partir d eum arquivo ou de um conjunto de arquivos. Os seguintes fenômenos podem ocorrer: leitura suja (dirty reads): ocorre quando uma transação tem acesso aos dados modificados por uma transação que ainda não concluiu, ou seja, a transação está acessando dados intermediários. Leituras não repetidas (Nonrepeatable Read): A TA faz a mesma consulta em vários momentos e encontra valores diferentes que foram modificados ou deletados. Leitura fantasma (Phantom reads): A TA faz a mesma consulta com uma determinada condição que retorna um conjunto de valores, esta mesma consulta é executada novamente e retorna mais linhas, que foram adicionadas por TAs commited e que satisfazem a condição. Bibliografia utilizada no capítulo: [BER 87] BERNSTEIN, Philip A; HADZILACOS, Vassos; GOODMAN, Nathan. Concurrency Control and Recovery in Database Systems. Reading:Addison-Wesley, 1987. [CON 98] CONNOLLY, Thomas; BEGG, Carolyn. Database Systems – a practical approach to design, implementation and management. Harlow:Addison-Wesley, 1998. [IOC 95] IOCHPE, Cirano. Notas de Aula CMP97 – Sistemas de Banco de Dados. Curso de PósGraduação em Ciência da Computação, 1995. [SIL 99] SILBERSCHATZ, Abraham.; KORTH, Henry F.; SUDARSHAN, S. Sistema de Banco de Dados. 3ª edição., São Paulo: Makron Books, 1999. Capítulo 2: Controle de Concorrência - 16 - Banco de dados II 3 Recuperação Após Falhas Diversas falhas podem ocorrer em um sistema de computador como, por exemplo, queda de energia, falha na unidade de armazenamento físico, falha no programa de aplicação. Tais falhas podem tornar os dados armazenados no banco de dados inconsistentes, fazendo com que testes e procedimentos sejam incorporados ao SGBD para tratamento dessas falhas. O módulo do SGBD responsável por essa tarefa é chamado de recuperação após falhas ou recovery. O objetivo do subsistema de recovery é levar o banco de dados a um estado consistente após uma falha que o tenha deixado em um estado não consistente. Para que isso ocorra, todo o sistema de recovery está baseado na redundância de informações. Essa redundância normalmente é obtida a partir das seguintes hierarquias de armazenamento: Arquivos de log: correspondem a arquivos que mantém um histórico das transações executadas. Contém as informações necessárias para reconstruir o estado mais recente do database buffer e, normalmente, estão armazenados em disco. Suporta falhas de sistema; Archive log: é uma cópia de um estado consistente do banco de dados. Suporta falhas de mídia (disco). É armazenado em discos ou fitas magnéticas. Arquivos de backup: correspondem às cópias de segurança. Podem estar armazenadas em disco ou fita magnética e armazenam o conteúdo de um banco de dados consistente em um dado período do tempo. 3.1 Projeto de um Subsistema de Recovery O projeto de um subsistema de recovery deve levar em consideração: Meios de armazenamento de dados; Tipos de falhas e como estas falhas afetam a integridade dos dados armazenados; Procedimentos para recuperação destas falhas. Os meios de armazenamento podem ser divididos em: Meio de armazenamento volátil: caracteriza-se pela perda dos conteúdos armazenados em caso de falta de energia. Por exemplo, a memória principal; Meio de armazenamento não volátil (físico): caracteriza-se por manter o conteúdo armazenado, mesmo em caso de falta de energia. Exemplo: memória secundária (discos e fitas magnéticas). Com relação às falhas podemos caracterizar três tipos básicos: Falha de transação: erro detectado pela própria transação. Exemplo: overflow, divisão por zero, violação de proteção de memória. Qual o meio de Capítulo 4: Segurança em SGBDs - 17 - Banco de dados II armazenamento comprometido? Nenhum! Qual a ação a ser executada? Desfazer a transação. Falha de sistema: interrupção do sistema. Exemplo: queda de luz, falha no sistema operacional. Meio de armazenamento comprometido: volátil. Ação: desfazer as transações em execução no momento da falha que não foram concluídas. Falha no meio físico: perda total ou parcial do meio físico. Exemplo: falha no cabeçote de gravação do disco, erro de hardware. Meio de armazenamento comprometido: físico. Ações: acionar a última cópia de segurança e refazer transações executadas com sucesso após a última cópia. A partir dos tipos de falhas acima apresentados é possível identificar quatro ações a serem implementadas pelo mecanismo de recovery: transaction UNDO: desfaz os efeitos de uma única transação, garantindo a atomicidade (ou a transação é concluída com sucesso e seus efeitos são materializados no banco de dados, ou é como se a transação nunca tivesse existido); - Falha de Transação global UNDO: desfaz os efeitos de todas as transações atualmente sendo executadas, garantindo a atomicidade de um conjunto de transações; - Falha de sistema partial REDO: refaz os efeitos de um conjunto de transações que terminaram com sucesso (committed), os quais talvez não tenham sido salvos no BD; garante durabilidade - Falha de sistema global REDO: refaz os efeitos de um conjunto de transações que terminaram com sucesso (committed), independente do meio onde estes efeitos estejam armazenados. – Falha de disco A implementação das operações acima depende, no entanto, da forma como alguns aspectos do SGBD são implementados. Quatro aspectos devem ser analisados: tipo de propagação dos dados: como os dados são transferidos do buffer de dados para o banco de dados; gerência dos buffers: como determinar que buffers de dados serão liberados para outros dados; tratamento de EOT (end-of-transaction): quando uma transação termina com sucesso que tratamento recebem os dados que ainda estão nos buffers de dados; checkpoints: técnica utilizada para reduzir o esforço de recovery. Alguns sistemas permitem sua implementação. 3.2 Procedimentos para Recuperação de Falhas Baseados em LOG Periodicamente é realizada uma cópia do banco de dados. Cada mudança feita no banco de dados por uma transação fica registrada no arquivo de LOG (histórico). A estrutura do LOG é composta por três registros: <Início Ti> <Ti, nome arquivo, id-registro, atributo, valor antigo, valor novo> Capítulo 4: Segurança em SGBDs - 18 - Banco de dados II <Fim Ti> No caso de uma falha, é executado o seguinte algoritmo: 1. Aloca duas listas: lista-UNDO e lista-REDO 2. Percorre o arquivo de LOG do fim para o início até chegar ao primeiro registro de checkpoint, examinando cada registro: 2.1. se achou <Fim Ti>, adiciona Ti na lista-REDO 2.2. se achou <Inicio Ti> e Ti não está na lista-REDO, adiciona Ti na lista-UNDO 3. Quando se chega ao registro checkpoint, para cada transação Ti na lista de transações desse registro: 3.1. se Ti não estiver na lista-REDO, então adiciona Ti na lista-UNDO 4. Percorre o arquivo de LOG do fim para o início: 4.1. realizando UNDO(Ti) para todas as transações Ti existentes na lista-UNDO 4.2. marcando na lista-REDO as transações Ti cujos registros <Início Ti> estão sendo encontrados nessa varredura 5. caso todas as transações existentes na lista-UNDO tenham sido desfeitas e ficou alguma transação Ti não marcada na lista-REDO; 5.1. continua percorrendo o arquivo de LOG para trás até que todos os registros <Inicio Ti> das transações não marcadas na lista-REDO tenham sido encontradas 6. Percorre o arquivo de LOG para a frente, realizando REDO(Ti) para todas as transações existentes na lista-REDO. Esse algoritmo evita a varredura e a verificação de todas as transações existentes em todo o arquivo de LOG. A operação de REDO deve ser idempotente, ou seja, a execução do REDO(Ti) diversas vezes deve ser equivalente a executá-la apenas uma única vez! Exemplo: Suponha um ambiente bancário multiusuário e um arquivo de LOG com as seguintes informações num dado instante: <início T1> <T1, Conta, c1, 1000, 500> <início T2> <início T3> <T2, Conta, c2, 3000, 3500> <fim T1> <início T4> <T3, Conta, c3, 1500, 1200> <T2, Conta, c6, 500, 100> <T4, Conta, c8, 200, 0> <fim T3> <início T5> <T4, Conta, c9, 500, 600> Capítulo 4: Segurança em SGBDs - 19 - Banco de dados II <Inicio T6> <T5, Conta, c5, 100, 260> <fim T5> <T2, Conta, c7, 700, 850> <T6, Conta, c8, 200, 550> Supondo que a técnica de modificação imediata do banco de dados esteja sendo utilizada: a) que ações devem ser realizadas pelo subsistema de recovey caso ocorra: 1) uma falha da transação T4; 2) uma falha de sistema; b) se houvesse um registro de checkpoint imediatamente após o registro <início T4>, que ações deveriam ser realizadas se ocorresse uma falha de sistema? Antes da transação ser efetivada no banco de dados, ela deve estar gravada no LOG físico (WAL – Write Ahead Log). Como as modificações realizadas pela transação estão armazenadas no LOG, podese retardar o momento em que as mesmas serão transferidas para o banco de dados como, por exemplo, no momento da seleção de uma vítima. Em caso de falha de sistema, é necessário fazer o partial redo para recuperar as transações committed no momento da falha e o global undo para desfazer o efeito das transações que não haviam sido concluídas. No segundo caso, as modificações realizadas por uma transação são efetivadas no banco de dados no momento em que a transação está sendo executada (imediato). O procedimento WAL continua valendo, ou seja, primeiro a informação é armazenada no arquivo de log. A implementação da política force pode gerar problemas no processamento de transação, pois o overhead no sistema é maior. 3.2.1 Checkpoints Checkpoints são pontos de verificação que garantem que até aquele ponto os conteúdos dos buffers de LOG e do banco de dados foram descarregados nos respectivos meios físicos. Os checkpoints são executados periodicamente pelo sistema de recovery e tem por objetivo reduzir o esforço de recovery. Os seguintes passos são executados quando da ocorrência de um checkpoint: o buffer de LOG é descarregado para o arquivo de LOG; o buffer de dados é descarregado para o banco de dados físico; um registro de checkpoint é gravado no arquivo de LOG: <checkpoint <t1, t2, ..., tn>> Capítulo 4: Segurança em SGBDs - 20 - Banco de dados II Bibliografia utilizada no capítulo: [BER 87] BERNSTEIN, Philip A; HADZILACOS, Vassos; GOODMAN, Nathan. Concurrency Control and Recovery in Database Systems. Reading:Addison-Wesley, 1987. [SIL 99] SILBERSCHATZ, Abraham.; KORTH, Henry F.; SUDARSHAN, S. Sistema de Banco de Dados. 3ª edição., São Paulo: Makron Books, 1999. Capítulo 4: Segurança em SGBDs - 21 - Banco de dados II 4 Segurança em SGBDs O termo segurança, em banco de dados, refere-se à proteção do banco de dados contra acessos intencionais ou não intencionais utilizando controles baseados em computador ou não [CON 98] São considerados acessos intencionais aqueles realizados propositadamente, por exemplo, um usuário do sistema cede sua senha a pessoas não autorizadas. Acessos não intencionais são aqueles que, ao ocorrer, causam algum tipo de perda (por exemplo, perda da consistência do banco de dados ou perda de informação), mas não foram propositados. Exemplo, queda de energia que corrompe o banco de dados. Segundo [CON 98], o contexto de segurança pode ser analisado segundo as seguintes situações: roubo e fraude de informação; perda de confiabilidade; perda de privacidade; perda de integridade; perda de disponibilidade. Os controles que podem ser implementados podem ser baseados em computador ou não. Os controles não baseados em computador geralmente estão associados a políticas e planos de segurança estabelecidos pela organização. Exemplo: política para cessão de contas de usuários, os usuários devem trocar suas senhas mensalmente e não devem deixálas registradas em locais de fácil acesso. Os controles baseados em computador são agrupados nas seguintes categorias: autorização: refere-se a concessão de um direito ou de um privilégio a um usuário (ou a um programa) a acessar legitimamente o sistema ou um objeto do sistema; visões: é um mecanismo que permite estabelecer porções de dados que podem ser visualizados por um determinado usuário (ou programa); backup e recuperação de falhas: refere-se ao mecanismos necessários para garantir a disponibilidade do sistema em caso de falhas; integridade: refere-se aos controles que contribuem para manter a segurança do sistema evitando que dados inválidos sejam registrados no sistema (ver Capítulo 2); criptografia: refere-se à codificação dos dados a partir de um algoritmo especial que torna os dados impossibilitados de serem lidos sem que se tenha a chave de criptografia. Esse tópico não faz parte do escopo da disciplina; auditorias: tem por objetivo verificar os acessos que são realizados sobre o sistema e observar se os acessos realizados seguem as políticas de segurança propostas. Esse tópico não faz parte do escopo da disciplina. Capítulo 4: Segurança em SGBDs - 22 - Banco de dados II 4.1 Autorização de Acesso Os mecanismos de autorização envolvem duas abordagens: autenticação e autorização de acesso. A primeira tem por objetivo verificar se o usuário que tenta acessar o sistema é quem realmente diz ser. Em SGBDs, a autenticação é realizada através de senhas embora este recurso não seja totalmente garantido. O mecanismo de autorização permite conceder privilégios para cada um dos objetos aos usuários. Desse modo, apenas os usuários que têm privilégio sobre o objeto podem acessá-lo. Em SQL existe um conjunto de comandos DDL que permite criar usuários e conceder privilégios. 4.1.1 Criando usuários Os usuários são criados pelo administrador do sistema (DBA) e, geralmente, é o administrador do sistema que concede os privilégios que esse usuário terá. Exemplo: CREATE USER ALUNO IDENTIFIED BY ALUNOSENHA; A execução do comando acima criará um usuário chamado ALUNO, cuja senha é ALUNOSENHA. 4.1.2 Concedendo/Revogando privilégios de acesso O fato de criar um usuário não significa que ele terá acesso aos objetos do sistema. Em SQL, para que um usuário tenha acesso aos objetos do esquema ele deve receber, explicitamente, esse privilégio. Caso ele deixe de ter acesso aos objetos do esquema, os direitos deverão ser revogados, também, explicitamente. Quem pode conceder/revogar privilégios? A resposta é o proprietário do esquema já que, inicialmente, apenas ele tem conhecimento da existência do objeto. Que privilégios podem ser concedidos/revogados? Em SQL, os privilégios que podem ser atribuídos a objetos são: SELECT: permite recuperar dados de uma tabela; INSERT: permite inserir novas tuplas em uma tabela; UPDATE: permite modificar tuplas de uma tabela; DELETE: permite remover tuplas de uma tabela; EXECUTE: permite executar uma stored procedure; REFERENCES: permite referenciar colunas de uma tabela já existente (de outro esquema) em restrições de integridade. O comando SQL para conceder privilégios a um usuário é GRANT. Sintaxe: GRANT <privilégios> ON <nome tabela ou visão> TO <usuários>; Exemplo: autorização de leitura e atualização dos atributos da tabela Funcionário para o usuário Pedro. GRANT SELECT, UPDATE ON FUNCIONARIO TO PEDRO; Capítulo 4: Segurança em SGBDs - 23 - Banco de dados II Para revogar privilégios: REVOKE <privilégios> ON <nome tabela ou visão> FROM <usuários>; Exemplo: retirar a autorização de atualização sobre a tabela Funcionário do usuário Pedro. REVOKE UPDATE ON FUNCIONARIO FROM PEDRO; 4.1.3 Roles Como você pode observar, para cada objeto do esquema deve ser definido quais usuários terão direito sobre ele e que tipo de direito terão. Alguns SGBDs oferecem alguns recursos para facilitar a administração do sistema, as roles. Uma role (papel) consiste de um conjunto de privilégios que são definidos sobre uma tabela e que podem ser atribuídas a um usuário, facilitando a tarefa de concessão de privilégios. Usuário 1 Usuário 2 Tabela A Usuário 3 Tabela B Figura 4-1: Usuários e privilégios sobre tabelas A vantagem na utilização de roles é que se novas tabelas precisam ser acrescentadas, basta atribuir isso a role criada e todos os usuários passarão a ter esse privilégio. Além disso, se um novo usuário é acrescentado ao sistema, é necessário atribuir a ele apenas a role apropriada. O uso de roles é muito similar ao uso dos privilégios. Primeiro de tudo é necessário criar a role. Exemplo, definir um papel (role) que permita a recuperação de dados e a atualização de dados da tabela Funcionário e atribuir ao usuário Pedro: CREATE ROLE RL_FUNCIONARIO; Criada a role, atribui-se a ela os privilégios sobre os objetos: GRANT SELECT, UPDATE ON FUNCIONARIO TO RL_FUNCIONARIO; Finalmente, atribui-se a role ao usuário; GRANT RL_FUNCIONARIO TO PEDRO; Capítulo 4: Segurança em SGBDs - 24 - Banco de dados II Usuário 1 Usuário 2 Usuário 3 Role Tabela A Tabela B Figura 4-2: Usuários, privilégios sobre tabelas e roles Também é possível atribuir uma role a outra role. Por exemplo, se agora fosse criada uma role RL_DEPENDENTES que permite selecionar, inserir e atualizar Dependentes de um Funcionário e que o usuário Pedro pode executar essas operações. Pode-se fazer isso de duas formas: GRANT RL_FUNCIONARIO, RL_DEPENDENTES TO PEDRO; GRANT RL_DEPENDENTES TO RL_FUNCIONARIO; 4.1.4 Sinônimos Um outro recurso oferecido pelo SGBD ORACLE é o de sinônimo. Um sinônimo tem por objetivo oferecer transparência no acesso aos objetos. Quando um objeto é acessado por um usuário que não é o proprietário ele deve ser referenciado pelo [nome_do_proprietário.nome_do_objeto]. O sinônimo cria um apelido para um objeto: CREATE PUBLIC SYNONYM FUNCIONARIO FOR RH.FUNCIONARIO; Foi criado um sinônimo público para a tabela Funcionário, que pertence ao esquema RH, chamado Funcionário. A partir da criação do sinônimo todos os usuários que tiverem privilégio sobre a tabela Funcionário poderão referenciá-la como Funcionário, apenas. Esse capítulo apresentou alguns recursos que são oferecidos pelo SGBD Oracle, mas que podem estar presentes em outros SGBDs, também. Embora alguns desses recursos não estejam previstos na linguagem SQL, estes ainda assim foram apresentados para que você faça uma melhor utilização do SGBD nos exercícios práticos. Capítulo 4: Segurança em SGBDs - 25 - Banco de dados II 5 Visões As tabelas criadas em um banco de dados relacional têm existência física dentro do sistema de computação. Algumas vezes, porém, é necessário criar tabelas que não ocupem espaço físico, mas que possam ser utilizadas como as tabelas normais. Essas tabelas são chamadas de visões ou tabelas virtuais, pois não existem por si, mas parecem ao usuário como se fossem. Visões são, então, relações virtuais derivadas das relações do banco de dados. Uma visão é definida utilizando a instrução create view. Para definir uma visão é necessário definir um nome e estabelecer uma consulta. Em SQL a sintaxe é: create view <nome da visão> as <expressão da consulta> Onde: <expressão da consulta> é qualquer expressão de consulta legal da álgebra relacional; <nome da visão> é o nome da tabela virtual. A definição de uma visão é armazenada no dicionário de dados (catálogo) do sistema. Para o usuário, no entanto, é como se tivesse sido criada uma nova tabela no banco de dados. A visão criada é dita dinâmica, pois todas as modificações que forem executadas sobre a tabela origem (da qual a visão foi derivada) se refletirão sobre a mesma. Assim como as tabelas, as visões também podem ser removidas: drop view <nome da visão> A visão especificada é eliminada (isto é, sua definição é removida do dicionário de dados) e todas as visões definidas em termos desta visão também são automaticamente anuladas. Exemplos: CREATE VIEW DadosPac AS SELECT cod_pac, nome FROM Pacientes DROP VIEW DadosPac Uma vez definida a visão, o nome pode ser usado para referenciar a relação virtual que a visão gera. Nomes de visões podem aparecer em qualquer lugar em que um nome de relação possa aparecer. Capítulo 6: Restrições de Integridade - 26 - Banco de dados II 5.1 Uso de visões Podemos ressaltar as seguintes vantagens na utilização das visões: pode-se “preparar o terreno” para usuários casuais que não entendem de processamento de dados, e aos quais não se deseja entrar nos detalhes de comandos SQL mais complexos; pode-se simplificar consultas criando visões com as consultas mais comuns que envolvem muitas tabelas; permitem que um mesmo dado seja visto por diferentes usuários de diferentes formas (ao mesmo tempo); na segurança de dados, isto é, a limitação do acesso por parte das pessoas indesejáveis. Para isso, pode-se criar uma visão e fornecê-la como relação “existente” para esses usuários, porém com a ocultação de dados. Por exemplo, pode-se criar uma visão com os dados apenas dos funcionários que ganham menos do que 5000, ou apenas dos funcionários do departamento de Informática (usando uma junção com Departamentos e Funcionários, por exemplo). Essas restrições de acesso podem ser divididas em geral nas restrições do acesso apenas a algumas colunas inteiras de uma ou mais relações ou a apenas algumas de suas linhas, ou um misto de ambas. Exemplos: uso na segurança de acesso (autorização): Um funcionário do hospital não deve ter acesso a todos os dados pessoais de um paciente, somente ao seu código e nome: CREATE VIEW DadosPac AS SELECT cod_pac, nome FROM Pacientes para simplificar consultas: Pode ser interessante vincular os dados de um médico aos dados de suas consultas. CREATE VIEW MedCons AS SELECT nome, to_char(data_hora,’dd/mm/yy hh24:mi:ss’) FROM Medico, Consultas WHERE medico.cod_med=consultas.cod_med Operações realizadas sobre uma visão se refletem diretamente sobre as tabelas físicas das quais ela deriva. Exemplos: a) o funcionário do hospital deseja buscar o nome de todos os pacientes cadastrados que começam com a letra R. SELECT nome FROM DadosPac Where nome LIKE ‘R%’ buscar a data das consultas do médico Pedro SELECT data_hora FROM MedCons WHERE nome = ‘Pedro’ Capítulo 6: Restrições de Integridade - 27 - Banco de dados II 5.2 Problemas associados às visões Visões são mecanismos úteis para simplificar consultas dos bancos de dados, mas modificações do banco de dados através de visões têm potencialmente conseqüências desvantajosas. Exemplos: Situação 1: Inserção de tuplas na visão MedCons. Problemas: violação da regra de integridade de entidade (não tenho o código do médico e do paciente); perde-se os relacionamentos entre médicos e consultas (algumas consultas não teriam resultados satisfatórios). Situação 2: visão que relaciona o total de consultas de um determinado paciente não podem suportar operações de insert, update e delete CREATE VIEW ConsPac (codp,totcons) AS SELECT codp, count(*) FROM consultas GROUP BY codp Visões são interessantes para facilitar consultas e estabelecer níveis de segurança. Entretanto, modificações utilizando visões podem gerar problemas devido à possibilidade de envolver várias tabelas e do fato de que uma visão pode apresentar apenas alguns atributos da relação, impossibilitando a realização de modificações sobre a mesma. Não é possível implementar visões atualizáveis que envolvam funções de agregação como, por exemplo, GROUP BY, CONNECT BY, DISTINCT. Capítulo 6: Restrições de Integridade - 28 - Banco de dados II 6 Restrições de Integridade As restrições de integridade são regras que determinam as operações válidas sobre o banco de dados, mantendo a consistência dos dados armazenados. Por operações válidas entende-se aquelas operações que mantém a relação entre o mundo real (do usuário ou da aplicação) e a sua representação no banco de dados. Pode-se dizer que existe um mapeamento das regras existentes no mundo real para o banco de dados A partir da definição, por parte do usuário, dos estados corretos e das transições de estado corretas, o SGBD deve garantir que o banco de dados reflita somente estes estados e que as operações sobre o banco de dados reflitam somente estas transições. Alguns exemplos de restrições de integridade: a) em campos do tipo numérico caracteres não são permitidos (com exceção do ponto decimal); b) um aluno não pode estar matriculado na mesma disciplina, mais de uma vez, no mesmo semestre; c) pela CLT, um funcionário não pode ter o seu salário rebaixado. No primeiro exemplo, a restrição de integridade é definida em mais baixo nível, sendo válida para qualquer aplicação. No segundo e terceiro exemplo, as restrições de integridade são definidas em mais alto nível e dependem da aplicação. 6.1 Classificação das Restrições de Integridade 6.1.1 Segundo seu alcance Refere-se ao volume de informação associada à RI a) atinge um único atributo de uma relação; b) atinge mais de um atributo da mesma tupla; c) atinge mais de uma tupla do mesmo tipo (mesma relação); d) atinge duas ou mais tuplas que podem ser de tipos diferentes (relações diferentes). 6.1.2 Segundo o momento do teste a) instantânea: sempre que o dado associado à RI for inserido ou atualizado, a RI deve ser testada; b) postergada: a RI só pode ser testada após uma série de operações sobre o banco de dados (típico em RI que atingem mais de uma tupla). 6.1.3 RIs que regulamentam a atualização de valores Referem-se a RIs baseadas em versões de valores de dados e RIs que levam em conta a relação (valor_antigo, valor_novo). Anexos - 29 - Banco de dados II Exemplo 1: o salário do empregado não pode ser rebaixado e-sal(novo_valor) >= e-sal(valor_atual) Exemplo 2: as transições do estado civil do empregado devem respeitar o seguinte grafo de precedências: VIÚVO SOLTEIRO CASADO SEPARADO DIVORCIADO Figura 6-1: Exemplo de Restrição de Integridade 6.1.4 RIs que devem ser testadas na ocorrência de eventos externos O momento do teste da RI é determinado pela aplicação. Exemplo: a partir de três meses de sua data de ingresso na empresa, o salário do empregado deve refletir o salário básico estipulado para sua função (piso salarial da categoria). 6.2 Restrições de Integridade no Modelo Relacional No modelo relacional as restrições de integridade podem ser agrupadas da seguinte forma: restrição de domínio; restrição de valor nulo (NULL); restrição de chave primária; restrição de integridade referencial.. 6.2.1 Restrição de domínio São a forma mais elementar de restrições de integridade. Especificam valores que podem ser definidos para um atributo, também estão associadas aos tipos de dados. Exemplos de domínios: Telefones: conjunto de números válidos dentro de um determinado código de área; Notas: valores entre 0 e 10,0; CEP: conjunto de CEP’s do Brasil válidos; Sexo: valores ‘M’e ‘F’; Tipos de dados: caractere, numérico, data. Anexos - 30 - Banco de dados II 6.2.2 Restrição de valor nulo (NULL) A restrição de valor nulo proíbe a inserção do valor nulo para um atributo. É útil para evitar que valores nulos sejam especificados para atributos onde se deseja obrigar que o dado seja informado. Em SQL, esta restrição é implementada a partir da cláusula NOT NULL. 6.2.3 Restrição de chave primária A restrição de chave primária refere-se ao fato da chave ser identificador único em uma tupla do banco de dados. A chave primária é fundamental para o modelo relacional uma vez que os valores da chave primária são utilizados como referências às tuplas identificadas por eles. Quando uma relação apresenta mais de uma chave, cada uma delas é uma chave candidata. A chave primária é aquela escolhida dentre as candidatas. Além disso, a chave primária não pode ter valor nulo. 6.2.4 Restrição de integridade referencial Representa referências de uma relação para outra, isto é, o relacionamento existente entre tuplas. Com isso, assegura-se que um valor que aparece em uma relação A, para um dado conjunto de atributos, aparece também para um certo conjunto de atributos, na outra relação – relação B. Se uma relação inclui uma chave estrangeira, então o valor desta chave só pode ser: nulo ou igual a algum valor na relação onde ela é chave primária. 6.3 Especificação de Restrições de Integridade Em SQL, as restrições de integridade de chave primária e referencial podem ser especificadas na própria cláusula CREATE TABLE. CREATE TABLE Empregados (cod_func NUMBER restrição de domínio CONSTRAINT pk_cod_func PRIMARY KEY restrição de chave primária CONSTRAINT ck_cod_func CHECK (cod_func BETWEEN 1 AND 999), restrição de domínio nome VARCHAR220) NOT NULL, restrição de campo nulo salario NUMBER(7,2), idade NUMBER(2), estado_civil NUMBER CONSTRAINT ck_estado_civil CHECK (estado_civil IN (1, 2, 3, 4,5)), restrição de domínio cod_depto CONSTRAINT fk_cod_depto REFERENCES Departamento(cod_depto) restrição de chave estrangeira ) Existem ainda as restrições de integridade próprias do contexto da aplicação. Essas podem ser especificadas através de: Anexos - 31 - Banco de dados II cláusula ASSERT; TRIGGERS. Anexos - 32 - Banco de dados II 7 ANEXOS 7.1 Arquitetura Básica de um SGBD Programadores Usuários DBA Programas de Aplicação Consultas Esquema do Banco de Dados Pré-processador de DML Processador de consulta Compilador de DDL Gerenciador de Banco de Dados Gerenciador Dicion.Dados Código objeto de programas SGBD Gerenciador de Arquivos Anexos - 33 - Banco de dados II 7.2 Arquitetura do Gerenciador de Banco de Dados Código objeto de programas Processador de consulta Gerenciador Dicion.Dados Autorização de Acesso Verificação de Integridade Gerente de Dados Processador de Comandos Otimizador de Consultas Gerente de Transações Scheduler Gerente de Buffers Gerente de Recuperação Falhas Gerenciador de Arquivos Banco de Dados e Dicionário de Dados Anexos - 34 -