Вы находитесь на странице: 1из 30

Captulo 5: Integridade e Segurana

 Restries ao Domnio
 Integridade Referencial
 Asseres
 Triggers
 Segurana e Autorizaes

Database System Concepts 1 Silberschatz, Korth and Sudarshan (modificado)


Triggers
 Um trigger um comando que executado automaticamente
pelo sistema, como side-effect duma modificao base de
dados dum determinado tipo pr-definido.
 Para definir um trigger, h que:
 Especificar que evento faz disparar trigger
 Especificar em que condies o trigger deve ser.
 Especificar que aco fazer quando o trigger executado.
 So conhecidos como event-condition-action rules
 Os triggers so armazenados na base de dados, e executados
para todos as interaces com esta.
 O Oracle suporta triggers, embora com uma sintaxe ligeiramente
diferente da do SQL.

Database System Concepts 2 Silberschatz, Korth and Sudarshan (modificado)


Exemplo de Trigger
 Imagine uma situao em que o banco aceita que haja saldos
negativos e, nesses casos:
 coloca o saldo a 0
 cria um emprstimo com o valor em dvida
 Atribui a este emprstimo um nmero idntico ao da conta de
depsito
 O trigger deve ser executado sempre que h uma actualizao
na relao account que faz com que o saldo passe a negativo.

Database System Concepts 3 Silberschatz, Korth and Sudarshan (modificado)


Codificao do Exemplo em SQL:1999
create trigger overdraft_trigger after update on account
referencing new row as nrow
for each row
when nrow.balance < 0
begin atomic
insert into borrower
(select customer_name, account_number
from depositor
where nrow.account_number =
depositor.account_number);
insert into loan values
(nrow.account_number, nrow.branch_name,
nrow.balance);
update account set balance = 0
where account.account_number = nrow.account_number
end

Database System Concepts 4 Silberschatz, Korth and Sudarshan (modificado)


Eventos e Aces de Triggers em SQL
 Os eventos que podem fazer disparar um trigger so insert, delete ou
update
 No Oracle, tambm podem disparar triggers eventos de servererror,
logon, logoff, startup e shutdown.
 Triggers sobre update podem-se restringuir s a alguns atributos
 E.g. create trigger overdraft_trigger after update of balance on account
 Pode-se referenciar o valor dos atributos antes e depois da modificao
 referencing old row as : para deletes e updates
 referencing new row as : para inserts e updates
 Pode-se fazer disparar um trigger antes do evento, para codificar
restries. E.g. converter espaos em null.
create trigger setnull_trigger before update on r
referencing new row as nrow
for each row
when nrow.phone_number =
set nrow.phone_number = null
 Para alm do before e do after no Oracle existe tambm o instead of.

Database System Concepts 5 Silberschatz, Korth and Sudarshan (modificado)


Aces Externas
 Por vezes podemos querer que um dado evento faa disparar uma aco
para o exterior.
 Por exemplo, numa base de dados de uma armazm, sempre que a
quantidade de um produto desce abaixo (devido a um update) de um
determinado valor podemos querer encomendar esse produto, ou disparar
algum alarme.
 Os triggers no podem ser usados para implementar aces sobre o
exterior, mas...
 podem ser usados para guardar numa tabela separada aces-a-levar-a-cabo.
Podem depois haver procedimentos que, periodicamente verificam essa tabela
separada.
 E.g. Uma base de um armazm com as tabelas
 inventario(item, quant): Que quantidade h de cada produto
 quantMin(item, quant) : Qual a quantidade mnima de cada produto
 reposicoes(item, quant): Quanto encomendar sempre que est em falta
 aencomendar(item, quant) : Coisas a encomendar (lido por procedimento)

Database System Concepts 6 Silberschatz, Korth and Sudarshan (modificado)


Exemplo de Aces Externas
create trigger aenc_trigger after update of quant on inventario
referencing old row as orow, new row as nrow
for each row
when nrow.quant < = some (select quant
from quantMin
where quantMin.item = orow.item)
and orow.quant > some (select quant
from quantMin
where quantMin.item = orow.item)
begin
insert into aencomendar
(select item, quant
from reposicoes
where reposicoes.item = orow.item)
end

