diff --git a/backend-node/src/controllers/dataflowExecutionController.ts b/backend-node/src/controllers/dataflowExecutionController.ts index 14df0cda..71514633 100644 --- a/backend-node/src/controllers/dataflowExecutionController.ts +++ b/backend-node/src/controllers/dataflowExecutionController.ts @@ -170,23 +170,60 @@ async function executeInsert(tableName: string, data: Record): Prom */ async function executeUpdate(tableName: string, data: Record): Promise { try { - // ID 또는 기본키를 기준으로 업데이트 - const { id, ...updateData } = data; + logger.info(`UPDATE 액션 시작:`, { tableName, receivedData: data }); - if (!id) { - throw new Error('UPDATE를 위한 ID가 필요합니다'); + // 1. 테이블의 실제 기본키 조회 + const primaryKeyQuery = ` + SELECT a.attname as column_name + FROM pg_index i + JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey) + WHERE i.indrelid = $1::regclass AND i.indisprimary + `; + + const pkResult = await query<{ column_name: string }>(primaryKeyQuery, [tableName]); + + if (!pkResult || pkResult.length === 0) { + throw new Error(`테이블 ${tableName}의 기본키를 찾을 수 없습니다`); } + const primaryKeyColumn = pkResult[0].column_name; + logger.info(`테이블 ${tableName}의 기본키:`, primaryKeyColumn); + + // 2. 기본키 값 추출 + const primaryKeyValue = data[primaryKeyColumn]; + + if (!primaryKeyValue && primaryKeyValue !== 0) { + logger.error(`UPDATE 실패: 기본키 값이 없음`, { + primaryKeyColumn, + receivedData: data, + availableKeys: Object.keys(data), + }); + throw new Error(`UPDATE를 위한 기본키 값이 필요합니다 (${primaryKeyColumn})`); + } + + // 3. 업데이트할 데이터에서 기본키 제외 + const updateData = { ...data }; + delete updateData[primaryKeyColumn]; + + logger.info(`UPDATE 데이터 준비:`, { + primaryKeyColumn, + primaryKeyValue, + updateFields: Object.keys(updateData), + }); + + // 4. 동적 UPDATE 쿼리 생성 const setClause = Object.keys(updateData) .map((key, index) => `${key} = $${index + 1}`) .join(', '); const values = Object.values(updateData); - const updateQuery = `UPDATE ${tableName} SET ${setClause} WHERE id = $${values.length + 1} RETURNING *`; + const updateQuery = `UPDATE ${tableName} SET ${setClause} WHERE ${primaryKeyColumn} = $${values.length + 1} RETURNING *`; - logger.info(`UPDATE 쿼리 실행:`, { query: updateQuery, values: [...values, id] }); + logger.info(`UPDATE 쿼리 실행:`, { query: updateQuery, values: [...values, primaryKeyValue] }); - const result = await query(updateQuery, [...values, id]); + const result = await query(updateQuery, [...values, primaryKeyValue]); + + logger.info(`UPDATE 성공:`, { affectedRows: result.length }); return { success: true,