Как запускать хранимую процедуру каждый день в SQL Server Express Edition?

Как можно запускать хранимую процедуру в определенное время каждый день в SQL Server Express Edition?

Примечания:

  • Это необходимо для усечения таблицы аудита.
  • Альтернативой может быть изменение запроса вставки, но это, вероятно, менее эффективно.
  • SQL Server Express Edition не имеет агента SQL Server

Вопросы, относящиеся:

Ответ 1

Поскольку SQL Server Express не поставляется с SQL-агентом, вы можете использовать планировщик Windows для запуска SQLCMD с сохраненным proc или SQL script.

http://msdn.microsoft.com/en-us/library/ms162773.aspx

Ответ 2

Я нашел, что для меня работал следующий механизм.

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

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

  • Стоит записать запись аудита где-нибудь, чтобы вы могли видеть, что запрос действительно выполнялся.
  • Сервер необходимо перезагрузить один раз, чтобы гарантировать, что script запускается в первый раз.

Ответ 3

Если вы используете Express Edition, вам нужно будет использовать планировщик Windows или приложение, подключающееся к серверу каким-либо образом.

Вы использовали планировщик для запуска sqlcmd. Вот несколько инструкций для получения sqlcmd, работающего с экспресс-выпуском.

Ответ 4

Создайте запланированную задачу, которая вызывает "C:\YourDirNameHere\TaskScript.vbs" при запуске. VBScript должен выполнять повторное выполнение задачи (в этом примере это 15-минутный цикл)

Через командную строку (необходимо запустить cmd.exe как администратор):

schtasks.exe /create /tn "TaskNameHere" /tr "\"C:\YourDirNameHere\TaskScript.vbs\" " /sc ONSTARTUP

Пример TaskScript.vbs: этот пользовательский SQL script без использования RunSQLScript.bat

Do While 1
    WScript.Sleep(60000*15)
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.RUN "cmd /c C:\YourDirNameHere\RunSQLScript.bat C:\YourDirNameHere\Some_TSQL_Script.sql", 0
Loop

RunSQLScript.bat: используется sqlcmd для вызова экземпляра базы данных и выполнения SQL script

@echo off
sqlcmd -S .\SQLEXPRESS -i %1

Ответ 5

Планировщик SQL из http://www.lazycoding.com/products.aspx

  • Свободный и простой
  • Поддерживает все версии SQL Server 2000, 2005 и 2008
  • Поддерживает неограниченные экземпляры SQL Server с неограниченным количеством заданий.
  • Позволяет легко планировать задачи обслуживания SQL Server: резервное копирование, восстановление индексов, проверки целостности и т.д.
  • Работает как служба Windows
  • Уведомления по электронной почте о успехах и неудачах работы

Ответ 6

Поскольку был задан еще один подобный вопрос и, вероятно, будет закрыт как дубликат этого, и есть много вариантов, не упомянутых в ответах, уже присутствующих здесь...

Поскольку вы используете SQL Express, вы не можете использовать агент SQL Server. Однако есть много альтернатив, все из которых вы можете планировать с помощью AT или Планировщик задач Windows в зависимости от вашей операционной системы:

Все эти языки/инструменты (и многие другие) имеют возможность подключения к SQL Server и выполнения хранимой процедуры. Вы также можете попробовать эти замены агента:

Ответ 7

Самый простой способ решить эту проблему - создать запрос, который выполняет хранимую процедуру, а затем сохранит ее. Запрос должен выглядеть примерно так, как показано ниже.

     use [database name]
     exec storedproc.sql

Затем создайте командный файл с чем-то похожим на код ниже.

sqlcmd -S servername\SQLExpress -i c:\expressmaint.sql

Затем планировщик задач выполняет пакет так часто, как вам нравится

Ответ 8

Вы можете использовать Task Scheduler для запуска простого консольного приложения, которое выполнило бы оператор Sql.

Ответ 9

Как вы правильно отметили, без процесса агента вам потребуется что-то еще внешнее по отношению к серверу, возможно, служба, которую вы пишете и установите, или планировщик Windows.

Обратите внимание, что при установке Express для локального приложения возможно, что машина не может быть включена в то время, когда вы хотите обрезать таблицу (скажем, вы устанавливаете ее для усечения каждую ночь в полночь, но пользователь никогда не имеет его машина включена).

Итак, ваша запланированная задача никогда не запускается, и ваш журнал аудита выходит из-под контроля (это также проблема с агентом SQL Server, но можно предположить, что реальный сервер будет работать без остановок). Лучшая стратегия, если эта ситуация подходит вам, может заключаться в том, чтобы приложение выполняло ее по требованию, когда обнаруживает, что прошло больше X дней с момента усечения или какой бы то ни было ваша операция.

Еще одна вещь, на которую стоит обратить внимание - это если вы говорите о веб-приложении, может быть время загрузки приложения, и операция может быть выполнена, когда это событие срабатывает.

Как упоминалось в комментарии, существует sp_procoption - это может позволить вашему SP запускаться каждый раз при запуске двигателя - недостатки с этот метод заключается в том, что для длительных экземпляров может существовать много времени между вызовами, и у него все еще возникают проблемы, если движок не работает в то время, когда требуется выполнить операцию.

Ответ 10

Наша компания также использует SQLEXPRESS и не существует агента SQL.

Поскольку нет однозначного ответа как "права", и все решения довольно сложны, я поделюсь тем, что я там сделал. Может быть, это действительно плохо, но он отлично подействовал на меня.

Я выбрал операции Insertion (люди) для таблицы, которая получила тот же самый диапазон времени, который мне нужен, и сделал триггер "ON INSERT", который применяет необходимую функцию.