그래서 Robocopy 스크립트를 실행하여 모든 파일을 한 폴더에서 다른 폴더로 이동하는 기본 SQL 에이전트 작업이 있습니다.
꽤 기본적인 일정으로.
그러나 아직 실행되지 않았습니다. 나는 성공적으로 달리는 것을 의미하지는 않는다. 그럴만한 이유가 있습니까?
자세한 내용은 작업을 스크립트로 작성하겠습니다.
USE [msdb]
GO
/****** Object: Job [MoveMantisFilesToArchive] Script Date: 12/23/2015 10:21:52 AM ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 12/23/2015 10:21:52 AM ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'MoveMantisFilesToArchive',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=2,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'Moves Mantis files to archive. It''s a very descriptive title.',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'sa',
@notify_email_operator_name=N'MyEmailGroup', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [Move the files in the afformentioned title.] Script Date: 12/23/2015 10:21:53 AM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Move the files in the afformentioned title.',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'CmdExec',
@command=N'robocopy MySoruce MyDestination /mov',
@flags=0,
@proxy_name=N'RunsAs'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'M-F',
@enabled=1,
@freq_type=8,
@freq_interval=62,
@freq_subday_type=1,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=1,
@active_start_date=20151218,
@active_end_date=99991231,
@active_start_time=170000,
@active_end_time=235959,
@schedule_uid=N'bcb83273-19e8-49fb-a456-8517642370e3'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO
답변
이 질문에 대한 논평 :이 게시물을 살펴보면 귀하의 작업이 원래 ‘sa’로 실행되고 있음을 알았습니다. SQL Server의 서비스 계정에 필요한 파일 공유에 대한 권한 이 없는 것 같습니다 .
이것은 분명히 작업이 마치 ” 실행 중”인 것처럼 보이는 원인이되었습니다 . 물론 실제로 아무 일도 일어나지 않았습니다.
필수적이지 않은 폴더에 대한 SQL Server 서비스 계정 권한 부여를 보류 하는 것이 가장 좋습니다 . 이렇게하면 안전하지 않은 활동으로 인해 SQL Server 환경을 악용하지 못하게됩니다. 저장 프로 시저가 기본적으로 비활성화되어 있는 것과 같은 이유입니다 .xp_cmdshell
sa
파일 시스템에 필요한 권한이있는 계정으로 전환하면 모든 것이 작동했습니다. 물론 옳은 일이었습니다.
예약 된 SQL 에이전트 작업이 때때로 중단되는 경우가 있습니다 (그러나 여전히 ‘실행중인’것처럼 보입니다). 파일 시스템에 액세스하지 못하는 등의 외부 문제로 인한 것일 수 있습니다.
SQL 에이전트가 작업이 “실행 중”이라고 생각하는 한 작업을 다시 시작하려고 시도하지 않습니다.
간단한 수업 :
- ‘sa’는 SQL Server를 지배한다고 생각하지만 다른 곳에서는 권리를 구해야합니다.
- SQL 에이전트 작업 기록을 검토 할 때 너무 오래 실행 된 작업에주의하십시오. 이는 일반적으로 SQL 에이전트가 프로세스가 종료되었음을 인식하지 못함을 의미합니다.
- SQL Server 외부의 데이터 또는 개체에 액세스해야하는 SQL 에이전트 작업에 항상 프록시 계정을 사용하십시오. 또한 프록시가 사용중인 자격 증명에 권한이 부여되어 있는지 확인하십시오.
물론 모든 규칙에는 예외가 있습니다.