A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

©Silberschatz, Korth and Sudarshan (modificado)6.1.1Database System Concepts Capítulo 6: Integridade e Segurança Restrições ao Domínio Integridade Referencial.

Apresentações semelhantes


Apresentação em tema: "©Silberschatz, Korth and Sudarshan (modificado)6.1.1Database System Concepts Capítulo 6: Integridade e Segurança Restrições ao Domínio Integridade Referencial."— Transcrição da apresentação:

1 ©Silberschatz, Korth and Sudarshan (modificado)6.1.1Database System Concepts Capítulo 6: Integridade e Segurança Restrições ao Domínio Integridade Referencial Asserções Triggers Segurança e Autorizações

2 ©Silberschatz, Korth and Sudarshan (modificado)6.1.2Database System Concepts Restrições ao Domínio As restrições de integridade impõem-se para garantir que os dados fiquem protegidos contra “estragos” acidentais. Devem asseguram que da actualização dos dados não resulta a perda da consistência. Restrições ao domínio são a forma mais elementar de restrição de integridade. Testam condições sobre valores a introduzir em atributos. Fazem- no, restringindo o domínio do atributo em causa. Em SQL isso é feito no momento em que se define a tabela A forma mais comum de restrição ao domínio é a proibição do valor null (em SQL, colocando not null depois do atributo). Em SQL, podem-se impor outras restrições usando, depois dum nome de atributo A, check(condição(A 1,...,A n )) onde condição(...) denota uma condição imposta sobre os atributos A 1,...,A n.

3 ©Silberschatz, Korth and Sudarshan (modificado)6.1.3Database System Concepts Exemplos de restrições ao domínio create table alunos( num_aluno number(6) not null, nome varchar2(30) not null, local varchar2(25), data_nsc date not null, sexo char(1) not null check ( sexo in ( 'F', 'M' ) ), cod_curso number(3) not null); create table produtos( id_produto number(6) not null, nome varchar2(30) not null, iva number(2) not null check ( iva in (0, 5,12,21) ) ); create table branch(branch_namechar(15), branch_citychar(30) assetsnumbercheck (assets >= 0));

4 ©Silberschatz, Korth and Sudarshan (modificado)6.1.4Database System Concepts Integridade Referencial Garante que um valor que ocorre numa relação para um certo conjunto de atributos também ocorre num outro conjunto de atributos de outra relação.  Exemplo: Se “Perryridge” é o nome de uma agência que ocorre num dos tuplos da relação loan, então existe um tuplo na relação branch para o balcão “Perryridge”. Definição Formal  Sejam r 1 (R 1 ) e r 2 (R 2 ) duas relações com chaves primárias K 1 e K 2 respectivamente.  O subconjunto  de R 2 é uma chave externa referindo K 1 na relação r 1, se para todo t 2 em r 2 existe um tuplo t 1 em r 1 tal que t 1 [K 1 ] = t 2 [  ].  Uma restrição de integridade referencial é um tipo de dependência de inclusão porque pode ser formalizada através de   (r 2 )   K1 (r 1 ) »e.g.  branch_name (loan)   branch_name (branch)

5 ©Silberschatz, Korth and Sudarshan (modificado)6.1.5Database System Concepts Integridade de referência e tuplos soltos Tuplos soltos – Tuplos que “desaparecem” numa junção.  Considere as relações r 1 (R 1 ) e r 2 (R 2 )  Um tuplo t de r i (i = 1 ou i=2) é um tuplo solto se t não pertence a:  Ri (r 1 r 2 ) Dizer que A de r 1 é uma chave externa referindo A em r 2 (assumindo que A é o único atributo comum a R 1 e R 2 ) é o mesmo que dizer que:  r 1 não pode ter tuplos soltos na junção com r 2, ou que  r 1 r 2 = r 1 r 2

