2010-02-19 4 views
0

Есть ли способ установить SqlJobs на SqlServer по сценарию? Я хотел бы, чтобы sqljobs устанавливались при удаленном настройке базы данных у клиента. Это возможно?Автоматическая установка SqlJobs SqlServer

+0

Хмм. Я на самом деле пытаюсь увеличить мнение по этому вопросу. Я не думаю, что мой отличный ответ, и я хотел бы помочь вам больше, если бы вы предоставили лучшую информацию, или другие будут взвешивать комментарии и ответы. –

+0

Ну, лучше, что вы имеете в виду? Теперь мне нужно развернуть базы данных на удаленных серверах, и я хотел бы добавить эти задания в нашу непрерывную интеграцию. У нас есть система управления версиями баз данных, которая автоматически выполняет сценарии обновления и изменения в sps и функциях. Хотелось бы добавить эти sqljobs тоже. –

ответ

2

Если вы смысл добавлять задания SQL Agent, вам нужно только посмотреть насколько sp_add_job (шаг | график | сервер) хранимые процедуры в MSDB, которые достаточно хорошо описаны в BOL

Если, с другой стороны, вы говорите об обеспечении установки агента, запуске и т. д., тогда я не верю, что есть способ сделать это через скрипт.

Если, с другой стороны, вы говорите о каком-то конкретном продукте/базе данных, когда речь идет о SQLJobs, тогда этот ответ вам совсем не поможет.

Редактировать

И самый простой способ, чтобы получить правильные вызовы (опять же, если мы говорим работу SQL Agent) является построение их на локальном компьютере, а затем сценарий их через SSMS/EM. Самый большой найденный у меня вопрос: вам нужно добавить сервер к заданию, даже если он предназначен только для работы на локальном сервере.

Edit 2

В ответ на первый комментарий - ваш призыв к sp_add_jobserver можно указать имя сервера как «(Local)», который будет делать это локальная работа сервера.

Вот короткий, но полный (и, надеюсь, все еще работающий) скрипт, который автоматизирует восстановление базы данных за одну ночь. Обратите внимание, что он не ссылается на какой сервер он включен, поэтому добавит задание на любой сервер, на котором он запущен:

USE [msdb] 
GO 

BEGIN TRANSACTION 
DECLARE @ReturnCode INT 
SELECT @ReturnCode = 0 
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Database Maintenance' AND category_class=1) 
BEGIN 
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Database Maintenance' 
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 

END 

DECLARE @jobId BINARY(16) 
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'RESTORE_DatabaseN', 
     @enabled=1, 
     @notify_level_eventlog=2, 
     @notify_level_email=0, 
     @notify_level_netsend=0, 
     @notify_level_page=0, 
     @delete_level=0, 
     @description=N'No description available.', 
     @category_name=N'Database Maintenance', 
     @owner_login_name=N'sa', @job_id = @jobId OUTPUT 
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'step 1', 
     @step_id=1, 
     @cmdexec_success_code=0, 
     @on_success_action=3, 
     @on_success_step_id=0, 
     @on_fail_action=2, 
     @on_fail_step_id=0, 
     @retry_attempts=0, 
     @retry_interval=1, 
     @os_run_priority=0, @subsystem=N'TSQL', 
     @command=N'DECLARE @BakFile varchar(120), 
     @OLD_DB sysname, 
     @NEW_DB sysname, 
     @RestoreData sysname, 
     @RestoreLog sysname, 
     @DBLogical varchar(255), 
     @LogLogical varchar(255), 

SET @OLD_DB  = ''DatabaseN'' 
SET @NEW_DB  = ''DatabaseN'' 
SET @BakFile = ''\\remoteserver\Backups\Server2\DatabaseN\DatabaseN.BAK'' 

SET @RestoreData = ''E:\sqldata\'' + @NEW_DB + ''.mdf'' 
SET @RestoreLog = ''F:\SQLLogs\'' + @NEW_DB + ''_log.ldf'' 

create table #filelist (LogicalName varchar(255), PhysicalName varchar(255), Type varchar(20), FileGroupName varchar(255), Size varchar(20), MaxSize varchar(20)) 
insert #filelist exec (''RESTORE FILELISTONLY FROM disk = '''''' + @BakFile + '''''''') 
select @DBLogical = LogicalName from #filelist where Type = ''D'' 
select @LogLogical = LogicalName from #filelist where Type = ''L'' 

RESTORE DATABASE @NEW_DB FROM DISK = @BakFile 
WITH MOVE @DBLogical TO @RestoreData, 
MOVE @LogLogical TO @RestoreLog, REPLACE 
EXEC ('' USE '' + @NEW_DB + '' BACKUP LOG '' + @NEW_DB + '' WITH Truncate_Only'') 

EXEC ('' USE '' + @NEW_DB + '' ALTER DATABASE '' + @NEW_DB + '' SET RECOVERY SIMPLE'') 

--EXEC ('' USE '' + @NEW_DB + '' dbcc shrinkfile('' + @LogLogical + '', 2000)'') 
', 
     @database_name=N'master', 
     @flags=0 
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 @[email protected], @name=N'daily', 
     @enabled=1, 
     @freq_type=8, 
     @freq_interval=127, 
     @freq_subday_type=1, 
     @freq_subday_interval=0, 
     @freq_relative_interval=0, 
     @freq_recurrence_factor=1, 
     @active_start_date=20070708, 
     @active_end_date=99991231, 
     @active_start_time=11500, 
     @active_end_time=235959 
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 
+0

Действительно, добавление сервера на работу - это то, что все испортило. Мне нужно развернуть задания на разных серверах. –

Смежные вопросы