SQL Server 저장 프로 시저를 실행하는 배치 파일에 스크립트를 사용하려고합니다. 저장 프로시 저는 .CSV 파일의 데이터를 SQL Server 테이블에 대량 삽입합니다. SQL Server에서 저장 프로 시저를 실행하면 아무런 문제없이 실행됩니다. 그러나 배치 파일에서 작동 시키려고하면 실패합니다.
내 배치 스크립트는
set STEP_NBR=STEP113
set SQL_Script_Name= CST_SN_ADD_SPS_CUSTOMER_ORDER_STG_TMP
set ERROR_MSG=%STEP_NBR% %SQL_Script_Name%
call "%DIR_BAT%\CreateLAFMessage.bat" "%~n0.bat-> %STEP_NBR% - Running %SQL_Script_Name%.sql" %_LAF_MSG_DETAILS%
SQLCMD.EXE %SQLCMD_VARS% -S%DB_SERVER_NAME% -d%DB_SP01_NAME% -w2048 -E -b -i"%DIR_SQL%\%SQL_Script_Name%.sql" -o"%DIR_LOG%\%SQL_Script_Name%.lst"
IF NOT %ERRORLEVEL%==0 GOTO ON_ERROR
SQL 스크립트는 저장 프로 시저를 호출합니다.
DECLARE @return_value int
EXEC @return_value = [dbo].[CST_SN_ADD_SPS_CUSTOMER_ORDER_STG_TMP]
SELECT 'Return Value' = @return_value
GO
저장 절차
USE [LVSDB_DRP01]
GO
/****** Object: StoredProcedure [dbo].
[CST_SN_ADD_SPS_CUSTOMER_ORDER_STG_TMP] Script Date: 9/10/2018 10:28:30 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[CST_SN_ADD_SPS_CUSTOMER_ORDER_STG_TMP]
as
BEGIN
BEGIN TRANSACTION;
IF OBJECT_ID('staging.dbo.ADD_CUSTOMER_ORDER_STG_TMP', 'U') IS NULL
CREATE TABLE [staging].[dbo].[ADD_CUSTOMER_ORDER_STG_TMP](
[ITEM_INDX] [nvarchar](50) NOT NULL,
[LOC_INDX] [nvarchar](50) NOT NULL,
[CUST_ORD_INDX] [nvarchar](50) NOT NULL,
[CUST_ORD_LIN_NBR] [nvarchar](50) NOT NULL,
[CUST_ORD_ORD_DATE] [date] NOT NULL,
[CUST_ORD_QTY] [nvarchar](50) NULL,
[CUST_SHP_QTY] [nvarchar](50) NULL,
[SET_ITEM_INDX] [nvarchar](50) NOT NULL,
[HEADER_COMPONENT] [nvarchar](50) NOT NULL,
[BUCKET] [nvarchar](50) NOT NULL
)
IF OBJECT_ID('staging.dbo.ADD_CUSTOMER_ORDER_STG_TMP', 'U') IS NOT NULL
Truncate table staging.dbo.ADD_CUSTOMER_ORDER_STG_TMP;
IF OBJECT_ID('staging.dbo.ADD_CUSTOMER_ORDER_STG_TMP', 'U') IS NOT NULL
BULK INSERT staging.dbo.ADD_CUSTOMER_ORDER_STG_TMP
FROM '\\usashsmdbpcw02f\C$\SNI_Logility\ADD_CUSTOMER_ORDER_STG.csv'
WITH
(
FIELDTERMINATOR = ',',
FIRSTROW = 2
-- ROWTERMINATOR = '\r\n'
);
COMMIT TRANSACTION;
END
저장 프로 시저는 SQL Server에서 실행되므로 오류가 배치 스크립트 또는 파일 경로에 대한 권한이 있다고 가정합니다.
예상 한대로 작동하지 않을 때 표시되는 오류 메시지를 공개하는 것이 도움이 될 것입니다. 배치 스크립트가 아닌 명령 줄에서 각 명령을 실행하고 오류 를 구분할 때 첫 번째 오류가 표시되는 지점을 찾은 다음 명령 줄을 통해 수동으로 실행하고 질문을 편집 하여이 세부 사항을 알려줍니다. 나는 당신의 현재 문구를 기반으로 몇 가지를 생각할 수 있으며 내 첫 번째 의견은 더 자세한 내용을 추가하고 명령 줄을 통해 상관 명령을 수동으로 실행할 때 발생하는 오류와 프로세스의 시점을 알려줍니다.
—
Pimp Juice IT
그리고
—
Pimp Juice IT
\\usashsmdbpcw02f\C$
이것이 숨겨진 관리자 공유 임을 잊지 마십시오 . SP가 작동하는 SQL Server에서 SP를 실행한다는 것은 보안 컨텍스트가 usashsmdbpcw02f
명명 된 컴퓨터 의 숨겨진 관리자 공유에 액세스 할 수 있기 때문 입니다.
\\usashsmdbpcw02f\C$\SNI_Logility\ADD_CUSTOMER_ORDER_STG.csv
추가EXECUTE AS LOGIN = 'domain\username';
하고BULK INSERT
명령문 앞의 어딘가에 SP 에 추가 하여 적어도 읽기 액세스 권한이 있는지 확인할 수 있으며, 이것이 다른지 확인하십시오. SSMS와 sqlcmd에서 SP를 실행하면 SP가 각 방법에 따라 실행되는 보안 차이가 매우 높을 수 있으므로 SP가 파일 공유에 대한 액세스 권한이이 수준에서 해결되어야한다는 스크립트 내에서 명시 적으로 보안 컨텍스트로 변경되도록 지정할 수 있습니다. .