Я хочу программным образом создавать задания агента 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
Вы пытались предоставить разрешение на выполнение хранимой процедуры себе или публике или любой другой группе, членом которой вы являетесь? –
@TabAlleman Я обновил сохраненный proc. Вы говорите об этом? Если это так, я все равно получаю ту же ошибку. Пожалуйста, поправьте меня, если я что-то делаю неправильно. – CSharper
Я говорю о 'GRANT EXECUTE ON dbo.CreateSQLAgentjobs TO YourLoginName' –