以编程方式创建 SQL Server 代理作业

Posted

技术标签:

【中文标题】以编程方式创建 SQL Server 代理作业【英文标题】:Create SQL Server Agent jobs programatically 【发布时间】:2016-02-01 16:49:41 【问题描述】:

我想。我正在使用以下代码,在运行它时不会引发任何错误,但是当我检查 SQL Server 代理时,我看不到任何作业。

所以问题 1:这是从 etgv125p (my database) 数据库在 msdb 中创建工作的正确方法吗?

当我将connectionStringInitial Catalog=msdb 一起使用时,出现错误

对象“CreateSQLAgentjobs”、数据库“msdb”、架构“dbo”的 EXECUTE 权限被拒绝

问题 2:我需要拥有什么类型的凭据?我已经是管理员了。

代码:

static void Main(string[] args)

    string connetionString = "Data Source=SERVER;Initial Catalog=etgv125p;User ID=USER;Password=PASSWORD;Application Name=LOCAL";
    //string connetionString = "Data Source=SERVER;Initial Catalog=msdb;User ID=USER;Password=PASSWORD;Application Name=LOCAL";

    SqlConnection cnn = new SqlConnection(connetionString);
    SqlCommand cmd = new SqlCommand();

    string job = "Test_Job";
    string command = "Test_StoredProc";
    string serverName = "SERVERNAME";
    string startDate = DateTime.Now.ToShortDateString();
    string startTime = DateTime.Now.TimeOfDay.ToString();

    try
    
        cmd.CommandText = "CreateSQLAgentjobs";
        cmd.Parameters.AddWithValue("@job", job);
        cmd.Parameters.AddWithValue("@mycommand", command);
        cmd.Parameters.AddWithValue("@servername", serverName);
        cmd.Parameters.AddWithValue("@startdate", startDate);
        cmd.Parameters.AddWithValue("@starttime", startTime);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection = cnn;

        cnn.Open();
        cmd.ExecuteNonQuery();   // Error when using msdb connection string.
        cnn.Close();
    
    catch (Exception ex)
    
        // ignored
    

存储过程:

ALTER PROCEDURE CreateSQLAgentjobs 
@job NVARCHAR(128),
@mycommand NVARCHAR(max), 
@servername NVARCHAR(28),
@startdate NVARCHAR(8),
@starttime NVARCHAR(8)
AS
BEGIN TRY
    BEGIN TRAN

    GRANT EXEC on CreateSQLAgentjobs to PUBLIC
    --1. Add a job
    EXEC msdb.dbo.sp_add_job
        @job_name = @job

    --2. Add a job step named process step. This step runs the stored procedure
    EXEC msdb.dbo.sp_add_jobstep
        @job_name = @job,
        @step_name = N'process step',
        @subsystem = N'TSQL',
        @command = @mycommand

    --3. Schedule the job at a specified date and time
    EXEC msdb.dbo.sp_add_jobschedule @job_name = @job,
        @name = 'MySchedule',
        @freq_type=1,
        @active_start_date = @startdate,
        @active_start_time = @starttime

    --4. Add the job to the SQL Server 
    EXEC msdb.dbo.sp_add_jobserver
        @job_name =  @job,
        @server_name = @servername
    COMMIT TRAN
END TRY
BEGIN CATCH
    SELECT ERROR_Message(), ERROR_Line();
    ROLLBACK TRAN
END CATCH

【问题讨论】:

您是否尝试将存储过程的执行权限授予您自己、公众或您所属的任何其他组? @TabAlleman 我已经更新了我的存储过程。你说的是这种方式吗?如果是这样,我仍然会遇到同样的错误。如果我在这里做错了,请纠正我。 我说的是GRANT EXECUTE ON dbo.CreateSQLAgentjobs TO YourLoginName @TabAlleman 我也试过了,但同样的错误。 您没有将 GRANT 语句放入存储过程代码中,就像您在示例中所做的那样。只需在 SSMS 中打开一个窗口并自行执行 GRANT 语句即可。 【参考方案1】:

对于您看到的 EXECUTE 权限被拒绝的错误......请打开 SSMS 并在查询选项卡上执行以下代码:

GRANT EXEC on CreateSQLAgentjobs to PUBLIC

并将其从 proc 中删除

【讨论】:

以上是关于以编程方式创建 SQL Server 代理作业的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server代理(8/12):使用SQL Server代理外部程序

初识SQL Server代理&作业

SQL Server 代理作业超时

调度多个相互依赖的 SQL Server 代理作业的做法是啥?

Sql Server代理作业

SQL Server Alwayson创建代理作业注意事项