您不能运行不止一次相同的SQL代理作业,那么为什么不作弊?
与其说sp_start_job
,如果你叫sp_add_job
,sp_add_job_step
然后什么援引sp_start_job
由于我指定delete_level = 1,作业将成功执行后删除自身。
给定以下作业定义,在IAmUnique
末尾附加一个GUID或类似的内容,然后使用boom,unique job name,并且可以同时运行它们。
DECLARE @jobId binary(16)
EXEC msdb.dbo.sp_add_job
@job_name = N'IAmUnique'
, @enabled = 1
, @notify_level_eventlog = 0
, @notify_level_email = 2
, @notify_level_netsend = 2
, @notify_level_page = 2
, @delete_level = 0
, @category_name = N'[Uncategorized (Local)]'
, @owner_login_name = N'EU\u001899'
, @job_id = @jobId OUTPUT;
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'IAmUnique'
, @step_name = N'Run package'
, @step_id = 1
, @cmdexec_success_code = 0
, @on_success_action = 1
, @on_fail_action = 2
, @retry_attempts = 0
, @retry_interval = 0
, @os_run_priority = 0
, @subsystem = N'SSIS'
, @command = N'/SQL "\New Package" /SERVER "localhost\dev2008" /CHECKPOINTING OFF /REPORTING E'
, @database_name = N'master'
, @flags = 0;
EXEC msdb.dbo.sp_update_job
@job_name = N'IAmUnique'
, @enabled = 1
, @start_step_id = 1
, @notify_level_eventlog = 0
, @notify_level_email = 2
, @notify_level_netsend = 2
, @notify_level_page = 2
, @delete_level = 1
, @description = N''
, @category_name = N'[Uncategorized (Local)]'
, @notify_email_operator_name = N''
, @notify_netsend_operator_name = N''
, @notify_page_operator_name = N'';
我不打算考虑这个选项,因为用户需要创建工作的权利,我认为这会让它变得太强大,并且不会是一个很好的安全策略。但是,当我查看权限时,看起来我们可以授予该帐户最低的代理权限 - [SQLAgentUserRole](https://msdn.microsoft.com/en-us/library/ms188283.aspx) - 而不给它它不应该有一堆权限。我会深入研究一下,看看它是否有效。 – 2015-01-21 18:48:40
@JoeEnos您可以通过创建一个存储过程来进一步限制,该存储过程能够创建并运行作业,并且仅授予应用程序执行该过程的能力,然后使用类似于“执行AS”的特性来执行更高特权级别的操作。我想如果你让应用程序执行任务,可能不是让它创建它们的更大问题。 – billinkc 2015-01-21 19:48:11
有道理,谢谢。 – 2015-01-21 20:21:08