Database System Concepts 7 Silberschatz, Korth and Sudarshan (modificado)


Sintaxe de Triggers em Oracle
create [or replace] trigger <nome_trigger>
{before | after | instead of} <evento>
[referencing old as <nome_antes>]
[referencing new as <nome_depois>]
for each row
when <condio>
begin
<Sequencia de comandos, terminados por ;>
end;
/
 Evento pode ser:
 delete on <tabela ou view>
 insert on <tabela ou view>
 update on <tabela ou view>
 update of <atributos separados por ,> on <tabela ou view>
 servererror, logon, logoff, startup ou shutdown
 Os comandos so PL/SQL o que inclui os comandos SQL, mais
WHILEs, IFs, etc (ver manuais)
 Dentro da condio os nome_antes e nome_depois podem ser usados
sem mais. Mas nos comandos tm que ter o smbolo : antes!!!

Database System Concepts 8 Silberschatz, Korth and Sudarshan (modificado)


Statement Triggers
 So executados aps (antes, ou em vez de) uma instruo
completa vs. os anteriores que so executadas aps alteraes
em cada linha
 Sintaxe:
create [or replace] trigger <nome_trigger>
{before | after | instead of} <evento>
begin
<Sequencia de comandos, terminados por ;>
end;

 Para ser usado quando as condies so para testar


globalmente e no linha a linha.

Database System Concepts 9 Silberschatz, Korth and Sudarshan (modificado)


Uso de triggers
 Podem usar-se para implementar assertions, fazendo
raise_application_error quando as condies no se verificam.
 No usar triggers:
 Quando as restries podem ser impostas doutra forma!!
 Os triggers so mais difceis de manter e so menos eficientes.
 Quando se querem manter sumrios
 Para tal usem-se views e se eficincia for importante usem-se
materialized views

 Os triggers permitem uma grande generalidade na imposio de


restries e, tambm por isso mesmo, devem ser usados com
grande cuidado.

Database System Concepts 10 Silberschatz, Korth and Sudarshan (modificado)


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 curso_cadeira(


cod_curso number(3) not null,
cod_cadeira number(3) not null, ,
primary key (cod_curso, cod_cadeira), );

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);

Database System Concepts 11 Silberschatz, Korth and Sudarshan (modificado)


Triggers para actualizao de vistas
 Podemos utilizar triggers para efectuar modificaes atravs de
vistas.
 Para tal, criamos triggers para todas as operaes permitidas,
como por exemplo:
 para a inserco (do tipo instead of insert on),
 para a remoo (do tipo instead of delete on)
 para a actualizao (do tipo instead of update on).
 Consideremos a vista:
create view info_emprstimos as
select loan_number, customer_name, amount
from borrower natural inner join loan

Database System Concepts 12 Silberschatz, Korth and Sudarshan (modificado)


Triggers para actualizao de vistas
 Se quisermos permitir a remoo de emprstimos atravs da
vista, criamos o trigger:
create trigger remove_emprstimos
instead of delete on info_emprstimos
referencing old row as orow
for each row
begin
delete from loan
where loan_number = orow. loan_number ;
delete from borrower
where loan_number = orow. loan_number ;
end

Database System Concepts 13 Silberschatz, Korth and Sudarshan (modificado)


Triggers para actualizao de vistas
 Se quisermos permitir a insero de emprstimos atravs da
vista, criamos o trigger:
create trigger insere_emprstimos
instead of insert on info_emprstimos
referencing new row as nrow
for each row
begin
insert into loan
values (nrow.loan_number, NULL, amount);
insert into borrower
values (nrow.customer_name, nrow.loan_number)
end

Database System Concepts 14 Silberschatz, Korth and Sudarshan (modificado)


Triggers para actualizao de vistas
 Se quisermos permitir a actualizao do valor do emprstimo
atravs da vista, criamos o trigger:
create trigger actualiza_emprstimos
instead of update of amount on info_emprstimos
referencing new row as nrow
referencing old row as orow
for each row
begin
update loan
set amount = nrow. amount
where loan_number = orow. loan_number ;
end

