SQL Server/스크립트
[MSSQL] 에이전트잡(AgentJob) 스크립트 추출
マサキ
2023. 9. 18. 14:12
SQL Server의 GUI를 바탕으로 AgentJob스크립트를 생성하는게 가능하지만
스크립트로 Export하는 쿼리를 작성해보았다.
테스트는 SQL Server 2012, 2019에서 실행
SQL Server 2008 R2이상 버전에서 사용 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
|
USE msdb
GO
DECLARE @name NVARCHAR(100)
DECLARE @enabled NVARCHAR(10)
DECLARE @notify_level_eventlog NVARCHAR(10)
DECLARE @notify_level_email NVARCHAR(10)
DECLARE @notify_level_page NVARCHAR(10)
DECLARE @notify_level_netsend NVARCHAR(10)
DECLARE @delete_level NVARCHAR(10)
DECLARE @description NVARCHAR(100)
DECLARE @category_class NVARCHAR(20)
DECLARE @category_type NVARCHAR(20)
DECLARE @sc_name NVARCHAR(100)
DECLARE @owner_sid NVARCHAR(50)
DECLARE @step_name NVARCHAR(50)
DECLARE @step_id NVARCHAR(20)
DECLARE @cmdexec_success_code NVARCHAR(20)
DECLARE @on_success_action NVARCHAR(20)
DECLARE @on_success_step_id NVARCHAR(20)
DECLARE @on_fail_action NVARCHAR(20)
DECLARE @on_fail_step_id NVARCHAR(20)
DECLARE @retry_attempts NVARCHAR(20)
DECLARE @retry_interval NVARCHAR(20)
DECLARE @os_run_priority NVARCHAR(20)
DECLARE @subsystem NVARCHAR(30)
DECLARE @command NVARCHAR(2000)
DECLARE @database_name NVARCHAR(30)
DECLARE @flags NVARCHAR(20)
DECLARE @sch_name NVARCHAR(30)
DECLARE @sch_enabled NVARCHAR(20)
DECLARE @freq_type NVARCHAR(20)
DECLARE @freq_interval NVARCHAR(20)
DECLARE @freq_subday_type NVARCHAR(20)
DECLARE @freq_subday_interval NVARCHAR(20)
DECLARE @freq_relative_interval NVARCHAR(20)
DECLARE @freq_recurrence_factor NVARCHAR(20)
DECLARE @active_start_date NVARCHAR(20)
DECLARE @active_end_date NVARCHAR(20)
DECLARE @active_start_time NVARCHAR(20)
DECLARE @active_end_time NVARCHAR(20)
DECLARE @schedule_uid NVARCHAR(200)
DECLARE Type_cursor SCROLL CURSOR FOR
SELECT sj.name, sj.enabled, sj.notify_level_eventlog, sj.notify_level_email, sj.notify_level_netsend, sj.notify_level_page,
sj.delete_level, sj.description, sc.name,sl.name,
CASE sc.category_class WHEN 1 THEN N'JOB'
WHEN 2 THEN N'ALERT'
WHEN 3 THEN N'OPERATOR' END AS category_class,
CASE sc.category_type WHEN 1 THEN N'LOCAL'
WHEN 2 THEN N'MULTI-SERVER'
WHEN 3 THEN N'NONE' END AS category_type
FROM dbo.sysjobs sj
INNER JOIN sys.syslogins sl ON sj.owner_sid = sl.sid
INNER JOIN msdb.dbo.sysjobsteps sjs ON sj.job_id = sjs.job_id
INNER JOIN msdb.dbo.syscategories sc ON sj.category_id = sc.category_id
WHERE sjs.step_id =1
/*조건에 Job이름을 넣으면 해당Job만 추출*/
--AND sj.name IN ('')
ORDER BY sj.name ASC
FOR READ ONLY
OPEN Type_cursor
FETCH FIRST FROM Type_cursor
INTO @name, @enabled, @notify_level_eventlog, @notify_level_email, @notify_level_netsend, @notify_level_page,
@delete_level, @description, @sc_name, @owner_sid, @category_class, @category_type
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT '/***** JOB ' + @name + ' Script Export *****/'
PRINT 'USE [msdb]
GO' + CHAR(10)
PRINT 'BEGIN TRANSACTION'
PRINT 'DECLARE @ReturnCode INT'
PRINT 'SELECT @ReturnCode = 0' + CHAR(10)
PRINT 'IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N''' + @sc_name + ''' AND category_class=1)'
PRINT 'BEGIN'
PRINT 'EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N''' + @category_class + ''', @type=N''' + @category_type + ''', @name=N''' + @sc_name + ''''
PRINT 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback' + CHAR(10)
PRINT 'END' + CHAR(10)
PRINT 'DECLARE @jobId BINARY(16)'
PRINT 'EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N''' + @name + ''','
PRINT ' @enabled=' + @enabled + ','
PRINT ' @notify_level_eventlog=' + @notify_level_eventlog + ','
PRINT ' @notify_level_email=' + @notify_level_email + ','
PRINT ' @notify_level_netsend=' + @notify_level_netsend + ','
PRINT ' @notify_level_page=' + @notify_level_page + ','
PRINT ' @delete_level=' + @delete_level + ','
PRINT ' @description=N''' + @description + ''','
PRINT ' @category_name=N''' + @sc_name + ''','
PRINT ' @owner_login_name=N''' + @owner_sid + ''', @job_id = @jobId OUTPUT'
PRINT 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback' + CHAR(10)
DECLARE Type_cursor2 SCROLL CURSOR FOR
SELECT
sjs.step_name, sjs.step_id, sjs.cmdexec_success_code, sjs.on_success_action, sjs.on_success_step_id, sjs.on_fail_action,
sjs.on_fail_step_id,
sjs.retry_attempts, sjs.retry_interval, sjs.os_run_priority, sjs.subsystem,
REPLACE (sjs.command, '''', '''''') AS command,
sjs.database_name, sjs.flags
FROM dbo.sysjobs sj
LEFT OUTER JOIN msdb.dbo.sysjobsteps sjs ON sj.job_id = sjs.job_id
LEFT OUTER JOIN msdb.dbo.syscategories sc ON sj.category_id = sc.category_id
WHERE sj.name = @name
ORDER BY sjs.step_id ASC
FOR READ ONLY
OPEN Type_cursor2
FETCH FIRST FROM Type_cursor2
INTO @step_name, @step_id, @cmdexec_success_code, @on_success_action, @on_success_step_id,@on_fail_action,@on_fail_step_id,@retry_attempts,
@retry_interval,@os_run_priority, @subsystem,@command,@database_name, @flags
WHILE (@@FETCH_STATUS =0)
BEGIN
PRINT 'EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N''' + @step_name + ''','
PRINT ' @step_id=' + @step_id + ','
PRINT ' @cmdexec_success_code=' + @cmdexec_success_code + ','
PRINT ' @on_success_action=' + @on_success_action + ','
PRINT ' @on_success_step_id=' + @on_success_step_id + ','
PRINT ' @on_fail_action=' + @on_fail_action + ','
PRINT ' @on_fail_step_id=' + @on_fail_step_id + ','
PRINT ' @retry_attempts=' + @retry_attempts + ','
PRINT ' @retry_interval=' + @retry_interval + ','
PRINT ' @os_run_priority=' + @os_run_priority + ', @subsystem=N''' + @subsystem +''','
PRINT ' @command=N''' + @command + ''','
IF (@database_name IS NOT NULL)
BEGIN
PRINT ' @database_name=N''' + @database_name + ''','
END
PRINT ' @flags=' + @flags
PRINT 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback' + CHAR(10)
FETCH NEXT FROM Type_cursor2
INTO @step_name, @step_id, @cmdexec_success_code, @on_success_action, @on_success_step_id,@on_fail_action,@on_fail_step_id,@retry_attempts,
@retry_interval,@os_run_priority, @subsystem,@command,@database_name, @flags
END
CLOSE Type_cursor2
DEALLOCATE Type_cursor2
PRINT 'EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1'
PRINT 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'
DECLARE Type_cursor3 SCROLL CURSOR FOR
SELECT
sche.name, sche.enabled, sche.freq_type, sche.freq_interval, sche.freq_subday_type, sche.freq_subday_interval,
sche.freq_relative_interval, sche.freq_recurrence_factor, sche.active_start_date, sche.active_end_date,
sche.active_start_time, sche.active_end_time, sche.schedule_uid
FROM dbo.sysjobs sj
LEFT OUTER JOIN msdb.dbo.sysjobsteps sjs ON sj.job_id = sjs.job_id
LEFT OUTER JOIN msdb.dbo.syscategories sc ON sj.category_id = sc.category_id
LEFT OUTER JOIN msdb.dbo.sysjobschedules sjsche ON sj.job_id = sjsche.job_id
LEFT OUTER JOIN msdb.dbo.sysschedules sche ON sjsche.schedule_id = sche.schedule_id
WHERE sj.name = @name AND sjs.step_name = @step_name
ORDER BY sche.name ASC
FOR READ ONLY
OPEN Type_cursor3
FETCH FIRST FROM Type_cursor3
INTO @sch_name, @sch_enabled, @freq_type, @freq_interval, @freq_subday_type,
@freq_subday_interval,@freq_relative_interval,@freq_recurrence_factor,@active_start_date, @active_end_date,
@active_start_time, @active_end_time, @schedule_uid
WHILE (@@FETCH_STATUS =0)
BEGIN
IF (@sch_name IS NOT NULL)
BEGIN
PRINT 'EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N''' + @sch_name + ''','
PRINT ' @enabled=' + @sch_enabled + ','
PRINT ' @freq_type=' + @freq_type + ','
PRINT ' @freq_interval=' + @freq_interval + ','
PRINT ' @freq_subday_type=' + @freq_subday_type + ','
PRINT ' @freq_subday_interval=' + @freq_subday_interval + ','
PRINT ' @freq_relative_interval=' + @freq_relative_interval + ','
PRINT ' @freq_recurrence_factor=' + @freq_recurrence_factor + ','
PRINT ' @active_start_date=' + @active_start_date + ','
PRINT ' @active_end_date=' + @active_end_date + ','
PRINT ' @active_start_time=' + @active_start_time + ','
PRINT ' @active_end_time=' + @active_end_time + ','
PRINT ' @schedule_uid=N''' + @schedule_uid + ''''
PRINT 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'
END
FETCH NEXT FROM Type_cursor3
INTO @sch_name, @sch_enabled, @freq_type, @freq_interval, @freq_subday_type,
@freq_subday_interval,@freq_relative_interval,@freq_recurrence_factor,@active_start_date, @active_end_date,
@active_start_time, @active_end_time, @schedule_uid
END
CLOSE Type_cursor3
DEALLOCATE Type_cursor3
PRINT 'EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N''(local)'''
PRINT 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'
PRINT 'COMMIT TRANSACTION'
PRINT 'GOTO EndSave'
PRINT 'QuitWithRollback:'
PRINT ' IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION'
PRINT 'EndSave:' +CHAR(10)
PRINT 'GO' + CHAR(10)
FETCH NEXT FROM Type_cursor
INTO @name, @enabled, @notify_level_eventlog, @notify_level_email, @notify_level_netsend, @notify_level_page,
@delete_level, @description, @sc_name, @owner_sid, @category_class, @category_type
END
CLOSE Type_cursor
DEALLOCATE Type_cursor
|
cs |
<출처 : 본인작성>
이상