Files
craftvia/prisma/migrations/20260804111342_tisax_v5_audit/migration.sql
T
msolarczekandClaude Opus 5 c8e6f30a27
CI / build-and-check (push) Canceled after 0s
CI / audit (push) Canceled after 0s
CI / sbom (push) Canceled after 0s
Basis: Certvia dev@a48c5fb als Fundament für Craftvia
Unveränderter Stand von certvia/dev (a48c5fb) plus Craftvia-Spezifikation
und Brandbook unter docs/craftvia/. ISMS-Module werden im Folgecommit entfernt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 11:05:39 +02:00

95 lines
3.6 KiB
SQL

-- CreateEnum
CREATE TYPE "AuditType" AS ENUM ('INTERNAL', 'EXTERNAL');
-- CreateEnum
CREATE TYPE "AuditStatus" AS ENUM ('PLANNED', 'IN_PREPARATION', 'DONE');
-- CreateTable
CREATE TABLE "audits" (
"id" TEXT NOT NULL,
"tenant_id" TEXT NOT NULL,
"type" "AuditType" NOT NULL,
"title" TEXT NOT NULL,
"planned_date" TEXT,
"scope" TEXT,
"assessment_level" TEXT,
"provider" TEXT,
"auditor_user_id" TEXT,
"status" "AuditStatus" NOT NULL DEFAULT 'PLANNED',
"preparation_deadline" TIMESTAMP(3),
"result" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "audits_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "audit_evidence_items" (
"id" TEXT NOT NULL,
"tenant_id" TEXT NOT NULL,
"audit_id" TEXT NOT NULL,
"control" TEXT NOT NULL,
"title" TEXT NOT NULL,
"req_id" TEXT,
"assigned_user_id" TEXT,
"assigned_function_key" TEXT,
"status" TEXT NOT NULL DEFAULT 'offen',
"evidence_id" TEXT,
"task_id" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "audit_evidence_items_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "control_descriptions" (
"id" TEXT NOT NULL,
"tenant_id" TEXT NOT NULL,
"control" TEXT NOT NULL,
"req_id" TEXT NOT NULL,
"draft_text" TEXT,
"source_ref" TEXT,
"confidence" TEXT,
"status" TEXT NOT NULL DEFAULT 'open',
"open_answer" TEXT,
"updated_by_id" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "control_descriptions_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "audits_tenant_id_status_idx" ON "audits"("tenant_id", "status");
-- CreateIndex
CREATE INDEX "audit_evidence_items_tenant_id_audit_id_idx" ON "audit_evidence_items"("tenant_id", "audit_id");
-- CreateIndex
CREATE INDEX "audit_evidence_items_tenant_id_assigned_user_id_status_idx" ON "audit_evidence_items"("tenant_id", "assigned_user_id", "status");
-- CreateIndex
CREATE INDEX "control_descriptions_tenant_id_control_idx" ON "control_descriptions"("tenant_id", "control");
-- CreateIndex
CREATE UNIQUE INDEX "control_descriptions_tenant_id_req_id_key" ON "control_descriptions"("tenant_id", "req_id");
-- AddForeignKey
ALTER TABLE "audit_evidence_items" ADD CONSTRAINT "audit_evidence_items_audit_id_fkey" FOREIGN KEY ("audit_id") REFERENCES "audits"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- ── Tenant-Isolation (RLS) für neue Audit-Tabellen (Muster wie F-04) ──────────
ALTER TABLE "audits" ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation ON "audits";
CREATE POLICY tenant_isolation ON "audits" USING ("tenant_id" = current_setting('app.tenant_id', true)) WITH CHECK ("tenant_id" = current_setting('app.tenant_id', true));
ALTER TABLE "audits" FORCE ROW LEVEL SECURITY;
ALTER TABLE "audit_evidence_items" ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation ON "audit_evidence_items";
CREATE POLICY tenant_isolation ON "audit_evidence_items" USING ("tenant_id" = current_setting('app.tenant_id', true)) WITH CHECK ("tenant_id" = current_setting('app.tenant_id', true));
ALTER TABLE "audit_evidence_items" FORCE ROW LEVEL SECURITY;
ALTER TABLE "control_descriptions" ENABLE ROW LEVEL SECURITY;
DROP POLICY IF EXISTS tenant_isolation ON "control_descriptions";
CREATE POLICY tenant_isolation ON "control_descriptions" USING ("tenant_id" = current_setting('app.tenant_id', true)) WITH CHECK ("tenant_id" = current_setting('app.tenant_id', true));
ALTER TABLE "control_descriptions" FORCE ROW LEVEL SECURITY;