-
AMDP Table Function에서 MANDT는 꼭 필요한가? (Made by Claude.)SAP 2026. 5. 10. 22:03
AMDP Table Function에서 MANDT는 꼭 필요한가? S/4HANA · AMDPAMDP Table Function에서 MANDT는 꼭 필요한가?
ABAP이 자동으로 처리해주던 클라이언트 필터,
SQLScript에서는 개발자가 직접 챙겨야 합니다.
📌 결론 먼저: S/4HANA On-Premise에서는 사실상 필수입니다.
다만 이유를 이해하면 상황에 따라 생략 가능한 케이스도 있습니다.① 왜 MANDT 필터가 필요한가?
AMDP의
BY DATABASE FUNCTION은 ABAP 레이어를 완전히 우회하여 HANA에 직접 SQL을 실행합니다.일반 ABAP
SELECT문은 런타임이 자동으로MANDT = sy-mandt조건을 추가해주지만, SQLScript에는 그런 자동 필터가 없습니다. 따라서 MANDT 컬럼이 있는 투명 테이블을 조회할 때 필터를 생략하면 전체 클라이언트의 데이터가 모두 반환됩니다.SQLScript — 올바른 예 vs 잘못된 예-- ✅ 올바른 방법: SESSION_CONTEXT('CLIENT') 로 클라이언트 고정 WHERE mandt = SESSION_CONTEXT('CLIENT') -- ❌ 위험: MANDT 조건 없이 다른 필드만 필터 WHERE bukrs = :iv_bukrs -- 모든 client 데이터 혼합 반환됨
핵심: ABAP이 대신 해주던 클라이언트 격리를 SQLScript에서는 개발자가 직접 명시해야 합니다.② 예외적으로 생략 가능한 경우
상황 MANDT 생략 MANDT 컬럼이 없는 테이블 (Cluster Table, 일부 CDS View 등) ✓ 가능 CTE 내부에서 이미 MANDT 필터된 결과를 재사용하는 경우 ✓ 중복 생략 가능 단일 클라이언트만 운영하는 시스템 ⚠ 가능하나 비권장 다중 클라이언트 운영 시스템 (대부분 On-Premise) ✗ 반드시 필요 ③ JOIN 시 권장 패턴
모든 테이블마다 MANDT 조건을 반복하기보다, 주 테이블 WHERE에 한 번 + JOIN ON 조건에 MANDT 포함하는 패턴이 깔끔합니다.
SQLScript — 권장 JOIN 패턴FROM vbak AS h INNER JOIN vbap AS i ON h.mandt = i.mandt -- JOIN 조건에 MANDT 포함 AND h.vbeln = i.vbeln WHERE h.mandt = SESSION_CONTEXT('CLIENT') -- 주 테이블에 한 번만 AND h.vkorg = :iv_vkorg
CTE(WITH 절) 활용 시
CTE를 사용하면 각 서브쿼리에서 한 번씩 필터하고, 이후 조합 단계에서는 생략 가능합니다.
SQLScript — CTE + MANDT 패턴RETURN WITH base_orders AS ( SELECT vbeln, kunnr, erdat, auart FROM vbak WHERE mandt = SESSION_CONTEXT('CLIENT') AND vkorg = :iv_vkorg ), order_items AS ( SELECT vbeln, SUM(kwmeng) AS total_qty FROM vbap WHERE mandt = SESSION_CONTEXT('CLIENT') GROUP BY vbeln ) SELECT o.vbeln, o.kunnr, i.total_qty FROM base_orders AS o INNER JOIN order_items AS i ON o.vbeln = i.vbeln; -- 이미 필터된 CTE라 MANDT 불필요
④ Table Function 전체 예시
ABAP — AMDP Table Function 전체 코드CLASS zcl_amdp_sales DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES if_amdp_marker_hdb. CLASS-METHODS get_orders IMPORTING VALUE(iv_vkorg) TYPE vkorg RETURNING VALUE(rt_result) TYPE TABLE OF zst_order_result RAISING cx_amdp_error. ENDCLASS. CLASS zcl_amdp_sales IMPLEMENTATION. METHOD get_orders BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING vbak vbap. RETURN SELECT h.vbeln, h.kunnr, SUM(i.kwmeng) AS total_qty FROM vbak AS h INNER JOIN vbap AS i ON h.mandt = i.mandt AND h.vbeln = i.vbeln WHERE h.mandt = SESSION_CONTEXT('CLIENT') -- 필수! AND h.vkorg = :iv_vkorg GROUP BY h.vbeln, h.kunnr; ENDMETHOD. ENDCLASS.
📋 핵심 정리- AMDP Table Function은 ABAP 레이어를 우회하므로 MANDT 자동 필터가 없다
- MANDT 컬럼이 있는 투명 테이블 조회 시
SESSION_CONTEXT('CLIENT')필터는 필수 - JOIN 시 주 테이블 WHERE에 한 번 + ON 조건에 MANDT 매핑 패턴 권장
- CTE를 사용하면 각 서브쿼리에서 한 번씩 필터하고 이후 단계에서는 생략 가능
- MANDT 컬럼이 없는 테이블이나 단일 클라이언트 환경에서는 생략 가능
'SAP' 카테고리의 다른 글
SAP ABAP 호출 구조 정리 — Entity · Query Provider · AMDP (0) 2026.05.12 CDS Consumption Entity 어노테이션 정리 (0) 2026.05.12 [claude] AMDP Scalar Function 이용 가이드 (0) 2026.05.11 [claude] Oracle → SAP Consumption Entity 전환 (0) 2026.05.11 Oracle SQL → SAP AMDP 전환 가이드 #1 (0) 2026.05.10