Запланированный запуск хранимой процедуры на SQL server


можно ли как-то настроить Microsoft SQL Server для запуска хранимой процедуры на регулярной основе?

8 56

8 ответов:

да, в MS SQL Server можно создавать запланированные задания. В среде SQL Management Studio перейдите к серверу, затем разверните элемент агента SQL Server и, наконец, папку задания для просмотра, редактирования и добавления запланированных заданий.

Если используется MS SQL Server Express Edition, то агент SQL Server недоступен. Я нашел следующее работает для всех изданий:

USE Master
GO

IF  EXISTS( SELECT *
            FROM sys.objects
            WHERE object_id = OBJECT_ID(N'[dbo].[MyBackgroundTask]')
            AND type in (N'P', N'PC'))
    DROP PROCEDURE [dbo].[MyBackgroundTask]
GO

CREATE PROCEDURE MyBackgroundTask
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- The interval between cleanup attempts
    declare @timeToRun nvarchar(50)
    set @timeToRun = '03:33:33'

    while 1 = 1
    begin
        waitfor time @timeToRun
        begin
            execute [MyDatabaseName].[dbo].[MyDatabaseStoredProcedure];
        end
    end
END
GO

-- Run the procedure when the master database starts.
sp_procoption    @ProcName = 'MyBackgroundTask',
                @OptionName = 'startup',
                @OptionValue = 'on'
GO

некоторые замечания:

да, если вы используете агент SQL Server.

Откройте диспетчер предприятия и перейдите в папку управления под экземпляром SQL Server, который вас интересует. Там вы увидите агент SQL Server, а под ним вы увидите раздел заданий.

здесь вы можете создать новое задание, и вы увидите список шагов, которые вам нужно будет создать. Когда вы создаете новый шаг, вы можете задать шаг, чтобы на самом деле выполнить хранимую процедуру (типа TSQL не скрипт). Выбрать база данных, а затем для раздела команды введите что-то вроде:

exec MyStoredProcedure

это обзор, напишите здесь, Если вам нужен какой-либо дополнительный совет.

[Я на самом деле думал, что я мог бы получить в первую очередь на этом, мальчик был я неправ :)]

вероятно, не тот ответ, который вы ищете, но я считаю более полезным просто использовать Планировщик Задач Windows Server

Вы можете использовать команду sqlcmd.exe -S "." -d YourDataBase -Q "exec SP_YourJob"

или даже создать . Таким образом, вы можете даже 2 раза щелкнуть по задаче по требованию.

Это также было приближено в этом здесь

Я добавлю одну вещь: там, где я нахожусь, у нас была куча пакетных заданий, которые выполнялись каждую ночь. Однако мы переходим от этого к использованию клиентского приложения, запланированного в запланированных задачах windows, которое запускает каждое задание. Есть (по крайней мере) три причины для этого:

  1. У нас есть некоторые консольные программы, которые должны работать каждую ночь, а также. Таким образом, все запланированные задачи могут быть в одном месте. Конечно, это создает единую точку отказа, но если консоль работа не работает мы все равно потеряем рабочий день на следующий день.
  2. программа, которая запускает задания, захватывает сообщения печати и ошибки с сервера и записывает их в общий журнал приложений для всех наших пакетных процессов. Это делает ведение журнала из withing заданий sql намного проще.
  3. Если нам когда-нибудь понадобится обновить сервер (и мы надеемся сделать это в ближайшее время), нам не нужно беспокоиться о переносе заданий. Просто точки приложения однажды.

Это очень короткий VB.Net приложение: я могу разместить код, если кто-то заинтересован.

с помощью Management Studio - можно создать задание (unter SQL Server Agent) Одно задание может включать в себя несколько этапов от скриптов T-SQL до пакетов служб SSIS

джеб был быстрее ;)

вы могли бы использовать SQL Server Service Broker для создания пользовательского механизма.

идея (упрощенный):

  1. написать хранимую процедуру/триггер, который начинает разговор ( НАЧАТЬ ДИАЛОГ) как loopback (от my_service к my_service) - получить обработчик разговора

    DECLARE @dialog UNIQUEIDENTIFIER;
    
    BEGIN DIALOG CONVERSATION @dialog
            FROM SERVICE   [name] 
            TO SERVICE      'name' 
            ...;
    
  2. запустите таймер разговора

    DECLARE @time INT;
    BEGIN CONVERSATION TIMER (@dialog)  TIMEOUT = @time;
    
  3. после указанного числа секунд сообщение будет отправлено в службу. Он будет поставлен в очередь с соответствующей очередью.

    CREATE QUEUE queue_name WITH STATUS = ON, RETENTION = OFF
                 , ACTIVATION (STATUS = ON, PROCEDURE_NAME = <procedure_name>
                 , MAX_QUEUE_READERS = 20, EXECUTE AS N'dbo')
                  , POISON_MESSAGE_HANDLING (STATUS = ON) 
    
  4. процедура выполнит специфический код и reanable отметчик времени для того чтобы сгореть снова.


вы можете найти полностью испеченное решение (T-SQL), написанное Michał Gołoś под названием Планировщик Задач

ключевые моменты блог:

плюсы:

  • поддерживается в каждой версии (от Express до Enterprise). Задание агента SQL Server недоступно для SQL Server Express
  • область до уровня базы данных. Вы можете легко перемещать базу данных с соответствующими задачами (особенно когда вам нужно переместить около 100 заданий из одной среды в другую)
  • более низкие привилегии, необходимые для просмотра / управления задачами(база данных уровень)

предлагаемое разграничение:

агент SQL Server (обслуживание):

  • резервное копирование
  • индекс/статистика перестраивает
  • репликация

планировщик задач (бизнес-процессы):

  • удаление старых данных
  • preaggregations/циклические пересчеты
  • денормализация

Как установить его вверх:

  • получить исходный код из раздела: "Do pobrania" - скачать (включение брокера / Настройка схемы tsks / таблица конфигурации + триггеры + хранимая процедура) / настройка брокерских вещей)
  • настройка таблицы конфигурации [tsks].[tsksx_task_scheduler] для добавления новых задач (имена столбцов являются самоописательными, включая пример задачи)

внимание: блог написан на польском языке, но связанный исходный код на английском языке, и это легко следовать.

предупреждение 2: Прежде чем использовать его, пожалуйста, убедитесь, что вы протестировали его на непроизводственной среде.