2009-08-01 5 views
3

Я пишу сценарии развертывания SQL Server, которые автоматически создают задание SQL Server на определенном сервере/экземпляре SQL Server. Я обнаружил, что могу извлечь оператор sql, который может быть использован для создания задания SQL Server автоматически, используя работу сценария как => Create To.Автоматическое создание задания SQL Server

Мое замешательство в том, что я обнаружил, что имя базы данных и имя учетной записи владельца жестко закодированы в генерируемых сценариях sql. Когда я использую sqlcmd для выполнения сценариев sql на другом компьютере для развертывания, имя базы данных и имя учетной записи владельца могут отличаться, поэтому мне нужно передать имя базы данных и имя учетной записи владельца на сценарий создания задания SQL Server и пусть сценарий использует предоставленное имя базы данных и имя учетной записи владельца (кроме жестко закодированных).

Любые идеи, как это сделать?

ответ

3

Вам нужно будет динамически создать сценарий задания, а затем выполнить его. Вы можете попробовать что-то вроде следующего или изменить это на сохраненный процесс с входными параметрами для владельца задания и имени базы данных.

DECLARE @JobName VARCHAR(20) --Job Name 
DECLARE @Owner VARCHAR(200) --Job Owner 
DECLARE @DBName VARCHAR(200) --Database Name 
DECLARE @JobCode VARCHAR(4000) --Create Statement for Job 
SET @JobName = 'Test2' 
SET @Owner = 'BrianD' 
SET @DBName = 'master' 
SET @JobCode = 'USE msdb 
GO 
BEGIN TRANSACTION 
DECLARE @ReturnCode INT 
SELECT @ReturnCode = 0 
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''' + @JobName + ''', 
     @enabled=1, 
     @notify_level_eventlog=0, 
     @notify_level_email=0, 
     @notify_level_netsend=0, 
     @notify_level_page=0, 
     @delete_level=0, 
     @description=N''No description available.'', 
     @category_name=N''[Uncategorized (Local)]'', 
     @owner_login_name=N''' + @Owner + ''', @job_id = @jobId OUTPUT 
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @[email protected], @step_name=N''Version and Prod Level'', 
     @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''TSQL'', 
     @command=N''select SERVERPROPERTY(''''productversion''''), SERVERPROPERTY(''''productlevel'''')'', 
     @database_name=N''' + @DBName + ''', 
     @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_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' 
Exec (@JobCode) 

Надеюсь, это позволит вам двигаться в правильном направлении. Если вам нужна дополнительная помощь, дайте мне знать.

+0

Спасибо BrianD, как вы думаете, помимо владельца задания и имени базы данных, мне нужно сделать любой другие значения в качестве настраиваемых параметров, чтобы сделать скрипт m руда гибкая? – George2

+0

У меня есть связанный с этим вопрос, оцените, можете ли вы взглянуть, http://stackoverflow.com/questions/1219067/strange-scripts-generated-by-sql-server-when-exporting-a-job – George2

+2

Вы можете сделайте почти все, что вы хотите переменным. Вы можете начать с Job Name, Description и Category. Это действительно зависит от вас и от того, для чего вы его будете использовать. У меня есть несколько сценариев создания заданий для создания/запуска/остановки следов, которые я использую. Это зависит от вас и сколько времени вы хотите вложить в него. – BrianD

1

Ответы выше на BrianD, вы можете определить переменные (на самом деле более похожие на макросы препроцессора, чем переменные) на уровне sqlcmd; они заключены в скобки с ведущим знаком $:

SET @JobName = '$(JobName)' 
SET @Owner = '$(Owner)' 

Это позволяет передать информацию о командной строке Sqlcmd с -v переключателем:

sqlcmd -... -i create_jobs.sql -v JobName=Job1 -v Owner=BrianD 
+0

Спасибо BrianD, вы думаете, помимо владельца задания и имени базы данных, мне нужно сделать любые другие значения в качестве настраиваемых параметров, чтобы сделать скрипт более гибким? – George2

+0

У меня есть связанный с этим вопрос, оцените, можете ли вы посмотреть, http://stackoverflow.com/questions/1219067/strange-scripts-generated-by-sql-server-when-exporting-a-job – George2

3

Используя пример из BrainD I Я хотел бы отметить, что его идея использования переменных просто прекрасна, однако передача их в хранимые процедуры с использованием dymanic SQL, безусловно, не является правильным подходом. Скорее, используйте параметры хранимых процедур, чтобы напрямую передавать переменные непосредственно туда, где они нужны.

DECLARE @JobName VARCHAR(20) --Job Name 
DECLARE @Owner VARCHAR(200) --Job Owner 
DECLARE @DBName VARCHAR(200) --Database Name 
DECLARE @JobCode VARCHAR(4000) --Create Statement for Job 
SET @JobName = 'Test2' 
SET @Owner = 'BrianD' 
SET @DBName = 'master' 

BEGIN TRANSACTION 
DECLARE @ReturnCode INT 
SELECT @ReturnCode = 0 
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= @JobName, 
     @enabled=1, 
     @notify_level_eventlog=0, 
     @notify_level_email=0, 
     @notify_level_netsend=0, 
     @notify_level_page=0, 
     @delete_level=0, 
     @description=N'No description available.', 
     @category_name=N'[Uncategorized (Local)]', 
     @owner_login_name= @Owner, 
     @job_id = @jobId OUTPUT 
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'Version and Prod Level', 
     @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'TSQL', 
     @command=N'select SERVERPROPERTY(''productversion''), SERVERPROPERTY(''productlevel'')', 
     @[email protected], 
     @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_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 
1

Я шел по той же самой проблеме сегодня, и как мне справиться с это так просто Выполните следующие действия

  1. Создать хранимую процедуру, которая создает задание с параметром @serverName NVARCHAR (128)

    Create Proc CreateAJob(@serverName nvarchar(128)) 
    
  2. Теперь легко, вы можете получить имя сервера с помощью следующей

    Declare @serverName nvarchar(128) 
    SELECT @[email protected]@SERVERNAME 
    
  3. Выполнить хранимую процедуру для создания задания

    EXEC CreateJob @serverName 
    

То есть это.

Я использую визуальный проект студии дб, и я сделал шаги 2 и 3 ИНТ на postdeployment сценарий

+0

Это может быть лучше включить и сохраненный код proc. –

+0

Чтобы создать хранимую процедуру, просто зайдите в студию управления sql и создайте задание sql. Затем щелкните правой кнопкой мыши на задании, которое вы только что создали, и сделайте Drop и Create, затем вы можете изменить созданный сценарий. –

+0

Спасибо, но я имел в виду, что лучше всего включить всю необходимую информацию в ваш ответ. Вы можете редактировать и т. Д. –

0

Я даже получил его лучше ...Создание хранимой процедуры без параметров и внутри хранимой процедуры сделать:

Declare @serverName nvarchar(128) 
    SELECT @[email protected]@SERVERNAME 

Затем назначьте @servername параметра server_name из sp_add_jobserver как в ниже:

msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name [email protected] 

Для того, чтобы создать хранимую процедуру, которая создает sql-задание, сначала создайте его, используя студию управления sql, а затем щелкните правой кнопкой мыши на задании и сделайте Drop and Create ....