CREATE TABLE "user_app_roles" ( "id" uuid NOT NULL DEFAULT gen_random_uuid(), "user_id" uuid NOT NULL, "app_key" text NOT NULL, "role_code" text NOT NULL, "assigned_by" uuid, "assigned_at" timestamptz(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "starts_at" timestamptz(3), "ends_at" timestamptz(3), "created_at" timestamptz(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" timestamptz(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "user_app_roles_pkey" PRIMARY KEY ("id"), CONSTRAINT "user_app_roles_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE ); CREATE UNIQUE INDEX "user_app_roles_user_id_app_key_role_code_key" ON "user_app_roles"("user_id", "app_key", "role_code"); CREATE INDEX "user_app_roles_app_key_role_code_idx" ON "user_app_roles"("app_key", "role_code"); CREATE INDEX "user_app_roles_user_id_app_key_idx" ON "user_app_roles"("user_id", "app_key"); COMMENT ON TABLE "user_app_roles" IS '사용자별 앱 역할. 전역 계정 역할과 별도로 LMS 강사, 학생, ADS IDE 개발자 같은 앱 단위 역할을 관리한다.'; COMMENT ON COLUMN "user_app_roles"."id" IS '앱 역할 매핑 UUID'; COMMENT ON COLUMN "user_app_roles"."user_id" IS '역할을 부여받은 auth 사용자 ID'; COMMENT ON COLUMN "user_app_roles"."app_key" IS '역할이 적용되는 앱 식별자. 예: LMS, ADS IDE'; COMMENT ON COLUMN "user_app_roles"."role_code" IS '앱 내부 역할 코드. 예: INSTRUCTOR, STUDENT, DEVELOPER'; COMMENT ON COLUMN "user_app_roles"."assigned_by" IS '역할을 부여한 관리자 사용자 ID'; COMMENT ON COLUMN "user_app_roles"."assigned_at" IS '역할 부여 일시'; COMMENT ON COLUMN "user_app_roles"."starts_at" IS '역할 유효 시작 일시. NULL이면 즉시 유효'; COMMENT ON COLUMN "user_app_roles"."ends_at" IS '역할 유효 종료 일시. NULL이면 무기한'; COMMENT ON COLUMN "user_app_roles"."created_at" IS '생성 일시'; COMMENT ON COLUMN "user_app_roles"."updated_at" IS '수정 일시'; INSERT INTO "user_app_roles" ("user_id", "app_key", "role_code") SELECT "id", 'LMS', 'INSTRUCTOR' FROM "users" WHERE "email" IN ('teacher@futuredrive.net', 'teacher@yu.ac.kr') ON CONFLICT ("user_id", "app_key", "role_code") DO NOTHING; UPDATE "users" SET "role" = 'USER' WHERE "email" IN ('teacher@futuredrive.net', 'teacher@yu.ac.kr');