débogage postgresql déclencheur
J'ai ce Déclencheur dans Postgresql, que je ne peux pas juste se rendre au travail (ne fait rien). Pour comprendre, il y a la façon dont je l'a défini:
CREATE TABLE documents (
...
modification_time timestamp with time zone DEFAULT now()
);
CREATE FUNCTION documents_update_mod_time() RETURNS trigger
AS $$
begin
new.modification_time := now();
return new;
end
$$
LANGUAGE plpgsql;
CREATE TRIGGER documents_modification_time
BEFORE INSERT OR UPDATE ON documents
FOR EACH ROW
EXECUTE PROCEDURE documents_update_mod_time();
Maintenant pour le rendre un peu plus intéressant.. Comment voulez-vous de débogage déclencheurs?
- Ce n'est pas strictement liées, mais vous trouverez peut-être utile dans votre pgsql aventures de toute façon: stackoverflow.com/questions/430123/...
Vous devez vous connecter pour publier un commentaire.
Utiliser le code suivant à l'intérieur d'une fonction de déclenchement, puis de regarder les "messages" dans l'onglet pgAdmin3 ou la sortie dans psql:
Pour voir ce qui déclenche effectivement appelés, combien de fois etc, l'instruction suivante est la bouée de sauvetage de choix:
Notez que si votre déclencheur n'est pas appelé et que vous utilisez de l'héritage, peut-être que vous avez défini un trigger sur la table parent, alors que les déclencheurs ne sont pas héritées par enfant automatiquement des tables.
À l'étape par le biais de la fonction, vous pouvez utiliser le débogueur intégré dans pgAdmin3, qui sur Windows est activé par défaut; tout ce que vous avez à faire est d'exécuter le code trouvé dans ...\8.3\share\contrib\pldbgapi.sql sur la base de données que vous déboguez, redémarrez pgAdmin3, cliquez sur le bouton droit de déclenchement de la fonction, cliquez sur 'Définir un point d'arrêt", puis exécuter une instruction qui provoque le déclenchement de l'incendie, tels que la mise à JOUR de la déclaration ci-dessus.
S'avère que j'ai été en utilisant l'héritage dans le problème ci-dessus et j'ai oublié de le mentionner. Maintenant pour tout le monde qui peut s'exécuter dans ce ainsi, voici un peu de débogage conseils:
Utiliser le code suivant pour déboguer ce qu'un déclencheur est en train de faire:
Pour voir ce qui déclenche effectivement appelés, combien de fois etc, l'instruction suivante est la bouée de sauvetage de choix:
Puis, il y a une chose que je ne connaissais pas avant: incendie ne se déclenche que lorsque la mise à jour de la table exact qu'ils sont définis sur. Si vous utiliser l'héritage, vous DEVEZ définir sur les tables enfants ainsi!
Vous pouvez utiliser 'raise notice' états à l'intérieur de votre fonction de déclenchement pour le déboguer. Pour déboguer le déclencheur de ne pas être appelé à tout, c'est une autre histoire.
Si vous ajoutez un "raise exception' à l'intérieur de votre fonction de déclenchement, pouvez-vous encore faire les insertions, mises à jour?
Aussi, si votre test de mise à jour se produit dans la même transaction que votre insert de test, maintenant() sera le même (car il n'est calculée une fois par transaction) et, par conséquent, la mise à jour à ne rien faire. Si c'est le cas, soit de les faire dans des transactions distinctes, ou si c'est une unité de test, et vous ne pouvez pas faire cela, utilisez clock_timestamp().
J'ai un test unitaire qui dépend d'un certain temps vont par entre les transactions, donc au début de l'unité de test j'ai quelque chose comme:
Ensuite sur le déclencheur, l'utilisation "jeu de modification_time = par défaut".
Donc, normalement, il ne veut pas faire des calculs, mais lors d'un test unitaire cela me permet d'effectuer des insertions avec pg_sleep entre pour simuler le temps qui passe, et effectivement être reflétés dans les données.