2016-02-01 4 views
1

Я хочу программным образом создавать задания агента SQL Server. Я использую следующий код, во время его запуска не возникает никакой ошибки, но когда я проверяю агента SQL Server, я не вижу никаких заданий.Создавать задания агента SQL Server программно

Итак, вопрос 1: это правильный способ создать вакансию в msdb из базы данных etgv125p (my database)?

Когда я использую connectionString с Initial Catalog=msdb, я получаю сообщение об ошибке

EXECUTE разрешение было отказано на объекте 'CreateSQLAgentjobs', база данных 'MSDB', схема 'ДБО'

Вопрос 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 
+0

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

+0

@TabAlleman Я обновил сохраненный proc. Вы говорите об этом? Если это так, я все равно получаю ту же ошибку. Пожалуйста, поправьте меня, если я что-то делаю неправильно. – CSharper

+0

Я говорю о 'GRANT EXECUTE ON dbo.CreateSQLAgentjobs TO YourLoginName' –

ответ

0

за ошибки вы видите для EXECUTE разрешения было отказано .... пожалуйста открыть SSMS и выполнить следующий код на запросе Закладка:

GRANT EXEC on CreateSQLAgentjobs to PUBLIC 

и удалить его из прока