Você está na página 1de 30
CapítuloCapítulo 5:5: IntegridadeIntegridade ee SegurançaSegurança Restrições ao Domínio Integridade
CapítuloCapítulo 5:5: IntegridadeIntegridade ee SegurançaSegurança
Restrições ao Domínio
Integridade Referencial
Asserções
Triggers
Segurança e Autorizações
Database System Concepts
1
©Silberschatz, Korth and Sudarshan (modificado)
TriggersTriggers Um trigger é um “comando” que é executado automaticamente pelo sistema, como side-effect duma
TriggersTriggers
Um trigger é um “comando” que é executado automaticamente
pelo sistema, como side-effect duma modificação à base de
dados dum determinado tipo pré-definido.
Para definir um trigger, há que:
Especificar que evento faz disparar trigger
Especificar em que condições o trigger deve ser.
Especificar que acção fazer quando o trigger é executado.
São conhecidos como event-condition-action rules
Os triggers são armazenados na base de dados, e executados
para todos as interacções com esta.
O Oracle suporta triggers, embora com uma sintaxe ligeiramente
diferente da do SQL.
Database System Concepts
2
©Silberschatz, Korth and Sudarshan (modificado)
ExemploExemplo dede TriggerTrigger Imagine uma situação em que o banco aceita que haja saldos negativos
ExemploExemplo dede TriggerTrigger
Imagine uma situação em que o banco aceita que haja saldos
negativos e, nesses casos:
coloca o saldo a 0
cria um empréstimo com o valor em dívida
Atribui a este empréstimo um número idêntico ao da conta de
depósito
O t i
r gger
d
eve ser execu a o sempre que
t
d
uma ac ua zaç o
t
li
ã
na relação account que faz com que o saldo passe a negativo.
Database System Concepts
3
©Silberschatz, Korth and Sudarshan (modificado)
CodificaçãoCodificação dodo ExemploExemplo emem SQL:1999SQL:1999 create trigger overdraft_trigger after update on
CodificaçãoCodificação dodo ExemploExemplo emem SQL:1999SQL: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)
EventosEventos ee AcçõesAcções dede TriggersTriggers emem SQLSQL Os eventos que podem fazer disparar um trigger
EventosEventos ee AcçõesAcções dede TriggersTriggers emem SQLSQL
Os eventos que podem fazer disparar um trigger são insert, delete ou
update
No Oracle, também 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 modificação
re erenc ng o
f
i
ld
row as
: para
d
e e es e up
l
t
d
a es
t
referencing new row as : para inserts e updates
Pode-se fazer disparar um trigger antes do evento, para codificar
restrições. E.g. converter espaços 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 além do before e do after no Oracle existe também o instead of.
Database System Concepts
5
©Silberschatz, Korth and Sudarshan (modificado)
AcçõesAcções ExternasExternas Por vezes podemos querer que um dado evento faça disparar uma acção para
AcçõesAcções ExternasExternas
Por vezes podemos querer que um dado evento faça disparar uma acção
para o exterior.
Por exemplo, numa base de dados de uma armazém, 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 não podem ser usados para implementar acções sobre o
exterior, mas
podem ser usados para guardar numa tabela separada acções-a-levar-a-cabo.
Podem depois haver procedimentos que, periodicamente verificam essa tabela
separada.
E.g. Uma base de um armazém com as tabelas
inventario(item, quant): Que quantidade há de cada produto
quantMin(item, quant) :
Qual a quantidade mínima 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)
ExemploExemplo dede AcçõesAcções ExternasExternas create trigger aenc_trigger after update of quant on inventario
ExemploExemplo dede AcçõesAcções ExternasExternas
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)
SintaxeSintaxe dede TriggersTriggers emem OracleOracle create [or replace] trigger <nome_trigger> {before |
SintaxeSintaxe dede TriggersTriggers emem OracleOracle
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 <condição>
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 são PL/SQL o que inclui os comandos SQL, mais
WHILEs, IFs, etc (ver manuais)
Dentro da condição os nome_antes e nome_depois podem ser usados
sem mais. Mas nos comandos têm que ter o símbolo ‘:’ antes!!!
Database System Concepts
8
©Silberschatz, Korth and Sudarshan (modificado)
StatementStatement TriggersTriggers São executados após (antes, ou em vez de) uma instrução completa vs. os
StatementStatement TriggersTriggers
São executados após (antes, ou em vez de) uma instrução
completa vs. os anteriores que são executadas após alterações
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 condições são para testar
globalmente e não linha a linha.
Database System Concepts
9
©Silberschatz, Korth and Sudarshan (modificado)
UsoUso dede triggerstriggers Podem usar-se para implementar assertions, fazendo raise_application_error quando as
UsoUso dede triggerstriggers
Podem usar-se para implementar assertions, fazendo
raise_application_error quando as condições não se verificam.
Não usar triggers:
Quando as restrições podem ser impostas doutra forma!!
Os triggers são mais difíceis de manter e são menos eficientes.
Quando se querem manter sumários
Para tal usem-se views e se eficiência for importante usem-se
materialized views
Os triggers permitem uma grande generalidade na imposição de
restrições e, também por isso mesmo, devem ser usados com
grande cuidado.
Database System Concepts
10
©Silberschatz, Korth and Sudarshan (modificado)
ExemploExemplo create table alunos( num_aluno number(6) not null, …, cod_curso number(3) not null, primary key
ExemploExemplo
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)
TriggersTriggers parapara actualizaçãoactualização dede vistasvistas Podemos utilizar triggers para efectuar
TriggersTriggers parapara actualizaçãoactualização dede vistasvistas
Podemos utilizar triggers para efectuar modificações através de
vistas.
Para tal, criamos triggers para todas as operações permitidas,
como por exemplo:
para a insercão (do tipo instead of insert on),
para a remoção (do tipo instead of delete on)
para a actualização (do tipo instead of update on).
Consideremos a vista:
create view info_empréstimos as
select loan_number, customer_name, amount
from borrower natural inner join loan
Database System Concepts
12
©Silberschatz, Korth and Sudarshan (modificado)
TriggersTriggers parapara actualizaçãoactualização dede vistasvistas Se quisermos permitir a remoção de
TriggersTriggers parapara actualizaçãoactualização dede vistasvistas
Se quisermos permitir a remoção de empréstimos através da
vista, criamos o trigger:
create trigger remove_empréstimos
instead of delete on info_empréstimos
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)
TriggersTriggers parapara actualizaçãoactualização dede vistasvistas Se quisermos permitir a inserção de
TriggersTriggers parapara actualizaçãoactualização dede vistasvistas
Se quisermos permitir a inserção de empréstimos através da
vista, criamos o trigger:
create trigger insere_empréstimos
instead of insert on info_empréstimos
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)
TriggersTriggers parapara actualizaçãoactualização dede vistasvistas Se quisermos permitir a actualização do valor
TriggersTriggers parapara actualizaçãoactualização dede vistasvistas
Se quisermos permitir a actualização do valor do empréstimo
através da vista, criamos o trigger:
create trigger actualiza_empréstimos
instead of update of amount on info_empréstimos
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)
TriggersTriggers parapara inserçãoinserção dede chaveschaves Se quisermos preencher automaticamente a chave de um
TriggersTriggers parapara inserçãoinserção dede chaveschaves
Se quisermos preencher automaticamente a chave de um tuplo,
aquando da sua inserção, recorrendo a uma sequência:
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)
SegurançaSegurança Segurança – ao contrário das restrições de integridade, que pretendiam proteger a base de
SegurançaSegurança
Segurança – ao contrário das restrições de
integridade, que pretendiam proteger a base de
dados contra estragos acidentais, a segurança
preocupa-se com proteger a base de dados de
estragos propositados.
A
A nível do sistema operativo
e
n ve
í
l d
a re
d
A nível físico
A nível humano
A nível da base de dados
Mecanismos de autenticação e autorização para permitir
acessos selectivos de (certos) utilizadores a (certas) partes dos
dados
Database System Concepts
17
©Silberschatz, Korth and Sudarshan (modificado)
AutorizaçõesAutorizações Diferentes formas de autorização em dados da bases de dados: Autorização de leitura
AutorizaçõesAutorizações
Diferentes formas de autorização em dados da bases de dados:
Autorização de leitura – permite ler, mas não modificar dados.
Autorização de inserção – permite inserir novos tuplos, mas
não modificar tuplos existentes.
Autorização de modificação – permite modificar tuplos, mas
não apagá-los.
Autorização de remoção – permite apagar tuplos
Database System Concepts
18
©Silberschatz, Korth and Sudarshan (modificado)
AutorizaçõesAutorizações (Cont.)(Cont.) Diferentes formas de autorização, para alterar esquemas: Autorização de
AutorizaçõesAutorizações (Cont.)(Cont.)
Diferentes formas de autorização, para alterar esquemas:
Autorização de index – permite criar e apagar ficheiros de
index.
Autorização de resources – permite criar novas relações.
Autorização de alteração – permite criar e apagar atributos
duma relação.
Autorização de drop – permite apagar relações.
Database System Concepts
19
©Silberschatz, Korth and Sudarshan (modificado)
AutorizaçõesAutorizações ee VistasVistas Pode-se dar autorização a utilizadores sobre uma vista, sem se lhe dar
AutorizaçõesAutorizações ee VistasVistas
Pode-se dar autorização a utilizadores sobre uma vista, sem se
lhe dar autorização sobre as tabelas que a definem
Isto permite não só melhorar a segurança dos dados, como
também tornar mais simples o seu uso
Uma combinação de segurança a nível de tabelas, com
segurança a nível 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)
AutorizaçõesAutorizações ee VistasVistas A criação de uma vista não requer autorização resources pois, de
AutorizaçõesAutorizações ee VistasVistas
A criação de uma vista não requer autorização resources pois,
de facto, nenhuma nova tabela é criada
Quem cria uma vista , fica exactamente com os mesmo
privilégios sobre esta que tinha sobre as tabelas.
E.g. o criador duma vista cust_loan sobre as tabelas borrower e
loan, que só tenha autorização de leitura sobre estas tabelas, só
fica com autorização de leitura sobre a vista que criou
Database System Concepts
21
©Silberschatz, Korth and Sudarshan (modificado)
AtribuiçãoAtribuição dede PrivilégiosPrivilégios A passagem de privilégios de um utilizador para outro pode ser
AtribuiçãoAtribuição dede PrivilégiosPrivilégios
A passagem de privilégios de um utilizador para outro pode ser
representada por um grafo de autorizações.
Os nós do grafo são utilizadores.
A raiz é o administrador da base de dados.
Considere o grafo abaixo, para e.g. escrita numa relação.
Um arco U i →U j indica que o utilizador U i atribuiu ao utilizador U j
privilégio de escrita sobre essa
U 1
U 4
DBA
U 2
U 5
U 3
Database System Concepts
22
©Silberschatz, Korth and Sudarshan (modificado)
GrafoGrafo dede atribuiçãoatribuição dede privilégiosprivilégios U 1 Requisito: Todos os arcos têm que fazer U
GrafoGrafo dede atribuiçãoatribuição dede privilégiosprivilégios
U 1
Requisito: Todos os arcos têm que fazer
U 4
parte de algum caminho com origem no
DBA
U 2
U 5
administrador.
Se o administrados retira o privilégio a U 1 :
U 3
Deve ser retirado privilégio a U 4 (pois U 1 já não tem autorização)
Não deve ser retirado a U 5 (pois U 5 tem autorização vinda de U 2 )
Devem ser prevenidos ciclos:
U 7
Administrador dá privilégios a U 7
U7 dá privilégios a U 8
U8 dá privilégios a U 7
DBA retira privilégios de U 7
DBA
U 8
Deve retirar autorização de U 7 para U 8 e de U 8 para U 7 (pois já
não há caminho do administrador nem para U 7 nem para U 8 ).
Database System Concepts
23
©Silberschatz, Korth and Sudarshan (modificado)
EspecificaçõesEspecificações dede SegurançaSegurança emem SQLSQL O comando grant é usado para atribuir
EspecificaçõesEspecificações dede SegurançaSegurança emem SQLSQL
O comando grant é usado para atribuir privilégios
grant <lista de privilégios>
on <nome de relação ou view> to <lista de utilizadores>
<lista de utilizadores> é:
Um user-id
public, o que atribui o privilégios a todos os utilizadores
Um perfil (role) – veremos à frente
A atribuição de privilégios sobre uma vista não se propaga às
relações nela usadas.
Quem atribui o privilégio tem que o ter (ou ser o administrador
da base de dados).
Database System Concepts
24
©Silberschatz, Korth and Sudarshan (modificado)
PrivilégiosPrivilégios emem SQLSQL select: permite acesso de leitura sobre a relação ou vista Exemplo: dar
PrivilégiosPrivilégios emem SQLSQL
select: permite acesso de leitura sobre a relação ou vista
Exemplo: dar a U 1 , U 2 , e U 3 autorização de leitura na relação
branch:
grant select on branch to U 1 , U 2 , U 3
insert: permite inserir tuplos
update: permite usar o comando update do SQL
delete: permite apagar tuplos.
references: permite a declaração de chaves externas.
all privileges: forma sumária de atribuir todos os privilégios.
Database System Concepts
25
©Silberschatz, Korth and Sudarshan (modificado)
PrivilégioPrivilégio dede atribuiratribuir privilégiosprivilégios with grant option: autoriza um utilizador a passar
PrivilégioPrivilégio dede atribuiratribuir privilégiosprivilégios
with grant option: autoriza um utilizador a passar um privilégio
a outros utilizadores.
Exemplo:
grant select on branch to U 1 with grant option
dá a U 1 o privilégio select sobre a relação branch e autoriza U 1 a
passar esse privilégio a qualquer outro utilizador
Database System Concepts
26
©Silberschatz, Korth and Sudarshan (modificado)
PerfisPerfis Um perfil permite atribuir, de apenas uma vez, privilégios iguais para uma classe de
PerfisPerfis
Um perfil permite atribuir, de apenas uma vez, privilégios iguais
para uma classe de utilizadores
Podem ser atribuídos e retirados privilégios 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)
RetirarRetirar dede privilégiosprivilégios emem SQLSQL O comando revoke serve para retirar privilégios. revoke
RetirarRetirar dede privilégiosprivilégios emem SQLSQL
O comando revoke serve para retirar privilégios.
revoke <privilégios>
on <relação ou view> from <utilizadores> [restrict|cascade]
Exemplo:
revoke select on branch from U 1 , U 2 , U 3 cascade
Se se colocar cascade, retirar privilégios de um utilizador
também os pode retirar a outros, conforme descrito pelo grafo.
Se se usar restrict só é retirado privilégio a esse utilizador
revoke select on branch from U 1 restrict
Com restrict, o comando revoke falha (dá erro) se esse
utilizador já passou o privilégio a outros.
Database System Concepts
28
©Silberschatz, Korth and Sudarshan (modificado)
RetirarRetirar dede privilégiosprivilégios emem SQLSQL (Cont.)(Cont.) <privilégios> pode ser all. Nesse caso
RetirarRetirar dede privilégiosprivilégios emem SQLSQL (Cont.)(Cont.)
<privilégios> pode ser all. Nesse caso são retirados todos os
privilégios que foram atribuídos pelo utilizador que deu o
comando.
Se <utilizadores> incluir public todos os utilizadores perdem
esse privilégio, a não ser que lhe tenha sido atribuído
explicitamente.
Se o mesmo privilégio for atribuído duas vezes por utilizadores
diferentes, então quem o tem pode ficar com ele mesmo depois
dum revoke (cf. grafo).
Todos os privilégios que dependem do privilégio retirado, são
também retirados.
Database System Concepts
29
©Silberschatz, Korth and Sudarshan (modificado)
LimitaçãoLimitação aa autorizaçõesautorizações emem SQLSQL SQL não permite autorizações a nível de tuplo
LimitaçãoLimitação aa autorizaçõesautorizações emem SQLSQL
SQL não permite autorizações a nível de tuplo
E.g. não se pode restringir de forma a que um aluno só possa ver
as suas notas.
Neste caso, a tarefa de autorização cai sobre as aplicações (o
que é indesejável, mas o SQL aqui não ajuda).
Ou então definir vistas e dar autorizações apenas a essas vistas
Database System Concepts
30
©Silberschatz, Korth and Sudarshan (modificado)