안녕하세요. SQLER의 코난 김대우입니다.
이번 강좌에서는, 8-6. 저장 프로시저 - 종속성(Dependency) 확인을 진행 하겠습니다.
SQLER에서 진행되는, 챗GPT와 함께 배우는 SQL Server 강좌 목록
이번에 진행할 강좌는 저장 프로시저 종속성 확인입니다.
TL;DR
저장 프로시저 내에서 다른 저장 프로시저를 호출할 수 있지만, 종속성에 주의해야 합니다. SQL Server에서 개체 종속성을 확인하는 방법을 설명하며, 이름 변경이나 삭제 시 주의 사항을 강좌로 제공합니다.
저장 프로시저에서 다른 저장 프로시저를 호출할 수 있나요?
가능합니다. SQL Server의 데이터베이스 개체들은 종속되는 개체들을 서로 참조하고 참조받습니다. 저장 프로시저 안에서 다른 저장 프로시저를 실행하는 것은 가능하지만, 종속성에 주의해야 합니다. 예제를 통해 살펴보겠습니다.
USE AdventureWorks; GO -- 저장 프로시저 생성 CREATE OR ALTER PROC pEmployeeInfo @emp_num INT AS SELECT emp_num, emp_name, email FROM Employee WHERE emp_num = @emp_num; GO -- 실행 EXEC pEmployeeInfo 3; -- 저장 프로시저 안에서 다른 저장 프로시저를 실행 CREATE OR ALTER PROC pEmployeeInfo2 @emp_num INT AS EXEC pEmployeeInfo @emp_num; GO -- 실행 EXEC pEmployeeInfo2 3; -- pEmployeeInfo2가 참조하는 저장 프로시저 pEmployeeInfo 이름 변경 EXEC sp_rename 'dbo.pEmployeeInfo', 'dummyproc'; GO -- 실행하면 오류 발생 EXEC pEmployeeInfo2 3; 메시지 2812, 수준 16, 상태 62, 프로시저 pEmployeeInfo2, 줄 6 [배치 시작 줄 22] Could not find stored procedure 'pEmployeeInfo'.
이렇게 pEmployeeInfo2 저장 프로시저는 내부에서 pEmployeeInfo를 실행합니다. 즉, 참조하는 관계입니다. 만약, pEmployeeInfo2가 참조하는 pEmployeeInfo 프로시저 이름을 변경하면 위와 같은 오류가 발생할 수 있으므로 주의하세요.
저장 프로시저 종속성 확인
이런 종속성 이슈를 방지하기 위해, 이름 변경이나 삭제 작업 전, 종속성을 확인하는 게 좋습니다. 저장 프로시저뿐만 아니라 대부분의 데이터베이스 개체에서도 체크할 수 있습니다.
-- Referencing 종속성 확인 -- dbo.pEmployeeInfo 저장 프로시저를 참조하는 종속된 개체를 확인 SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent FROM sys.dm_sql_referencing_entities ('dbo.pEmployeeInfo', 'OBJECT'); GO -- Referenced 종속성 확인 -- dbo.pEmployeeInfo가 참조하는 종속된 개체 확인 - 현재 없음. SELECT referenced_schema_name, referenced_entity_name, referenced_minor_name,referenced_minor_id, referenced_class_desc, is_caller_dependent, is_ambiguous FROM sys.dm_sql_referenced_entities ('dbo.pEmployeeInfo', 'OBJECT'); GO
수행하면, 개체 종속성을 확인할 수 있으며, 삭제나 이름 변경 시 주의해야 합니다.
지연된 이름 확인(Deferred Name Resolution)
그렇다면, 아직 존재하지 않는 저장 프로시저를 참조하는 프로시저는 생성 가능할까요?
-- 아직 존재하지 않는 프로시저를 참조하는 프로시저 생성 CREATE OR ALTER PROC pEmployeeInfo3 @emp_num INT AS EXEC pEmployeeInfoABC @emp_num; GO The module 'pEmployeeInfo3' depends on the missing object 'pEmployeeInfoABC'. The module will still be created; however, it cannot run successfully until the object exists.
이렇게 프로시저는 생성됩니다. 하지만, “종속된 개체가 없어 실행할 수 없다”는 경고를 표시합니다. 이후 종속 개체를 생성하면 정상적으로 실행됩니다. 이를 “지연된 이름 확인”이라고 부르며, 여러 개의 종속된 저장 프로시저나 데이터베이스 개체를 생성할 때 발생 가능한 경고입니다.
간략히, 데이터베이스를 스크립트로 이전하는 작업을 할 때, 개체가 생성되면서 이런 경고가 발생해도 무시하시고, 계속 개체 생성을 하시면 됩니다.
SQL 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.