mirror of
https://github.com/ktds-dg0501/kt-event-marketing.git
synced 2026-06-13 06:19:11 +00:00
백엔드 서비스 구조 개선 및 데이터베이스 스키마 추가
This commit is contained in:
@@ -0,0 +1,234 @@
|
||||
-- ====================================================================================================
|
||||
-- Event ID 타입 변경 DDL (UUID → VARCHAR(50)) - PostgreSQL
|
||||
-- ====================================================================================================
|
||||
-- 작성일: 2025-10-29
|
||||
-- 작성자: Backend Development Team
|
||||
-- 설명: Event 엔티티의 eventId가 String 타입으로 변경됨에 따라 관련 테이블들의 event_id 컬럼 타입을 UUID에서 VARCHAR(50)으로 변경합니다.
|
||||
-- 영향 범위:
|
||||
-- - events 테이블 (Primary Key)
|
||||
-- - event_channels 테이블 (Foreign Key)
|
||||
-- - generated_images 테이블 (Foreign Key)
|
||||
-- - ai_recommendations 테이블 (Foreign Key)
|
||||
-- - jobs 테이블 (Foreign Key)
|
||||
-- ====================================================================================================
|
||||
|
||||
-- 0. 현재 상태 확인 (실행 전 확인용)
|
||||
-- ====================================================================================================
|
||||
-- 각 테이블의 event_id 컬럼 타입 확인
|
||||
-- SELECT table_name, column_name, data_type
|
||||
-- FROM information_schema.columns
|
||||
-- WHERE column_name = 'event_id'
|
||||
-- AND table_schema = 'public'
|
||||
-- ORDER BY table_name;
|
||||
|
||||
-- event_id 관련 모든 외래키 제약조건 확인
|
||||
-- SELECT
|
||||
-- tc.constraint_name,
|
||||
-- tc.table_name,
|
||||
-- kcu.column_name,
|
||||
-- ccu.table_name AS foreign_table_name,
|
||||
-- ccu.column_name AS foreign_column_name
|
||||
-- FROM information_schema.table_constraints AS tc
|
||||
-- JOIN information_schema.key_column_usage AS kcu
|
||||
-- ON tc.constraint_name = kcu.constraint_name
|
||||
-- AND tc.table_schema = kcu.table_schema
|
||||
-- JOIN information_schema.constraint_column_usage AS ccu
|
||||
-- ON ccu.constraint_name = tc.constraint_name
|
||||
-- AND ccu.table_schema = tc.table_schema
|
||||
-- WHERE tc.constraint_type = 'FOREIGN KEY'
|
||||
-- AND kcu.column_name = 'event_id'
|
||||
-- AND tc.table_schema = 'public';
|
||||
|
||||
-- 1. 외래키 제약조건 전체 제거
|
||||
-- ====================================================================================================
|
||||
-- JPA가 자동 생성한 제약조건 이름도 포함하여 모두 제거
|
||||
|
||||
-- event_channels 테이블의 모든 event_id 관련 외래키 제거
|
||||
DO $$
|
||||
DECLARE
|
||||
constraint_name TEXT;
|
||||
BEGIN
|
||||
FOR constraint_name IN
|
||||
SELECT tc.constraint_name
|
||||
FROM information_schema.table_constraints AS tc
|
||||
JOIN information_schema.key_column_usage AS kcu
|
||||
ON tc.constraint_name = kcu.constraint_name
|
||||
WHERE tc.constraint_type = 'FOREIGN KEY'
|
||||
AND tc.table_name = 'event_channels'
|
||||
AND kcu.column_name = 'event_id'
|
||||
AND tc.table_schema = 'public'
|
||||
LOOP
|
||||
EXECUTE 'ALTER TABLE event_channels DROP CONSTRAINT IF EXISTS ' || constraint_name;
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- generated_images 테이블의 모든 event_id 관련 외래키 제거
|
||||
DO $$
|
||||
DECLARE
|
||||
constraint_name TEXT;
|
||||
BEGIN
|
||||
FOR constraint_name IN
|
||||
SELECT tc.constraint_name
|
||||
FROM information_schema.table_constraints AS tc
|
||||
JOIN information_schema.key_column_usage AS kcu
|
||||
ON tc.constraint_name = kcu.constraint_name
|
||||
WHERE tc.constraint_type = 'FOREIGN KEY'
|
||||
AND tc.table_name = 'generated_images'
|
||||
AND kcu.column_name = 'event_id'
|
||||
AND tc.table_schema = 'public'
|
||||
LOOP
|
||||
EXECUTE 'ALTER TABLE generated_images DROP CONSTRAINT IF EXISTS ' || constraint_name;
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- ai_recommendations 테이블의 모든 event_id 관련 외래키 제거
|
||||
DO $$
|
||||
DECLARE
|
||||
constraint_name TEXT;
|
||||
BEGIN
|
||||
FOR constraint_name IN
|
||||
SELECT tc.constraint_name
|
||||
FROM information_schema.table_constraints AS tc
|
||||
JOIN information_schema.key_column_usage AS kcu
|
||||
ON tc.constraint_name = kcu.constraint_name
|
||||
WHERE tc.constraint_type = 'FOREIGN KEY'
|
||||
AND tc.table_name = 'ai_recommendations'
|
||||
AND kcu.column_name = 'event_id'
|
||||
AND tc.table_schema = 'public'
|
||||
LOOP
|
||||
EXECUTE 'ALTER TABLE ai_recommendations DROP CONSTRAINT IF EXISTS ' || constraint_name;
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
-- jobs 테이블의 모든 event_id 관련 외래키 제거
|
||||
DO $$
|
||||
DECLARE
|
||||
constraint_name TEXT;
|
||||
BEGIN
|
||||
FOR constraint_name IN
|
||||
SELECT tc.constraint_name
|
||||
FROM information_schema.table_constraints AS tc
|
||||
JOIN information_schema.key_column_usage AS kcu
|
||||
ON tc.constraint_name = kcu.constraint_name
|
||||
WHERE tc.constraint_type = 'FOREIGN KEY'
|
||||
AND tc.table_name = 'jobs'
|
||||
AND kcu.column_name = 'event_id'
|
||||
AND tc.table_schema = 'public'
|
||||
LOOP
|
||||
EXECUTE 'ALTER TABLE jobs DROP CONSTRAINT IF EXISTS ' || constraint_name;
|
||||
END LOOP;
|
||||
END $$;
|
||||
|
||||
|
||||
-- 2. 컬럼 타입 변경 (UUID/기타 → VARCHAR)
|
||||
-- ====================================================================================================
|
||||
-- 현재 타입에 관계없이 VARCHAR(50)으로 변환
|
||||
-- UUID, BIGINT 등 모든 타입을 텍스트로 변환
|
||||
|
||||
-- events 테이블의 event_id 컬럼 타입 변경 (Primary Key)
|
||||
DO $$
|
||||
BEGIN
|
||||
ALTER TABLE events ALTER COLUMN event_id TYPE VARCHAR(50) USING event_id::text;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RAISE NOTICE 'events.event_id 변환 중 오류: %', SQLERRM;
|
||||
END $$;
|
||||
|
||||
-- event_channels 테이블의 event_id 컬럼 타입 변경
|
||||
DO $$
|
||||
BEGIN
|
||||
ALTER TABLE event_channels ALTER COLUMN event_id TYPE VARCHAR(50) USING event_id::text;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RAISE NOTICE 'event_channels.event_id 변환 중 오류: %', SQLERRM;
|
||||
END $$;
|
||||
|
||||
-- generated_images 테이블의 event_id 컬럼 타입 변경
|
||||
DO $$
|
||||
BEGIN
|
||||
ALTER TABLE generated_images ALTER COLUMN event_id TYPE VARCHAR(50) USING event_id::text;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RAISE NOTICE 'generated_images.event_id 변환 중 오류: %', SQLERRM;
|
||||
END $$;
|
||||
|
||||
-- ai_recommendations 테이블의 event_id 컬럼 타입 변경
|
||||
DO $$
|
||||
BEGIN
|
||||
ALTER TABLE ai_recommendations ALTER COLUMN event_id TYPE VARCHAR(50) USING event_id::text;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RAISE NOTICE 'ai_recommendations.event_id 변환 중 오류: %', SQLERRM;
|
||||
END $$;
|
||||
|
||||
-- jobs 테이블의 event_id 컬럼 타입 변경 (NULL 허용)
|
||||
DO $$
|
||||
BEGIN
|
||||
ALTER TABLE jobs ALTER COLUMN event_id TYPE VARCHAR(50) USING event_id::text;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RAISE NOTICE 'jobs.event_id 변환 중 오류: %', SQLERRM;
|
||||
END $$;
|
||||
|
||||
|
||||
-- 3. 외래키 제약조건 재생성
|
||||
-- ====================================================================================================
|
||||
|
||||
-- event_channels 테이블의 외래키 재생성
|
||||
ALTER TABLE event_channels
|
||||
ADD CONSTRAINT fk_event_channels_event
|
||||
FOREIGN KEY (event_id) REFERENCES events(event_id)
|
||||
ON DELETE CASCADE;
|
||||
|
||||
-- generated_images 테이블의 외래키 재생성
|
||||
ALTER TABLE generated_images
|
||||
ADD CONSTRAINT fk_generated_images_event
|
||||
FOREIGN KEY (event_id) REFERENCES events(event_id)
|
||||
ON DELETE CASCADE;
|
||||
|
||||
-- ai_recommendations 테이블의 외래키 재생성
|
||||
ALTER TABLE ai_recommendations
|
||||
ADD CONSTRAINT fk_ai_recommendations_event
|
||||
FOREIGN KEY (event_id) REFERENCES events(event_id)
|
||||
ON DELETE CASCADE;
|
||||
|
||||
-- jobs 테이블의 외래키 재생성
|
||||
ALTER TABLE jobs
|
||||
ADD CONSTRAINT fk_jobs_event
|
||||
FOREIGN KEY (event_id) REFERENCES events(event_id)
|
||||
ON DELETE SET NULL;
|
||||
|
||||
|
||||
-- 4. 인덱스 확인 (옵션)
|
||||
-- ====================================================================================================
|
||||
-- 기존 인덱스들이 자동으로 유지되는지 확인
|
||||
-- \d events
|
||||
-- \d event_channels
|
||||
-- \d generated_images
|
||||
-- \d ai_recommendations
|
||||
-- \d jobs
|
||||
|
||||
|
||||
-- ====================================================================================================
|
||||
-- 롤백 스크립트 (필요시 사용)
|
||||
-- ====================================================================================================
|
||||
/*
|
||||
-- 1. 외래키 제약조건 제거
|
||||
ALTER TABLE event_channels DROP CONSTRAINT IF EXISTS fk_event_channels_event;
|
||||
ALTER TABLE generated_images DROP CONSTRAINT IF EXISTS fk_generated_images_event;
|
||||
ALTER TABLE ai_recommendations DROP CONSTRAINT IF EXISTS fk_ai_recommendations_event;
|
||||
ALTER TABLE jobs DROP CONSTRAINT IF EXISTS fk_jobs_event;
|
||||
|
||||
-- 2. 컬럼 타입 원복 (VARCHAR → UUID)
|
||||
ALTER TABLE events ALTER COLUMN event_id TYPE UUID USING event_id::UUID;
|
||||
ALTER TABLE event_channels ALTER COLUMN event_id TYPE UUID USING event_id::UUID;
|
||||
ALTER TABLE generated_images ALTER COLUMN event_id TYPE UUID USING event_id::UUID;
|
||||
ALTER TABLE ai_recommendations ALTER COLUMN event_id TYPE UUID USING event_id::UUID;
|
||||
ALTER TABLE jobs ALTER COLUMN event_id TYPE UUID USING event_id::UUID;
|
||||
|
||||
-- 4. 외래키 제약조건 재생성
|
||||
ALTER TABLE event_channels ADD CONSTRAINT fk_event_channels_event FOREIGN KEY (event_id) REFERENCES events(event_id) ON DELETE CASCADE;
|
||||
ALTER TABLE generated_images ADD CONSTRAINT fk_generated_images_event FOREIGN KEY (event_id) REFERENCES events(event_id) ON DELETE CASCADE;
|
||||
ALTER TABLE ai_recommendations ADD CONSTRAINT fk_ai_recommendations_event FOREIGN KEY (event_id) REFERENCES events(event_id) ON DELETE CASCADE;
|
||||
ALTER TABLE jobs ADD CONSTRAINT fk_jobs_event FOREIGN KEY (event_id) REFERENCES events(event_id) ON DELETE SET NULL;
|
||||
*/
|
||||
@@ -0,0 +1,233 @@
|
||||
-- ====================================================================================================
|
||||
-- Event Service 테이블 생성 스크립트 - PostgreSQL
|
||||
-- ====================================================================================================
|
||||
-- 작성일: 2025-10-29
|
||||
-- 작성자: Backend Development Team
|
||||
-- 설명: Event 서비스의 모든 테이블을 생성합니다.
|
||||
-- 참고: FK(Foreign Key) 제약조건은 제외되어 있습니다.
|
||||
-- ====================================================================================================
|
||||
|
||||
-- ====================================================================================================
|
||||
-- 1. events 테이블 - 이벤트 메인 테이블
|
||||
-- ====================================================================================================
|
||||
CREATE TABLE IF NOT EXISTS events (
|
||||
event_id VARCHAR(50) PRIMARY KEY,
|
||||
user_id VARCHAR(50) NOT NULL,
|
||||
store_id VARCHAR(50) NOT NULL,
|
||||
event_name VARCHAR(200),
|
||||
description TEXT,
|
||||
objective VARCHAR(100) NOT NULL,
|
||||
start_date DATE,
|
||||
end_date DATE,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'DRAFT',
|
||||
selected_image_id VARCHAR(50),
|
||||
selected_image_url VARCHAR(500),
|
||||
participants INTEGER DEFAULT 0,
|
||||
target_participants INTEGER,
|
||||
roi DOUBLE PRECISION DEFAULT 0.0,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- events 테이블 인덱스
|
||||
CREATE INDEX IF NOT EXISTS idx_events_user_id ON events(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_events_store_id ON events(store_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_events_status ON events(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_events_created_at ON events(created_at);
|
||||
|
||||
COMMENT ON TABLE events IS '이벤트 메인 테이블';
|
||||
COMMENT ON COLUMN events.event_id IS '이벤트 ID (Primary Key)';
|
||||
COMMENT ON COLUMN events.user_id IS '사용자 ID';
|
||||
COMMENT ON COLUMN events.store_id IS '상점 ID';
|
||||
COMMENT ON COLUMN events.event_name IS '이벤트명';
|
||||
COMMENT ON COLUMN events.description IS '이벤트 설명';
|
||||
COMMENT ON COLUMN events.objective IS '이벤트 목적';
|
||||
COMMENT ON COLUMN events.start_date IS '이벤트 시작일';
|
||||
COMMENT ON COLUMN events.end_date IS '이벤트 종료일';
|
||||
COMMENT ON COLUMN events.status IS '이벤트 상태 (DRAFT, PUBLISHED, ENDED)';
|
||||
COMMENT ON COLUMN events.selected_image_id IS '선택된 이미지 ID';
|
||||
COMMENT ON COLUMN events.selected_image_url IS '선택된 이미지 URL';
|
||||
COMMENT ON COLUMN events.participants IS '참여자 수';
|
||||
COMMENT ON COLUMN events.target_participants IS '목표 참여자 수';
|
||||
COMMENT ON COLUMN events.roi IS 'ROI (투자 대비 수익률)';
|
||||
COMMENT ON COLUMN events.created_at IS '생성일시';
|
||||
COMMENT ON COLUMN events.updated_at IS '수정일시';
|
||||
|
||||
|
||||
-- ====================================================================================================
|
||||
-- 2. event_channels 테이블 - 이벤트 배포 채널 (ElementCollection)
|
||||
-- ====================================================================================================
|
||||
CREATE TABLE IF NOT EXISTS event_channels (
|
||||
event_id VARCHAR(50) NOT NULL,
|
||||
channel VARCHAR(50)
|
||||
);
|
||||
|
||||
-- event_channels 테이블 인덱스
|
||||
CREATE INDEX IF NOT EXISTS idx_event_channels_event_id ON event_channels(event_id);
|
||||
|
||||
COMMENT ON TABLE event_channels IS '이벤트 배포 채널 테이블';
|
||||
COMMENT ON COLUMN event_channels.event_id IS '이벤트 ID';
|
||||
COMMENT ON COLUMN event_channels.channel IS '배포 채널명';
|
||||
|
||||
|
||||
-- ====================================================================================================
|
||||
-- 3. generated_images 테이블 - 생성된 이미지
|
||||
-- ====================================================================================================
|
||||
CREATE TABLE IF NOT EXISTS generated_images (
|
||||
image_id VARCHAR(50) PRIMARY KEY,
|
||||
event_id VARCHAR(50) NOT NULL,
|
||||
image_url VARCHAR(500) NOT NULL,
|
||||
style VARCHAR(50),
|
||||
platform VARCHAR(50),
|
||||
is_selected BOOLEAN NOT NULL DEFAULT false,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- generated_images 테이블 인덱스
|
||||
CREATE INDEX IF NOT EXISTS idx_generated_images_event_id ON generated_images(event_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_generated_images_is_selected ON generated_images(is_selected);
|
||||
|
||||
COMMENT ON TABLE generated_images IS 'AI가 생성한 이미지 테이블';
|
||||
COMMENT ON COLUMN generated_images.image_id IS '이미지 ID (Primary Key)';
|
||||
COMMENT ON COLUMN generated_images.event_id IS '이벤트 ID';
|
||||
COMMENT ON COLUMN generated_images.image_url IS '이미지 URL';
|
||||
COMMENT ON COLUMN generated_images.style IS '이미지 스타일';
|
||||
COMMENT ON COLUMN generated_images.platform IS '타겟 플랫폼';
|
||||
COMMENT ON COLUMN generated_images.is_selected IS '선택 여부';
|
||||
COMMENT ON COLUMN generated_images.created_at IS '생성일시';
|
||||
COMMENT ON COLUMN generated_images.updated_at IS '수정일시';
|
||||
|
||||
|
||||
-- ====================================================================================================
|
||||
-- 4. ai_recommendations 테이블 - AI 추천 기획안
|
||||
-- ====================================================================================================
|
||||
CREATE TABLE IF NOT EXISTS ai_recommendations (
|
||||
recommendation_id VARCHAR(50) PRIMARY KEY,
|
||||
event_id VARCHAR(50) NOT NULL,
|
||||
event_name VARCHAR(200) NOT NULL,
|
||||
description TEXT,
|
||||
promotion_type VARCHAR(50),
|
||||
target_audience VARCHAR(100),
|
||||
is_selected BOOLEAN NOT NULL DEFAULT false,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- ai_recommendations 테이블 인덱스
|
||||
CREATE INDEX IF NOT EXISTS idx_ai_recommendations_event_id ON ai_recommendations(event_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_ai_recommendations_is_selected ON ai_recommendations(is_selected);
|
||||
|
||||
COMMENT ON TABLE ai_recommendations IS 'AI 추천 이벤트 기획안 테이블';
|
||||
COMMENT ON COLUMN ai_recommendations.recommendation_id IS '추천 ID (Primary Key)';
|
||||
COMMENT ON COLUMN ai_recommendations.event_id IS '이벤트 ID';
|
||||
COMMENT ON COLUMN ai_recommendations.event_name IS '추천 이벤트명';
|
||||
COMMENT ON COLUMN ai_recommendations.description IS '추천 설명';
|
||||
COMMENT ON COLUMN ai_recommendations.promotion_type IS '프로모션 유형';
|
||||
COMMENT ON COLUMN ai_recommendations.target_audience IS '타겟 고객층';
|
||||
COMMENT ON COLUMN ai_recommendations.is_selected IS '선택 여부';
|
||||
COMMENT ON COLUMN ai_recommendations.created_at IS '생성일시';
|
||||
COMMENT ON COLUMN ai_recommendations.updated_at IS '수정일시';
|
||||
|
||||
|
||||
-- ====================================================================================================
|
||||
-- 5. jobs 테이블 - 비동기 작업 관리
|
||||
-- ====================================================================================================
|
||||
CREATE TABLE IF NOT EXISTS jobs (
|
||||
job_id VARCHAR(50) PRIMARY KEY,
|
||||
event_id VARCHAR(50) NOT NULL,
|
||||
job_type VARCHAR(30) NOT NULL,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
|
||||
progress INTEGER NOT NULL DEFAULT 0,
|
||||
result_key VARCHAR(200),
|
||||
error_message VARCHAR(500),
|
||||
completed_at TIMESTAMP,
|
||||
retry_count INTEGER NOT NULL DEFAULT 0,
|
||||
max_retry_count INTEGER NOT NULL DEFAULT 3,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- jobs 테이블 인덱스
|
||||
CREATE INDEX IF NOT EXISTS idx_jobs_event_id ON jobs(event_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_jobs_status ON jobs(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_jobs_job_type ON jobs(job_type);
|
||||
CREATE INDEX IF NOT EXISTS idx_jobs_created_at ON jobs(created_at);
|
||||
|
||||
COMMENT ON TABLE jobs IS '비동기 작업 관리 테이블';
|
||||
COMMENT ON COLUMN jobs.job_id IS '작업 ID (Primary Key)';
|
||||
COMMENT ON COLUMN jobs.event_id IS '이벤트 ID';
|
||||
COMMENT ON COLUMN jobs.job_type IS '작업 유형 (AI_RECOMMENDATION, IMAGE_GENERATION)';
|
||||
COMMENT ON COLUMN jobs.status IS '작업 상태 (PENDING, PROCESSING, COMPLETED, FAILED)';
|
||||
COMMENT ON COLUMN jobs.progress IS '진행률 (0-100)';
|
||||
COMMENT ON COLUMN jobs.result_key IS '결과 키';
|
||||
COMMENT ON COLUMN jobs.error_message IS '에러 메시지';
|
||||
COMMENT ON COLUMN jobs.completed_at IS '완료일시';
|
||||
COMMENT ON COLUMN jobs.retry_count IS '재시도 횟수';
|
||||
COMMENT ON COLUMN jobs.max_retry_count IS '최대 재시도 횟수';
|
||||
COMMENT ON COLUMN jobs.created_at IS '생성일시';
|
||||
COMMENT ON COLUMN jobs.updated_at IS '수정일시';
|
||||
|
||||
|
||||
-- ====================================================================================================
|
||||
-- 6. updated_at 자동 업데이트를 위한 트리거 함수 생성
|
||||
-- ====================================================================================================
|
||||
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = CURRENT_TIMESTAMP;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- ====================================================================================================
|
||||
-- 7. 각 테이블에 updated_at 자동 업데이트 트리거 적용
|
||||
-- ====================================================================================================
|
||||
|
||||
-- events 테이블 트리거
|
||||
DROP TRIGGER IF EXISTS update_events_updated_at ON events;
|
||||
CREATE TRIGGER update_events_updated_at
|
||||
BEFORE UPDATE ON events
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
-- generated_images 테이블 트리거
|
||||
DROP TRIGGER IF EXISTS update_generated_images_updated_at ON generated_images;
|
||||
CREATE TRIGGER update_generated_images_updated_at
|
||||
BEFORE UPDATE ON generated_images
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
-- ai_recommendations 테이블 트리거
|
||||
DROP TRIGGER IF EXISTS update_ai_recommendations_updated_at ON ai_recommendations;
|
||||
CREATE TRIGGER update_ai_recommendations_updated_at
|
||||
BEFORE UPDATE ON ai_recommendations
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
-- jobs 테이블 트리거
|
||||
DROP TRIGGER IF EXISTS update_jobs_updated_at ON jobs;
|
||||
CREATE TRIGGER update_jobs_updated_at
|
||||
BEFORE UPDATE ON jobs
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
|
||||
-- ====================================================================================================
|
||||
-- 완료 메시지
|
||||
-- ====================================================================================================
|
||||
DO $$
|
||||
BEGIN
|
||||
RAISE NOTICE '=================================================';
|
||||
RAISE NOTICE 'Event Service 테이블 생성이 완료되었습니다.';
|
||||
RAISE NOTICE '=================================================';
|
||||
RAISE NOTICE '생성된 테이블:';
|
||||
RAISE NOTICE ' 1. events - 이벤트 메인 테이블';
|
||||
RAISE NOTICE ' 2. event_channels - 이벤트 배포 채널';
|
||||
RAISE NOTICE ' 3. generated_images - 생성된 이미지';
|
||||
RAISE NOTICE ' 4. ai_recommendations - AI 추천 기획안';
|
||||
RAISE NOTICE ' 5. jobs - 비동기 작업 관리';
|
||||
RAISE NOTICE '=================================================';
|
||||
RAISE NOTICE '참고: FK 제약조건은 생성되지 않았습니다.';
|
||||
RAISE NOTICE '=================================================';
|
||||
END $$;
|
||||
Reference in New Issue
Block a user