6 ©Silberschatz, Korth and Sudarshan (modificado)6.1.6Database System Concepts Tuplos soltos - Exemplo branch_namebranch_city Lx1 Lx2 Lisboa assets 10000 20000 loan_nramount L-170 L-230 3000 4000 branch_name Lx1 Caparica loan branch branch_city Lisboa assets 10000 loan_nramount L-1703000 branch_name Lx1 loan branch branch_city Lisboa assets 10000 20000 loan_nramount L-170 null 3000 null branch_name Lx1 Lx2 branch loan Tuplo solto Não causa qualquer problema

7 ©Silberschatz, Korth and Sudarshan (modificado)6.1.7Database System Concepts Tuplos soltos - Exemplo loan_nramount L-170 L-230 3000 4000 branch_name Lx1 Caparica loan branch_namebranch_city Lx1 Lx2 Lisboa assets 10000 20000 branch branch_city Lisboa null assets 10000 null loan_nramount L-170 L-230 3000 4000 branch_name Lx1 Caparica loan branch branch_city Lisboa assets 10000 loan_nramount L-1703000 branch_name Lx1 loan branch Tuplo solto indesejável Não queremos permitir  Há que garantir que loan branch = loan branch  Ou seja que branch_name em loan é chave externa referindo branch

8 ©Silberschatz, Korth and Sudarshan (modificado)6.1.8Database System Concepts Integridade de referência e ER Independentemente da cardinalidade, para r criar tabela: r(chave_de_E1, chave_de_E2)  chave_de_E1 em r é chave externa referindo E1  chave_de_E2 em r é chave externa referindo E2 Cuidado com as simplificações de tabelas redundantes quando a cardinalidade é de um para vários! r E1 E2

9 ©Silberschatz, Korth and Sudarshan (modificado)6.1.9Database System Concepts Integridade de referência e ER A relação de E1 (resp. E2) tem como atributos os atributos locais a E1, mais chave_de_G.  chave_de_G é chave primária de E1  chave_de_G em E1 é chave externa referindo G Nada impõe (ainda) sobre restrições de pertença ou completude!! G E1E2 isa

10 ©Silberschatz, Korth and Sudarshan (modificado)6.1.10Database System Concepts Verificação da Integridade Referencial e Modificação da Base de Dados Os testes abaixo devem ser efectuados de modo a preservar- se a seguinte restrição de integridade referencial:   (r 2 )   K (r 1 ) Inserção. Se um tuplo t 2 é inserido em r 2, o sistema tem de garantir que existe um tuplo t 1 em r 1 tal que t 1 [K] = t 2 [  ]. Ou seja t 2 [  ]   K (r 1 ) Remoção. Se um tuplo t 1 é removido de r 1, o sistema deve calcular o conjunto de tuplos em r 2 que referenciam t 1 :   = t 1 [K] (r 2 ) Se este conjunto não é vazio, ou o comando de remoção é rejeitado, ou os tuplos que referenciam t 1 devem ser eles próprios removidos (remoções em cascata são possíveis).

11 ©Silberschatz, Korth and Sudarshan (modificado)6.1.11Database System Concepts Modificação da Base de Dados (Cont.) Actualização. Existem duas situações:  Se um tuplo t 2 é actualizado na relação r 2 em que é modificado o valor da chave externa , então é efectuado um teste similar ao da inserção. Seja t 2 ’ o novo valor do tuplo t 2. O sistema deve garantir que t 2 ’[  ]   K (r 1 )  Se o tuplo t 1 é actualizado em r 1, e a operação altera o valor da chave primária (K), então é efectuado um teste semelhante ao da remoção. O sistema deve calcular   = t 1 [K] (r 2 ) usando o valor anterior de t 1 (o valor antes da actualização). Se o conjunto é não vazio, a actualização pode ser rejeitado, ou a actualização pode ser propagada em cascata, ou os tuplos podem ser removidos.

12 ©Silberschatz, Korth and Sudarshan (modificado)6.1.12Database System Concepts Integridade Referencial em SQL As chaves primárias, candidatas e externas podem ser especificadas na instrução SQL create table:  A cláusula primary key da instrução create table inclui a lista de dos atributos que formam a chave primária.  Uma cláusula unique key da instrução create table inclui uma lista de atributos que formam uma chave candidata.  Uma cláusula foreign key da instrução create table inclui quer uma lista de atributos que constituem uma chave externa quer o nome da relação (e eventualmente nomes de atributos) referenciada por essa chave externa.

