2010-05-17 17 views
2

J'essaie d'empêcher les utilisateurs de pouvoir supprimer irrévocablement des espaces dans un wiki Confluence. Ma première pensée rapide était de renommer la table spaces en allspaces, d'ajouter une nouvelle colonne deleted, et de créer une vue spaces à la place de l'ancienne table. La vue ne renvoie que des espaces non supprimés. J'ai créé trois règles pour autoriser INSERT, UPDATE et DELETE sur la vue spaces. La règle DELETE modifie simplement le champ deleted et le supprime donc de la vue, mais toutes les données restent dans la base de données.La valeur de retour de DELETE peut-elle être modifiée dans PostgreSQL

Le problème est maintenant les instructions DELETE sur spaces renvoient DELETE 0 de PostgreSQL. Cela provoque Hibernate à renverser et lancer une exception et Confluence explose.

Y at-il un moyen de faire en sorte que les lignes de retour de PostgreSQL soient modifiées au lieu de lignes supprimées sur une règle INSTEAD?

+0

Pourquoi vos utilisateurs ont-ils directement accès aux tables Confluence ?! –

+0

Ils n'ont pas, Confluence a un bouton à l'intérieur "Supprimer l'espace" qui va supprimer l'espace de la base de données. Actuellement c'est permanent qui à mon humble avis est très anti-wiki. J'essaie de résoudre ce problème au niveau de la base de données. –

Répondre

0

Je ne suis pas vraiment ce que vous voulez réaliser, mais peut-être que vous pourriez mettre l'instruction delete dans une fonction qui retourne VOID et ensuite l'appeler.

CREATE OR REPLACE FUNCTION delete_space(pid integer) 
    RETURNS void AS 
$BODY$ 
DECLARE aid INTEGER; 
BEGIN 
    delete from spaces where id=pid; 
    return; 
END; 
$BODY$ 
    LANGUAGE 'plpgsql'; 

Pour utiliser:

select * from delete_space(3); 
1

Je ne sais pas à quel point cela l'échelle (en fonction du nombre de places que vous avez à gérer), mais je sauvegarde périodiquement l'espace au format XML. Cela peut se faire facilement par l'API à l'aide Confluence CLI:

confluence --action exportSpace --space "spaceName" --file "target/output/confluencecli/spaceName.xml"

Vous pouvez tourner ces sauvegardes basées sur l'âge et ne conserver que les plus récents en cas de suppression de l'espace par un utilisateur. Pour aller plus loin, vous pouvez modifier l'action (confluence/spaces/removespace.vm) qui supprime réellement l'espace et insérer la logique pour sauvegarder l'espace au format XML avant que la suppression ne soit confirmée. Cela serait beaucoup plus agréable!

+0

Malheureusement, nous avons plusieurs milliers d'espaces, donc une exportation programmée n'est pas réalisable, mais j'aime l'idée de simplement détourner l'action de suppression d'espace. –

1

Vous pouvez ajouter un déclencheur ON DELETE qui enregistre la ligne supprimée dans une table d'archivage. Vous pouvez ajouter une fonctionnalité de récupération à votre application pour récupérer les lignes supprimées.

+0

Ouais c'était ma première tentative aussi, bien que cela ait le même effet que mes règles sauf dans la direction opposée, une suppression de rangée simple retourne deux rangées modifiées et Hibernate jette une exception. –

+0

Je ne peux pas croire Hibernate ne permet pas d'utiliser des déclencheurs dans la base de données, il doit y avoir une option quelque part! – peufeu

+0

Oui, Hibernate le permet, mais c'est un changement de code. Et tout le problème est que c'est un produit à source fermée. –