sql >> Databáze >  >> RDS >> Oracle

Zkontrolujte překrývající se data na libovolném řádku tabulky Oracle SQL

Myslím, že byste potřebovali spouštěč, jako je tento:

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;

Poznámka:FOR EACH ROW doložka není dána!

Jinak spouštěč provede pouze aktuálně vložený/aktualizovaný řádek, ale neporovnává se s žádnými existujícími daty.

Zvažte také případy jako je tento:

V tabulce máte období od 1. do 30. srpna, poté zkuste přidat období za 1. května do 31. prosince. Samozřejmě i takové situace by měla spoušť blokovat. Potřebujete tedy pouze trigger na úrovni příkazu, tj. trigger na úrovni řádku, který kontroluje pouze vložený/aktualizovaný řádek, nestačí.




  1. Jak funguje DAYOFMONTH() v MariaDB

  2. Chybí artefakt com.oracle:ojdbc6:jar:11.2.0.3

  3. Jak udělit uživatelům přístup pouze pro čtení ke všem databázím

  4. Získání rozdílu mezi počty dvou poddotazů