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

Verifique se há datas sobrepostas em qualquer linha de uma tabela Oracle SQL


Eu acho que você precisaria de um gatilho como este:
CREATE OR REPLACE TRIGGER TRGEPOCASNAOSOBREPOSTAS
    AFTER INSERT OR UPDATE
    ON EPOCA
  c INTEGER;
BEGIN
    SELECT COUNT(*)
    INTO c
    FROM EPOCA e
    WHERE EXISTS (
        SELECT 1
        FROM EPOCA ee 
        WHERE (e.DATA_INI BETWEEN ee.DATA_INI AND ee.DATA_FIM 
              OR e.DATA_FIM BETWEEN ee.DATA_INI AND ee.DATA_FIM) 
           AND ee.ROWID <> e.ROWID);

    IF c > 0 THEN
            RAISE_APPLICATION_ERROR(-20021, 'INSERT FAILED BECAUSE SELECTED DATES OVERLAP EXISTENT ONES');
    END IF;
END;

Observe que o FOR EACH ROW cláusula não é dada!

Caso contrário, o gatilho executa apenas a linha inserida/atualizada no momento, mas não compara com nenhum dado existente.

Considere também casos como este:

Na tabela você tem um período de 1º a 30 de agosto, então você tenta adicionar período de 1º de maio a 31 de dezembro. Obviamente, tais situações também devem ser bloqueadas pelo gatilho. Assim, você precisa apenas de um gatilho de nível de instrução, ou seja, um gatilho de nível de linha que verifica apenas a linha inserida/atualizada não é suficiente.