From 818f764aa5601f54a858c3211bc8bc19e0892e7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Wed, 11 Feb 2026 19:28:24 +0900 Subject: [PATCH] =?UTF-8?q?fix:=EC=82=AC=EC=A7=84=EB=8C=80=EC=A7=80=20?= =?UTF-8?q?=EA=B0=90=EC=82=AC=20=EB=A1=9C=EA=B7=B8=20=ED=8A=B8=EB=A6=AC?= =?UTF-8?q?=EA=B1=B0=20=EC=9E=AC=EC=83=9D=EC=84=B1=20(=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=EB=90=9C=20=EC=BB=AC=EB=9F=BC=20=EC=B0=B8=EC=A1=B0=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 컬럼 삭제 후 트리거가 before_photo_path 등을 참조하여 UPDATE 시 에러 발생 수정 Co-Authored-By: Claude Opus 4.6 --- LOGICAL_RELATIONSHIPS.md | 3 +- ...onstruction_site_photos_audit_triggers.php | 76 +++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 database/migrations/2026_02_11_202600_update_construction_site_photos_audit_triggers.php diff --git a/LOGICAL_RELATIONSHIPS.md b/LOGICAL_RELATIONSHIPS.md index 7d4af66..3d6a71e 100644 --- a/LOGICAL_RELATIONSHIPS.md +++ b/LOGICAL_RELATIONSHIPS.md @@ -1,6 +1,6 @@ # 논리적 데이터베이스 관계 문서 -> **자동 생성**: 2026-02-11 13:41:26 +> **자동 생성**: 2026-02-11 18:03:33 > **소스**: Eloquent 모델 관계 분석 ## 📊 모델별 관계 현황 @@ -594,6 +594,7 @@ ### process_steps **모델**: `App\Models\ProcessStep` - **process()**: belongsTo → `processes` +- **documentTemplate()**: belongsTo → `document_templates` ### work_orders **모델**: `App\Models\Production\WorkOrder` diff --git a/database/migrations/2026_02_11_202600_update_construction_site_photos_audit_triggers.php b/database/migrations/2026_02_11_202600_update_construction_site_photos_audit_triggers.php new file mode 100644 index 0000000..24ebe3d --- /dev/null +++ b/database/migrations/2026_02_11_202600_update_construction_site_photos_audit_triggers.php @@ -0,0 +1,76 @@ + OLD.`id`) OR NOT (NEW.`tenant_id` <=> OLD.`tenant_id`) OR NOT (NEW.`user_id` <=> OLD.`user_id`) OR NOT (NEW.`site_name` <=> OLD.`site_name`) OR NOT (NEW.`work_date` <=> OLD.`work_date`) OR NOT (NEW.`description` <=> OLD.`description`) THEN + INSERT INTO trigger_audit_logs (table_name, row_id, dml_type, old_values, new_values, changed_columns, tenant_id, actor_id, session_info, db_user, created_at) + VALUES ('construction_site_photos', NEW.`id`, 'UPDATE', + JSON_OBJECT('id', OLD.`id`, 'tenant_id', OLD.`tenant_id`, 'user_id', OLD.`user_id`, 'site_name', OLD.`site_name`, 'work_date', OLD.`work_date`, 'description', OLD.`description`), + JSON_OBJECT('id', NEW.`id`, 'tenant_id', NEW.`tenant_id`, 'user_id', NEW.`user_id`, 'site_name', NEW.`site_name`, 'work_date', NEW.`work_date`, 'description', NEW.`description`), + JSON_ARRAY( + IF(NOT (NEW.`id` <=> OLD.`id`), 'id', NULL), + IF(NOT (NEW.`tenant_id` <=> OLD.`tenant_id`), 'tenant_id', NULL), + IF(NOT (NEW.`user_id` <=> OLD.`user_id`), 'user_id', NULL), + IF(NOT (NEW.`site_name` <=> OLD.`site_name`), 'site_name', NULL), + IF(NOT (NEW.`work_date` <=> OLD.`work_date`), 'work_date', NULL), + IF(NOT (NEW.`description` <=> OLD.`description`), 'description', NULL) + ), + NEW.`tenant_id`, @sam_actor_id, @sam_session_info, CURRENT_USER(), NOW()); + END IF; + END IF; + END + "); + + // DELETE 트리거 재생성 + DB::unprepared(" + CREATE TRIGGER trg_construction_site_photos_ad AFTER DELETE ON construction_site_photos + FOR EACH ROW + BEGIN + IF @disable_audit_trigger IS NULL OR @disable_audit_trigger != 1 THEN + INSERT INTO trigger_audit_logs (table_name, row_id, dml_type, old_values, new_values, changed_columns, tenant_id, actor_id, session_info, db_user, created_at) + VALUES ('construction_site_photos', OLD.`id`, 'DELETE', + JSON_OBJECT('id', OLD.`id`, 'tenant_id', OLD.`tenant_id`, 'user_id', OLD.`user_id`, 'site_name', OLD.`site_name`, 'work_date', OLD.`work_date`, 'description', OLD.`description`), + NULL, NULL, OLD.`tenant_id`, @sam_actor_id, @sam_session_info, CURRENT_USER(), NOW()); + END IF; + END + "); + } + + public function down(): void + { + // 롤백 시 트리거 삭제 (원래 마이그레이션의 rollback이 컬럼을 복원하므로 그때 다시 생성해야 함) + DB::unprepared('DROP TRIGGER IF EXISTS trg_construction_site_photos_ai'); + DB::unprepared('DROP TRIGGER IF EXISTS trg_construction_site_photos_au'); + DB::unprepared('DROP TRIGGER IF EXISTS trg_construction_site_photos_ad'); + } +};