Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Criando um gatilho


O que você tem aqui é uma restrição de tabela entre linhas - ou seja, você não pode simplesmente colocar um único Oracle CONSTRAINT em uma coluna, pois eles só podem ver dados em uma única linha de cada vez.

O Oracle tem suporte para apenas dois tipos de restrição entre linhas - exclusividade (por exemplo, chaves primárias e restrições exclusivas) e integridade referencial (chaves estrangeiras).

No seu caso, você terá que codificar manualmente a restrição - e com isso vem a responsabilidade de garantir que a restrição não seja violada na presença de várias sessões, cada uma das quais não pode ver os dados inseridos/atualizados por outras sessões simultâneas (pelo menos, até que eles se comprometam).

Uma abordagem simplista é adicionar um gatilho que emita uma consulta para contar quantos registros estão em conflito com o novo registro; mas isso não funcionará porque o gatilho não pode ver linhas que foram inseridas/atualizadas por outras sessões, mas ainda não confirmadas; então o gatilho às vezes permite que os membros aluguem 6 vídeos, desde que (por exemplo) eles consigam dois caixas para inserir os dados em terminais separados.

Uma maneira para contornar esse problema é colocar algum elemento de serialização - por exemplo o acionador solicitaria primeiro um bloqueio no registro do membro (por exemplo, com um SELECT FOR UPDATE) antes de poder verificar os aluguéis; dessa forma, se uma 2ª sessão tentar inserir aluguéis, ela aguardará até que a primeira sessão faça um commit ou rollback.

Outra maneira para contornar esse problema é usar uma Exibição Materializada de agregação, que seria baseada em uma consulta projetada para localizar todas as linhas que falham no teste; a expectativa é que o MV esteja vazio e você coloca uma restrição de tabela no MV de modo que, se uma linha aparecer no MV, a restrição será violada. O efeito disso é que qualquer instrução que tente inserir linhas que violem a restrição causará uma violação de restrição quando o MV for atualizado.

Escrever a consulta para isso com base no seu design fica como exercício para o leitor :)