una - permisos para ejecutar procedimientos almacenados sql-server
¿Cómo ejecutar un procedimiento almacenado todos los días en SQL Server Express Edition? (10)
¿Cómo es posible ejecutar un procedimiento almacenado a una hora determinada todos los días en SQL Server Express Edition?
Notas:
- Esto es necesario para truncar una tabla de auditoría.
- Una alternativa sería modificar la consulta de inserción, pero esto probablemente sea menos eficiente.
- SQL Server Express Edition no tiene el Agente SQL Server
Preguntas relacionadas:
Como SQL Server Express no viene con el Agente SQL, puede usar el programador de Windows para ejecutar un SQLCMD con un proceso almacenado o un script SQL.
Como ha señalado correctamente, sin el proceso del agente, necesitará algo más externo al servidor, tal vez un servicio que escriba e instale o el programador de Windows.
Tenga en cuenta que con una instalación Express para una aplicación local, es posible que la máquina no esté encendida en el momento en que desee truncar la mesa (supongamos que la configura para que se trunque todas las noches a la medianoche, pero el usuario nunca tiene su máquina encendida). ).
Por lo tanto, su tarea programada nunca se ejecuta y su registro de auditoría se sale de control (esto también es un problema con el Agente SQL Server, pero se podría suponer que un servidor real se ejecutará sin parar). Una mejor estrategia si esta situación se ajusta a la suya podría ser hacer que la aplicación lo haga bajo demanda cuando detecte que han transcurrido más de X días desde el truncamiento o cualquiera que sea su operación.
Otra cosa a tener en cuenta es que si está hablando de una aplicación web, puede haber un momento en que se cargue la aplicación y la operación podría realizarse cuando se dispare ese evento.
Como se mencionó en el comentario, hay sp_procoption (esto podría permitir que su SP se ejecute cada vez que se inicie el motor). Los inconvenientes de este método son que, para las instancias de larga ejecución, puede haber un largo tiempo entre las llamadas, y todavía tiene problemas si el motor no está funcionando en los momentos en que necesita que se realice la operación.
Cree una tarea programada que llame "C: / YourDirNameHere / TaskScript.vbs" en el inicio. VBScript debe realizar la ejecución repetida de tareas (en este ejemplo, es un bucle de 15 minutos)
A través de la línea de comandos (debe ejecutar cmd.exe como administrador):
schtasks.exe /create /tn "TaskNameHere" /tr "/"C:/YourDirNameHere/TaskScript.vbs/" " /sc ONSTARTUP
Ejemplo TaskScript.vbs: esto ejecuta su script SQL personalizado de forma silenciosa utilizando 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: esto usa sqlcmd para llamar a la instancia de la base de datos y ejecutar el script SQL
@echo off
sqlcmd -S ./SQLEXPRESS -i %1
Encontré el siguiente mecanismo trabajado para mí.
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
Algunas notas:
- Vale la pena escribir una entrada de auditoría en algún lugar para que pueda ver que la consulta realmente se ejecutó.
- El servidor necesita reiniciarse una vez para asegurarse de que la secuencia de comandos se ejecute la primera vez.
La forma más fácil que he encontrado para abordar este problema es crear una consulta que ejecute el procedimiento almacenado y luego guardarlo. La consulta debe ser similar a esta a continuación.
use [database name]
exec storedproc.sql
Luego crea un archivo por lotes con algo similar al código que se encuentra debajo.
sqlcmd -S servername/SQLExpress -i c:/expressmaint.sql
Luego haga que el programador de tareas ejecute el lote tantas veces como lo desee
Nuestra empresa también utiliza SQLEXPRESS y no hay un Agente SQL.
Como no hay una respuesta marcada como "correcta" y todas las soluciones son bastante complejas, compartiré lo que hice allí. Puede que sea realmente malo, pero me funcionó muy bien.
He elegido las operaciones de Inserción (las personas lo hacen) a una tabla que tiene el mismo rango de tiempo que yo necesité e hice un activador "EN INSERTO" que aplica la función necesaria.
Podría usar el Programador de tareas para activar una aplicación de consola simple que ejecutaría la instrucción Sql.
Si está utilizando Express Edition, tendrá que usar el Programador de Windows o la aplicación que se conecta al servidor de alguna manera.
Usaría el programador para ejecutar sqlcmd. Aquí hay algunas instrucciones para que sqlcmd funcione con Express Edition.
Ya que se hizo otra pregunta similar, y probablemente se cerrará como un duplicado de esta, y hay muchas opciones que no se mencionan en las respuestas ya presentes aquí ...
Como está utilizando SQL Express, no puede usar el Agente SQL Server. Sin embargo, hay muchas alternativas, todas las cuales puede programar usando AT o el Programador de tareas de Windows según su sistema operativo:
Todos estos idiomas / herramientas (y muchos otros) tienen la capacidad de conectarse a SQL Server y ejecutar un procedimiento almacenado. También puede probar estos reemplazos de agente:
Programador SQL de http://www.lazycoding.com/products.aspx
- Gratis y sencillo
- Soporta todas las versiones de SQL Server 2000, 2005 y 2008
- Admite instancias ilimitadas de SQL Server con un número ilimitado de trabajos.
- Permite programar fácilmente las tareas de mantenimiento de SQL Server: copias de seguridad, reconstrucciones de índices, verificaciones de integridad, etc.
- Se ejecuta como servicio de Windows
- Notificaciones por correo electrónico sobre el éxito y el fracaso del trabajo