2009-03-19 6 views
0

J'ai une table avec beaucoup de lignes et j'ai changé la fonction associée au trigger dans les événements insert ou update. Cette fonction effectue des calculs pour mettre à jour des colonnes avec une logique conditionnelle en fonction des valeurs dans deux ou plusieurs cellules, de sorte qu'une seule instruction de mise à jour ne serait pas utile. Donc, quelle instruction SQL puis-je utiliser pour ré-exécuter le déclencheur et mettre à jour toutes les lignes?Quelle instruction SQL puis-je utiliser pour ré-exécuter le déclencheur et mettre à jour toutes les lignes d'une table?

Merci.

Répondre

4

Vous devez mettre à jour une colonne avec exactement la même valeur. Bien sûr, cela dépend des conditions de déclenchement. Par exemple:

UPDATE table 
    SET columnX = columnX; 

De toute façon, comme les meilleures pratiques pour ce cas, j'ai l'habitude et la fonction associée où je peux courir quelque chose comme (ne sais pas si les travaux pour ProgreSQL):

BEGIN 
    for c in (select column_id from table) 
    loop 
    function_on_trigger(c.column_id); 
    end loop; 
END; 
/
0

Pour déclencher le déclencheur, vous devez exécuter le DML qui appelle le déclencheur, par ex. Je comprends dans votre cas effectuer une mise à jour. Une option à considérer est d'effectuer une mise à jour qui ne change rien. Je dois admettre que je ne l'ai jamais essayé cela, mais ce serait la première chose que je voudrais essayer (dans une instance de test bien sûr)

 
    Update [table] 
    set [column_1] = [column_1] 

Alternativement vous pourriez envisager d'appeler directement la fonction dans une déclaration de mise à jour. Soit désactiver le déclencheur lorsque vous faites cela ou accepter qu'il y aura environ deux fois le travail effectué comme réellement nécessaire.

 
    update [table] 
    set [column to change] = [function call] 

Testez les deux premières options dans une instance de test ou (approche non recommandé) en copiant la table (structure et données) et déclencher une nouvelle table et exécuter l'action sur la nouvelle table d'abord.

2

En réponse à la réponse de FerranB, la bonne façon d'exécuter la fonction dans Postgres serait la suivante:

SELECT function_on_trigger(column_id) FROM table; 
Questions connexes