web-dev-qa-db-fra.com

Comment créer un déclencheur SQL pour exécuter une procédure stockée lorsqu'une table est mise à jour

j'ai besoin d'aide pour créer un déclencheur pour exécuter une qf.stored_procedure lorsqu'une qf.table est créée. AT le moment, j'ai un travail t exécuter la procédure stockée toutes les 15 minutes, mais changer ce n'est pas une option.

L'idée est que le déclencheur exécute la procédure stockée chaque fois que la table est mise à jour, qu'il s'agisse d'une seule ligne ou de toutes. De plus, je ne sais pas s'il faut le créer dans les déclencheurs sous la table ou les déclencheurs de base de données?. je veux que le script vérifie si le déclencheur existe et s'il ne le crée pas.

nom de la table: qf.customer_working_hours Colonnes: WHours_id,DayOFW

Procédure stockée: qf.ServiveRefreshCustomer_WH

Suis nouveau dans les scripts SQL et les déclencheurs SQL, toute aide sera appréciée

4
constellation-pro

Je suppose que vous essayez d'implémenter une réplication de base à l'aide d'un déclencheur. Tant que votre processus reste assez simple, cela devrait fonctionner correctement.

Cependant, je vous conseillerais de lire (c'est-à-dire google) pourquoi l'exécution de procédures stockées à partir de déclencheurs n'est pas une bonne idée, ainsi que la fonctionnalité de réplication transactionnelle intégrée de SQL. Voici un guide pratique sur le 2ème sujet: http://www.sql-server-performance.com/2010/transactional-replication-2008-r2/

Cela dit, voici ce que je pense devrait fonctionner:

USE [database_name]
IF EXISTS (SELECT 1 FROM sys.triggers WHERE name = N'trigger_name')
BEGIN
  THROW 51000, 'The trigger [trigger_name] already exists.', 1;
END
ELSE
  CREATE TRIGGER [trigger_name] ON qf.customer_working_hours
  AFTER INSERT, UPDATE, DELETE AS
  BEGIN
    SET NOCOUNT ON
    EXEC [procedure_database].qf.ServiveRefreshCustomer_WH
  END
BEGIN
END

EDIT: déclencheur mis à jour s'il existe, vérifiez la suggestion d'Aaron ci-dessous.

6
Michael Granowski

Voici un lien très similaire:

https://stackoverflow.com/questions/3768278/call-stored-procedure-within-create-trigger-in-sql-server

Étant donné que la portée est une action résultant d'un changement de données dans une table, vous souhaiterez écrire le déclencheur sur la table, pas la base de données.

Lorsque vous dites "je veux que le script vérifie si le déclencheur existe et s'il ne le crée pas", voulez-vous dire le script de création du déclencheur ou la procédure qu'il est censé exécuter?

0
Dog OnAPorch

Merci Dog OnAPorch, votre lien a été très utile. J'ai oublié de vérifier si le déclencheur existe à cette occasion, mais j'ai réussi à obtenir une version de travail à partir du lien que vous avez fourni.

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO

CREATE TRIGGER qf.Update_ServiceWorkingHours_Cache     
ON  qf.customer_working_Hours    
AFTER INSERT,UPDATE AS  BEGIN
    SET NOCOUNT ON;
    -- EXEC do something here   
EXEC [qf].[ServiceRefreshCustomer_WH] 
END 
GO

Tout fonctionne comme un charme, merci à tous pour l'aide

0
constellation-pro