-- 사용자 추적 및 담당자 기록 필드 추가 -- 생성일: 2025.01 -- 목적: RULES 가이드라인에 따른 사용자 추적 시스템 구축 -- ================================ -- 1. 기존 테이블에 담당자 필드 추가 -- ================================ -- files 테이블 수정 (uploaded_by는 이미 존재) ALTER TABLE files ADD COLUMN IF NOT EXISTS updated_by VARCHAR(100), ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP; -- jobs 테이블 수정 ALTER TABLE jobs ADD COLUMN IF NOT EXISTS created_by VARCHAR(100), ADD COLUMN IF NOT EXISTS updated_by VARCHAR(100), ADD COLUMN IF NOT EXISTS assigned_to VARCHAR(100); -- materials 테이블 수정 ALTER TABLE materials ADD COLUMN IF NOT EXISTS classified_by VARCHAR(100), ADD COLUMN IF NOT EXISTS classified_at TIMESTAMP, ADD COLUMN IF NOT EXISTS updated_by VARCHAR(100); -- ================================ -- 2. 사용자 활동 로그 테이블 생성 -- ================================ CREATE TABLE IF NOT EXISTS user_activity_logs ( id SERIAL PRIMARY KEY, user_id INTEGER, -- users 테이블 참조 (외래키 제약 없음 - 유연성) username VARCHAR(100) NOT NULL, -- 사용자명 (필수) -- 활동 정보 activity_type VARCHAR(50) NOT NULL, -- 'FILE_UPLOAD', 'PROJECT_CREATE', 'PURCHASE_CONFIRM' 등 activity_description TEXT, -- 상세 활동 내용 -- 대상 정보 target_id INTEGER, -- 대상 ID (파일, 프로젝트 등) target_type VARCHAR(50), -- 'FILE', 'PROJECT', 'MATERIAL', 'PURCHASE' 등 -- 세션 정보 ip_address VARCHAR(45), -- IP 주소 user_agent TEXT, -- 브라우저 정보 -- 추가 메타데이터 (JSON) metadata JSONB, -- 추가 정보 (파일 크기, 처리 시간 등) -- 시간 정보 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- ================================ -- 3. 구매 관련 테이블 수정 -- ================================ -- purchase_items 테이블 수정 (이미 created_by 존재하는지 확인 후 추가) ALTER TABLE purchase_items ADD COLUMN IF NOT EXISTS updated_by VARCHAR(100), ADD COLUMN IF NOT EXISTS approved_by VARCHAR(100), ADD COLUMN IF NOT EXISTS approved_at TIMESTAMP; -- material_purchase_tracking 테이블 수정 (이미 confirmed_by 존재) ALTER TABLE material_purchase_tracking ADD COLUMN IF NOT EXISTS ordered_by VARCHAR(100), ADD COLUMN IF NOT EXISTS ordered_at TIMESTAMP, ADD COLUMN IF NOT EXISTS approved_by VARCHAR(100), ADD COLUMN IF NOT EXISTS approved_at TIMESTAMP; -- ================================ -- 4. 인덱스 생성 (성능 최적화) -- ================================ -- 사용자 활동 로그 인덱스 CREATE INDEX IF NOT EXISTS idx_user_activity_logs_username ON user_activity_logs(username); CREATE INDEX IF NOT EXISTS idx_user_activity_logs_activity_type ON user_activity_logs(activity_type); CREATE INDEX IF NOT EXISTS idx_user_activity_logs_created_at ON user_activity_logs(created_at); CREATE INDEX IF NOT EXISTS idx_user_activity_logs_target ON user_activity_logs(target_type, target_id); -- 담당자 필드 인덱스 CREATE INDEX IF NOT EXISTS idx_files_uploaded_by ON files(uploaded_by); CREATE INDEX IF NOT EXISTS idx_files_updated_by ON files(updated_by); CREATE INDEX IF NOT EXISTS idx_jobs_created_by ON jobs(created_by); CREATE INDEX IF NOT EXISTS idx_jobs_assigned_to ON jobs(assigned_to); CREATE INDEX IF NOT EXISTS idx_materials_classified_by ON materials(classified_by); -- ================================ -- 5. 트리거 생성 (자동 updated_at 갱신) -- ================================ -- files 테이블 updated_at 자동 갱신 CREATE OR REPLACE FUNCTION update_files_updated_at() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = CURRENT_TIMESTAMP; RETURN NEW; END; $$ language 'plpgsql'; DROP TRIGGER IF EXISTS trigger_files_updated_at ON files; CREATE TRIGGER trigger_files_updated_at BEFORE UPDATE ON files FOR EACH ROW EXECUTE FUNCTION update_files_updated_at(); -- jobs 테이블 updated_at 자동 갱신 CREATE OR REPLACE FUNCTION update_jobs_updated_at() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = CURRENT_TIMESTAMP; RETURN NEW; END; $$ language 'plpgsql'; DROP TRIGGER IF EXISTS trigger_jobs_updated_at ON jobs; CREATE TRIGGER trigger_jobs_updated_at BEFORE UPDATE ON jobs FOR EACH ROW EXECUTE FUNCTION update_jobs_updated_at(); -- ================================ -- 6. 기본 데이터 설정 -- ================================ -- 기존 데이터에 기본 담당자 설정 (시스템 마이그레이션용) UPDATE files SET uploaded_by = 'system' WHERE uploaded_by IS NULL; UPDATE jobs SET created_by = 'system' WHERE created_by IS NULL; -- ================================ -- 7. 권한 및 보안 설정 -- ================================ -- 활동 로그 테이블은 INSERT만 허용 (수정/삭제 방지) -- 실제 운영에서는 별도 권한 관리 필요 COMMENT ON TABLE user_activity_logs IS '사용자 활동 로그 - 모든 업무 활동 추적'; COMMENT ON COLUMN user_activity_logs.activity_type IS '활동 유형: FILE_UPLOAD, PROJECT_CREATE, PURCHASE_CONFIRM, MATERIAL_CLASSIFY 등'; COMMENT ON COLUMN user_activity_logs.metadata IS '추가 정보 JSON: 파일크기, 처리시간, 변경내용 등'; -- 완료 메시지 SELECT 'User tracking system tables created successfully!' as result;