Database System Concepts 15 Silberschatz, Korth and Sudarshan (modificado)


Triggers para insero de chaves
 Se quisermos preencher automaticamente a chave de um tuplo,
aquando da sua insero, recorrendo a uma sequncia:
create trigger chave_aluno
before insert on alunos
for each row
declare
aluno_id number;
begin
select seq_aluno.nextval
into aluno_id
from dual;
:new.num_aluno := aluno_id;
end

Database System Concepts 16 Silberschatz, Korth and Sudarshan (modificado)


Segurana
 Segurana ao contrrio das restries de
integridade, que pretendiam proteger a base de
dados contra estragos acidentais, a segurana
preocupa-se com proteger a base de dados de
estragos propositados.
 A nvel do sistema operativo
 A nvel da rede
 A nvel fsico
 A nvel humano
 A nvel da base de dados
 Mecanismos de autenticao e autorizao para permitir
acessos selectivos de (certos) utilizadores a (certas) partes dos
dados

Database System Concepts 17 Silberschatz, Korth and Sudarshan (modificado)


Autorizaes
Diferentes formas de autorizao em dados da bases de dados:

 Autorizao de leitura permite ler, mas no modificar dados.

 Autorizao de insero permite inserir novos tuplos, mas


no modificar tuplos existentes.
 Autorizao de modificao permite modificar tuplos, mas
no apag-los.
 Autorizao de remoo permite apagar tuplos

Database System Concepts 18 Silberschatz, Korth and Sudarshan (modificado)


Autorizaes (Cont.)
Diferentes formas de autorizao, para alterar esquemas:
 Autorizao de index permite criar e apagar ficheiros de
index.
 Autorizao de resources permite criar novas relaes.
 Autorizao de alterao permite criar e apagar atributos
duma relao.
 Autorizao de drop permite apagar relaes.

Database System Concepts 19 Silberschatz, Korth and Sudarshan (modificado)


Autorizaes e Vistas
 Pode-se dar autorizao a utilizadores sobre uma vista, sem se
lhe dar autorizao sobre as tabelas que a definem
 Isto permite no s melhorar a segurana dos dados, como
tambm tornar mais simples o seu uso
 Uma combinao de segurana a nvel de tabelas, com
segurana a nvel de vistas, pode ser usada para limitar o
acesso de um utilizador apenas aos dados de que ele necessita.

Database System Concepts 20 Silberschatz, Korth and Sudarshan (modificado)


Autorizaes e Vistas
 A criao de uma vista no requer autorizao resources pois,
de facto, nenhuma nova tabela criada
 Quem cria uma vista , fica exactamente com os mesmo
privilgios sobre esta que tinha sobre as tabelas.
 E.g. o criador duma vista cust_loan sobre as tabelas borrower e
loan, que s tenha autorizao de leitura sobre estas tabelas, s
fica com autorizao de leitura sobre a vista que criou

Database System Concepts 21 Silberschatz, Korth and Sudarshan (modificado)


Atribuio de Privilgios
 A passagem de privilgios de um utilizador para outro pode ser
representada por um grafo de autorizaes.
 Os ns do grafo so utilizadores.
 A raiz o administrador da base de dados.
 Considere o grafo abaixo, para e.g. escrita numa relao.
 Um arco Ui Uj indica que o utilizador Ui atribuiu ao utilizador Uj
privilgio de escrita sobre essa relao..
U1 U4

DBA U2 U5

U3
Database System Concepts 22 Silberschatz, Korth and Sudarshan (modificado)
Grafo de atribuio de privilgios
U1 U4
 Requisito: Todos os arcos tm que fazer
parte de algum caminho com origem no DBA U2 U5
administrador.
 Se o administrados retira o privilgio a U1: U3

 Deve ser retirado privilgio a U4 (pois U1 j no tem autorizao)


 No deve ser retirado a U5 (pois U5 tem autorizao vinda de U2)
 Devem ser prevenidos ciclos: U7

 Administrador d privilgios a U7
DBA
 U7 d privilgios a U8
 U8 d privilgios a U7 U8
 DBA retira privilgios de U7
 Deve retirar autorizao de U7 para U8 e de U8 para U7 (pois j
no h caminho do administrador nem para U7 nem para U8).

