Sie sind auf Seite 1von 6

Restrio de Integridade

Restrio de integridade

TRIGGER e SEGURANA

Uma regra que deve ser obedecida por todos estados da base de dados que so considerados consistentes. Especificao do maior nmero possvel de restries de integridade: possvel evitar que o usurio leve a base de dados inadvertidamente a um estado inconsistente.

Prof. Edson Thizon

Tipos de regras em um SGBD


Considerando um determinado SGBD, as restries de integridade podem ser classificadas em trs categorias: Implcitas Nesta categoria, enquadram-se todas as restries que podem ser declaradas (de forma no procedural) na DDL. No caso da abordagem relacional: chave primria, integridade referencial, domnio, Explcitas Nesta categoria, enquadram-se todas as restries que devem ser explicitamente especificadas no SGBD em questo, quer atravs de programao, quer atravs de instrues especiais. Inerentes abordagem So restries de integridade inerentes abordagem em questo e que no necessitam ser especificadas (na abordagem relacional, o fato de um atributo somente ter um valor)
3

Restries estticas Restries dinmicas


Restries estticas (de estado) So restries sobre um estado da base de dados. Para verific-las basta observar o estado atual da base de dados. Exemplos: Restries de domnio Restries de chave Restries de relacionamento entre diferentes atributos (o salrio do empregado no pode ser maior que o de seu gerente)

Restries estticas Restries dinmicas


Restries dinmicas (de transio) So restries cuja verificao exige dois estados da base de dados, um anterior e um posterior transio. Exemplo: O estado civil de uma pessoa, no pode mudar de casado para solteiro, mas pode mudar de vivo para casado. Nos SGBD comerciais, normalmente no so oferecidas facilidades para garantir este tipo de restries. O controle da restrio fica por conta de quem desenvolve as aplicaes .

Restries explcitas de integridade Definio procedural por codificao explcita


Neste mtodo, o usurio deve incluir dentro de cada transao de alterao o cdigo correspondente a verificao da restrio. Significa: Incluir cdigo em cada transao de incluso, excluso ou alterao de atributos. Uma nica restrio de integridade pode ficar espalhada dentro de diversas transaes Exemplo: Integridade referencial entre empregado e departamento: Ao incluir um empregado, verificar se o departamento existe. Ao excluir um departamento, verificar se o mesmo est vazio. Ao alterar o departamento de um empregado, garantir que o mesmo existe. Conseqncia: Quando restries de integridade mudam, todos trechos de cdigo referentes restrio devem ser modificados.
5 6

Page 1
1

SQL definio de restries de integridade explcitas


CHECK CONSTRAINT ASSERTION TRIGGER

CHECK CONSTRAINT
Especificao declarativa de uma expresso booleana que deve ser verdadeira para todas linhas de uma tabela (valores de uma coluna) Mesma sintaxe da clusula WHERE do SELECT Exemplo: ALTER TABLE Cliente ADD CONSTRAINT ValidaCampos CHECK (TipoCli=Pessoa Fsica AND CIC IS NOT NULL AND CGC IS NULL) OR (TipoCli=Pessoa Jurdica AND CIC IS NULL AND CGC IS NOT NULL)