13 ©Silberschatz, Korth and Sudarshan (modificado)6.1.13Database System Concepts Integridade de referência em SQL Em SQL tuplos com valor null são ignorados no teste de integridade referencial:  Em SQL se  de R 2 é uma chave externa referindo K 1 na relação r 1 então para todo t 2 em r 2 tal que nenhum dos atributos de  em t 2 tem valor null, tem que existir um tuplo t 1 em r 1 tal que t 1 [K 1 ] = t 2 [  ].  Facilita em certos casos: E.g. relação chefe_de em empregados no que se refere ao topo da hierarquia.  Quando não se pretende isto, podem-se sempre especificar os atributos em  como not null. A integridade de referência é verificada apenas no final duma transacção  Passos intermédios podem violar a integridade referencial desde que passos posteriores a reponham  Caso contrário seria impossível criar alguns estados da base de dados, e.g. inserir dois tuplos cujas chaves externas apontam um para o outro (e.g. atributo cônjuge da relação casado)

14 ©Silberschatz, Korth and Sudarshan (modificado)6.1.14Database System Concepts Integridade Referencial em SQL – Exemplo create table cursos(cod_curso number(3) not null, nome varchar(35) not null primary key (cod_curso)); create table cadeiras(cod_cadeira number(3) not null, …, primary key (cod_cadeira )); create table curso_cadeira( cod_curso number(3) not null, cod_cadeira number(3) not null, semestre number(2) not null, primary key (cod_curso, cod_cadeira), foreign key (cod_curso) references cursos, foreign key (cod_cadeira) references cadeiras);

15 ©Silberschatz, Korth and Sudarshan (modificado)6.1.15Database System Concepts Outro exemplo create table alunos( num_aluno number(6) not null, …, cod_curso number(3) not null, primary key (num_aluno), unique (num_aluno, cod_curso) foreign key cod_curso references curso); create table inscricoes( num_aluno number(6) not null, cod_curso number(3) not null, cod_cadeira number(5) not null, data_inscricao date not null, …, primary key (num_aluno, cod_curso, cod_cadeira, data_inscricao), foreign key (num_aluno, cod_curso) references alunos(num_aluno, cod_curso), foreign key (cod_curso, cod_cadeira) references curso_cadeira); create table curso_cadeira( cod_curso number(3) not null, cod_cadeira number(3) not null, …, primary key (cod_curso, cod_cadeira), …);

16 ©Silberschatz, Korth and Sudarshan (modificado)6.1.16Database System Concepts Acções em Cascata em SQL create table account... foreign key(branch_name) references branch on delete cascade on update cascade... ) Com as cláusulas on delete cascade, se a remoção de um tuplo na relação branch resulta na violação da restrição da integridade referencial, a remoção propaga-se em “cascata” para a relação account, removendo o tuplo que referia a agência que tinha sido eliminada. Actualizações em cascata são semelhantes.

17 ©Silberschatz, Korth and Sudarshan (modificado)6.1.17Database System Concepts Acções em cascata em SQL (cont.) Se existe uma cadeia de dependências de chaves externas através de várias relações, com um on delete cascade especificado em cada dependência, uma remoção ou actualização num dos extremos pode-se propagar através de toda a cadeia. Se uma remoção ou actualização em cascata origina uma violação de uma restrição que não pode ser tratada por uma outra operação em cascata, o sistema aborta a transacção. Como resultado, todas as alterações provocadas pela transacção e respectivas acções em cascata serão anuladas. Alternativas às operações em cascata:  on delete set null  on delete set default


Carregar ppt "©Silberschatz, Korth and Sudarshan (modificado)6.1.1Database System Concepts Capítulo 6: Integridade e Segurança Restrições ao Domínio Integridade Referencial."

Apresentações semelhantes


Anúncios Google