Database System Concepts 23 Silberschatz, Korth and Sudarshan (modificado)


Especificaes de Segurana em SQL
 O comando grant usado para atribuir privilgios
grant <lista de privilgios>
on <nome de relao ou view> to <lista de utilizadores>
 <lista de utilizadores> :
 Um user-id
 public, o que atribui o privilgios a todos os utilizadores
 Um perfil (role) veremos frente
 A atribuio de privilgios sobre uma vista no se propaga s
relaes nela usadas.
 Quem atribui o privilgio tem que o ter (ou ser o administrador
da base de dados).

Database System Concepts 24 Silberschatz, Korth and Sudarshan (modificado)


Privilgios em SQL
 select: permite acesso de leitura sobre a relao ou vista
 Exemplo: dar a U1, U2, e U3 autorizao de leitura na relao
branch:
grant select on branch to U1, U2, U3
 insert: permite inserir tuplos
 update: permite usar o comando update do SQL
 delete: permite apagar tuplos.
 references: permite a declarao de chaves externas.
 all privileges: forma sumria de atribuir todos os privilgios.

Database System Concepts 25 Silberschatz, Korth and Sudarshan (modificado)


Privilgio de atribuir privilgios
 with grant option: autoriza um utilizador a passar um privilgio
a outros utilizadores.
 Exemplo:
grant select on branch to U1 with grant option
d a U1 o privilgio select sobre a relao branch e autoriza U1 a
passar esse privilgio a qualquer outro utilizador

Database System Concepts 26 Silberschatz, Korth and Sudarshan (modificado)


Perfis
 Um perfil permite atribuir, de apenas uma vez, privilgios iguais
para uma classe de utilizadores
 Podem ser atribudos e retirados privilgios a perfis de
utilizadores, da mesma forma que a utilizadores isolados.
 Podem-se associar perfis a utilizadores, ou mesmo a outros
perfis
 Exemplo:
create role caixa
create role gerente

grant select on branch to caixa


grant update (balance) on account to caixa
grant all privileges on account to gerente
grant caixa to gerente
grant caixa to maria, scott
grant gerente to ana

Database System Concepts 27 Silberschatz, Korth and Sudarshan (modificado)


Retirar de privilgios em SQL
 O comando revoke serve para retirar privilgios.
revoke <privilgios>
on <relao ou view> from <utilizadores> [restrict|cascade]
 Exemplo:
revoke select on branch from U1, U2, U3 cascade
 Se se colocar cascade, retirar privilgios de um utilizador
tambm os pode retirar a outros, conforme descrito pelo grafo.
 Se se usar restrict s retirado privilgio a esse utilizador
revoke select on branch from U1 restrict
Com restrict, o comando revoke falha (d erro) se esse
utilizador j passou o privilgio a outros.

Database System Concepts 28 Silberschatz, Korth and Sudarshan (modificado)


Retirar de privilgios em SQL (Cont.)
 <privilgios> pode ser all. Nesse caso so retirados todos os
privilgios que foram atribudos pelo utilizador que deu o
comando.
 Se <utilizadores> incluir public todos os utilizadores perdem
esse privilgio, a no ser que lhe tenha sido atribudo
explicitamente.
 Se o mesmo privilgio for atribudo duas vezes por utilizadores
diferentes, ento quem o tem pode ficar com ele mesmo depois
dum revoke (cf. grafo).
 Todos os privilgios que dependem do privilgio retirado, so
tambm retirados.

Database System Concepts 29 Silberschatz, Korth and Sudarshan (modificado)


Limitao a autorizaes em SQL
 SQL no permite autorizaes a nvel de tuplo
 E.g. no se pode restringir de forma a que um aluno s possa ver
as suas notas.
 Neste caso, a tarefa de autorizao cai sobre as aplicaes (o
que indesejvel, mas o SQL aqui no ajuda).
 Ou ento definir vistas e dar autorizaes apenas a essas vistas

Database System Concepts 30 Silberschatz, Korth and Sudarshan (modificado)

Вам также может понравиться