ASSERTION
Especificao declarativa de uma expresso booleana que deve ser verdadeira para toda a base de dados (pode envolver vrias tabelas) CREATE ASSERTION ValidaSalario (NOT EXISTS SELECT * FROM emp WHERE emp.sal< (SELECT sal FROM WHERE emp AS ger ger.cod_emp=emp.cod_emp_ger)

TRIGGER
Stored procedure que executada automaticamente quando da atualizao de uma tabela Pode ser usado para: Atualizaes em cascata Verificao de restries de integridade que no podem ser verificadas pelas restries implcitas nem pela clusula CHECK

Implementao em SGBD restrita (problema de performance)

10

Trigger
Um trigger contm trs partes: evento (p.ex., atualizar um campo) condio (p.ex.., uma consulta que faz um teste) ao (p.ex., excluso, incluso,, RAISEERROR) Quando o evento ocorre, 1. Sistema testa condio e 2. Executa ao Observao: triggers podem ter efeitos em cascata Fornecedores de SGBD no esperaram os padres

Opes de Trigger
Eventos possveis incluem INSERT ON table DELETE ON table UPDATE [OF column] ON table INSTEAD OF Trigger pode ser ativado por FOR EACH ROW Ao executada para cada linha modificada FOR EACH STATEMENT Ao executada uma vez somente para todas linhas modificadas pela operao Ao de modificao pode ser executada AFTER ou BEFORE o evento (normalmente antes)
11 12

Page 2
2

Variveis usadas em Trigger


OLD A linha modificada antes da ocorrncia do evento. NEW A linha modificada aps da ocorrncia do evento. OLD_TABLE Uma tabela virtual que contm todas linhas modificadas no estado de antes da ocorrncia do evento NEW_TABLE Uma tabela virtual que contm todas linhas modificadas no estado de aps da ocorrncia do evento

Exemplo de Trigger Row level


CREATE TRIGGER AFTER UPDATE OF REFERENCING OLD NEW AS OldTuple AS NewTuple NoLowerPrices preco ON Produto

FOR EACH ROW WHEN (OldTuple.preco > NewTuple.preco) UPDATE SET WHERE Produto nome = NewTuple.nome preco = OldTuple.preco

Todos produtos com o mesmo so atualizados quando um deles atualizado Exemplo de tratamento de redundncia
13 14

Exemplo de Trigger - For each statement


CREATE TRIGGER MatriculAutomaticaIntroducao AFTER INSERT ON Aluno REFERENCING NEW_TABLE AS novosAlunos FOR EACH STATEMENT INSERT INTO Matricula SELECT CodigoAl, Intro001 FROM novosAlunos WHERE CodigoAl NOT IN (SELECT CodigoAl FROM Matricula WHERE CodigoDisc = Intro001) Matricula alunos novos em Intro001 automaticamente

Exemplo de Trigger For each statement


CREATE TRIGGER average-price-preserve INSTEAD OF UPDATE OF preco ON Produto REFERENCING OLD_TABLE AS OldStuff NEW_TABLE AS NewStuff FOR EACH STATEMENT WHEN (1000 < (SELECT AVG (preco) FROM ((Produto EXCEPT OldStuff) UNION NewStuff)) DELETE FROM Produto WHERE (nome, preco, empresa) IN OldStuff; INSERT INTO Produto (SELECT * FROM NewStuff) Se a mdia de preos cai abaixo de 1000, alterao desprezada
15 16

Exemplo de Trigger Before Update


CREATE TRIGGER ImpedeAumentoExagerado BEFORE UPDATE OF salario ON Empregado REFERENCING OLD AS o NEW AS n FOR EACH ROW WHEN (n.salario > 1.5 * o.salario) SET n.salario = 1.5 * o.salario Impede aumentos de salrio de mais de 50% Observar que o contedo de NEW alterado

Exemplo de Trigger - Validao


CREATE TRIGGER OneSupplier BEFORE UPDATE OF CodFornec ON Embarq REFERENCING NEW AS N FOR EACH ROW WHEN (N.CodFornec IS NULL) SIGNAL SQLSTATE '70005' (Cdigo do fornecedor deve ser fornecido') Exemplo de Trigger para verificar restrio de integridade Forma de sinalizar erro varia de SGBD para SGBD

17

18

Page 3
3

Trigger detalhes de implementao


Chamada recursiva Ao de um trigger pode disparar outro Pode entrar em um lao infinito Interao com o teste de restries de integridade pelo SGBD Quando testar se um trigger viola uma restrio: Aps a execuo de um BEFORE trigger O trigger pode consertar a violao Antes de um AFTER trigger AFTER triggers podem ver o efeito de por exemplo excluses em cascata causadas por restires de integridade referenciais (Baseado no DB2 cada produto tem sua poltica prpria)

Segurana e controle de acesso


A base de dados deve ser protegida contra acesso, intencional ou no, por usurios no autorizados. O controle de acesso envolve especificar ao SGBD que usurio pode realizar que tipo de operao sobre que objetos da base de dados. Alm disso so necessrios mecanismos de autorizao, isto , mecanismos para que o DBA delegue autorizao a outros usurios para estabelecer privilgios de acesso Os mecanismos oferecidos por SGBD comerciais so normalmente fracos e no so suficientes para evitar acesso no autorizado intencional.

19

20

Criao de Usurios
No Oracle o usurio DBA o SYSTEM e a senha default MANAGER. Para criar usurio utilize o seguinte comando: CREATE USER NOME_USUARIO IDENTIFIED BY SENHA_USUARIO; OBS: PODE SER UTILIZADO A FERRAMENTA ENTRERPISE CONSOLE OU DBA STUDIO DA ORCALE.

Segurana em SQL
SQL possui uma instruo na forma: GRANT <lista de privilgios> ON <nome de tabela ou viso> TO <lista de usurios> A <lista de privilgios> permite especificar os seguintes tipos de privilgios: RESOURCE Especifica que o usurio pode criar tabelas e vises SELECT Especifica que o usurio pode ler os dados das tabelas ou vises listadas

21

22

Segurana em SQL (continuao)


DELETE Especifica que o usurio pode excluir linhas das tabelas ou vises listadas INSERT Especifica que o usurio pode incluir linhas das tabelas ou vises listadas UPDATE Especifica que o usurio pode alterar linhas das tabelas ou vises listadas Este privilgio atribudo a colunas especficas: GRANT UPDATE(saldo) ON depsito TO u1,u2

Segurana em SQL (continuao)


REFERENCES Permite que um usurio crie tabelas que contm uma chave estrangeira de uma chave especificada. Tambm atribudo a colunas especficas: GRANT REFERENCES(cdigo) ON depto TO u1,u2 especifica que os usurios podem criar tabelas que referencia a chave primria da tabela de departamentos Por excluso, um usurio no pode conceder os privilgios recebidos a outros usurios, a menos que possua autorizao explcita para tal GRANT SELECT ON DEPT TO u1,u2 WITH GRANT OPTION A clusula WITH GRANT OPTION especifica que o usurio pode tambm conceder seus privilgios a outros usurios

23

24

Page 4
4

Segurana em SQL (continuao)


Para revogar os direitos de acesso de um usurios usada a instruo: REVOKE <lista de privilgios> ON <nome de tabela ou viso> FROM <lista de usurios> Quando um usurio perde um privilgio, todos os usurios que dele receberam este privilgio tambm o perdem.

AUDITORIA DE DADOS
Para auditar informaes em um banco de dados pode-se utilizar ferramentas de terceiros (como a prpria auditoria fornecida por alguns SGBD) ou podemos construir a nossa prpria auditoria. A seguir veremos 2 maneiras de construir auditoria de dados nos Banco de Dados utilizados pelas aplicaes.

25

26

1- Auditoria sem informaes histricas


Esta a maneira mais fcil e com melhor performance de termos auditoria de informaes nos Banco de Dados, porm com esta implementao no teremos a histria das atualizaes realizadas. Para implementarmos esta auditoria criaremos alguns campos adicionais em todas as tabelas que queremos auditar no Banco de Dados. Os campos so: Data e Hora de insero; Usurio que inseriu a informao; Data e Hora da ltima alterao; Usurio que alterou por ltimo a informao; Data e hora de deleo; Usurio que deletou a informao;
27

1- Auditoria sem informaes histricas (cont...)


Exemplo:
EMPREGADO CODEMP NOME 1 2 3 JOO MARIA PEDRO SALARIO 1000,00 1500,00 3000,00

Tabela empregado com colunas adicionais para auditoria


CODEMP NOME SALARIO DT_INSERT USER_I DT_UPDATE USER_U DT_DEL USER_D

1 2 3

JOO MARIA PEDRO

1000,00 1500,00 3000,00

28

1- Auditoria sem informaes histricas (cont...)


EMPREGADO
CODEMP 1 2 3 NOME JOO MARIA PEDRO SALARIO 1000,00 2000,00 3000,00 DT_INSERT 10/08/2004 11:00 10/10/2004 13:45 15/10/2004 14:00 ELIZA JOS 12/10/2004 15:00 16/10/2004 10:00 JOS PAULO USER_I PAULO DT_UPDATE USER_U DT_DEL USER_D

2- Auditoria com informaes histricas


Esta uma maneira de implementar auditoria com a histria de todas as atualizaes realizadas. Para implementarmos esta auditoria criaremos trigger em todas as tabelas que queremos auditar e uma tabela chamada AUDITORIA com os seguintes campos: Data e Hora; Operao (Insert, Delete ou Update); Usurio; Tabela; Dados;

Com as colunas que acrescentamos na tabela empregado podemos descobrir que o usurio PAULO inseriu a informao do empregado Joo e alterou as informaes do empregado Maria, tambm sabemos que o usurio JOS inseriu as informaes do empregado Maria e excluiu o empregado Pedro. Em todas estes informaes sabemos a data e o horrio que foi feito, porm no temos como saber quantas vezes j foram alterados os dados do empregado Maria, sabemos que o ltimo que fez a alterao foi o usurio PAULO. Com estas colunas temos vrias informaes, porm no temos a histria das atualizaes realizadas.

29

30

Page 5
5

2- Auditoria com informaes histricas(cont...)


Exemplo:
EMPREGADO CODEMP NOME 1 2 3 Tabela AUDITORIA
TABELA
EMPREGADO

2- Implementao da auditoria com informaes histricas(cont...)


Criao da tabela AUDITORIA:
CREATE TABLE AUDITORIA ( TABELA VARCHAR2(50) NOT NULL, DATA DATE NOT NULL, OPERACAO CHAR(1) NOT NULL, USUARIO VARCHAR2(50) NOT NULL, DADOS VARCHAR2(2000) NOT NULL);

SALARIO 1000,00 1500,00 3000,00

Criao da Trigger na tabela EMPREGADO:


CREATE TRIGGER TRG_AUDIT_EMPREGADO AFTER DELETE OR INSERT OR UPDATE ON EMPREGADO FOR EACH ROW DECLARE DADOS VARCHAR2(2000); BEGIN IF DELETING THEN DADOS := 'CDIGO : '|| :OLD.CODEMP || NOME : '|| :OLD.NOME || SALRIO : '|| :OLD.SALARIO; INSERT INTO AUDITORIA VALUES('EMPREGADO',SYSDATE,'D',USER,DADOS); END IF; IF INSERTING THEN DADOS := 'CDIGO : '|| :NEW.CODEMP || NOME : '|| :NEW.NOME || SALRIO : '|| :NEW.SALARIO; INSERT INTO AUDITORIA VALUES('EMPREGADO',SYSDATE,'I',USER,DADOS); END IF; IF UPDATING THEN DADOS := 'CDIGO OLD: '|| :OLD.CODEMP || NOME OLD: '|| :OLD.NOME || SALRIO OLD: '|| :OLD.SALARIO || 'CDIGO NEW: '|| :NEW.CODEMP || NOME NEW: '|| :NEW.NOME || SALRIO NEW: '|| :NEW.SALARIO; INSERT INTO AUDITORIA VALUES('EMPREGADO',SYSDATE,'U',USER,DADOS); END IF; 32 END;

JOO MARIA PEDRO

DATA
10/08/2004 11:00

OPERACAO
I

USUARIO
PAULO

DADOS
(MEMO)

EMPREGADO

10/10/2004 13:45

JOS

(MEMO)

EMPREGADO

15/10/2004 14:00

ELIZA

(MEMO)

EMPREGADO

12/10/2004 15:00

PAULO

(MEMO)

EMPREGADO

16/10/2004 10:00

JOS

(MEMO)

Com a tabela AUDITORIA podemos descobrir que o usurio PAULO inseriu a informao do empregado Joo e alterou as informaes do empregado Maria, tambm sabemos que o usurio JOS inseriu as informaes do empregado Maria e excluiu o empregado Pedro. Em todas estes informaes sabemos a data e o horrio que foi feito. Tambm teremos como saber quantas vezes j foram alterados os dados do empregado pois assim temos a histria de todas as atualizaes realizadas. 31

Referncia Bibliogrfica
HEUSER, Carlos Alberto. Projeto de Banco de Dados. 4 Edio. Ed. Sagra, 2001. Captulo: Restries de Integridade. FERNANDES, Lcia. Oracle 9i para desenvolvedores : Oracle developer 6i curso completo. Rio de Janeiro : Axcel Books, 2002. 1614 p.

33

Page 6
6

Das könnte Ihnen auch gefallen