-- ============================================================================= -- DC_REFERENCES_ALTER.sql -- Ergänzt dc_project_documents um Felder für heruntergeladene externe Referenzen. -- parent_document_id → Self-FK auf das Originaldokument (NULL bei Originalen) -- is_reference → 0 = Originaldokument, 1 = heruntergeladene Referenz -- source_url → Ursprungs-URL der heruntergeladenen Referenz -- Idempotent: Fehler "Spalte/Constraint existiert bereits" wird ignoriert. -- ============================================================================= BEGIN EXECUTE IMMEDIATE ' ALTER TABLE dc_project_documents ADD ( parent_document_id NUMBER, is_reference NUMBER DEFAULT 0, source_url VARCHAR2(2000 CHAR) ) '; DBMS_OUTPUT.PUT_LINE('Spalten parent_document_id/is_reference/source_url angelegt.'); EXCEPTION WHEN OTHERS THEN IF SQLCODE = -1430 THEN DBMS_OUTPUT.PUT_LINE('Spalten existieren bereits – kein Änderungsbedarf.'); ELSE RAISE; END IF; END; / -- Bestehende Zeilen initialisieren UPDATE dc_project_documents SET is_reference = 0 WHERE is_reference IS NULL; COMMIT; -- Self-FK (idempotent) BEGIN EXECUTE IMMEDIATE ' ALTER TABLE dc_project_documents ADD CONSTRAINT dc_project_documents_parent_fk FOREIGN KEY (parent_document_id) REFERENCES dc_project_documents (id) '; EXCEPTION WHEN OTHERS THEN IF SQLCODE IN (-2264, -2261, -2275) THEN NULL; -- Constraint existiert bereits ELSE RAISE; END IF; END; / -- Check-Constraint is_reference (idempotent) BEGIN EXECUTE IMMEDIATE ' ALTER TABLE dc_project_documents ADD CONSTRAINT dc_project_documents_is_ref_ck CHECK (is_reference IN (0, 1)) '; EXCEPTION WHEN OTHERS THEN IF SQLCODE IN (-2264, -2261) THEN NULL; -- Constraint existiert bereits ELSE RAISE; END IF; END; / -- Index auf parent_document_id (idempotent) BEGIN EXECUTE IMMEDIATE ' CREATE INDEX dc_project_documents_parent_i ON dc_project_documents (parent_document_id) '; EXCEPTION WHEN OTHERS THEN IF SQLCODE = -955 THEN NULL; -- Index existiert bereits ELSE RAISE; END IF; END; / COMMIT; EXIT;