Suite

Est-il possible de verrouiller des enregistrements ou des attributs indéfiniment si un champ est renseigné ?


Je crée un complément c# ArcGIS où j'ai une classe d'entités stockée dans Oracle, lorsqu'une entité est créée, certains des champs de la table seront remplis. Si le champ X est renseigné, alors certains champs seront verrouillés, si le champ Y est renseigné alors d'autres champs seront verrouillés et si le champ Z est renseigné alors la géométrie sera verrouillée.

Verrouillé signifie qu'aucune modification ne peut être effectuée (en ce qui concerne la géométrie ou les attributs) que ce soit dans le complément et à l'extérieur d'ArcGIS ou même d'Oracle.

Est-ce quelque chose qui peut être fait? Si oui, quelqu'un a-t-il des indications pour me lancer ?

MODIFIER - Il peut y avoir un scénario où la classe d'entités est jointe à la table et cette table aura un champ qui verrouille la géométrie. Comment serait-il possible de verrouiller la table spatiale ?


Vous pouvez définir un champ en lecture seule dans ArcMap. En mode vue tableau, cliquez sur un en-tête et regardez ses propriétés. Une recherche rapide de l'API ArcObjects et c'est l'interface IFieldInfo3 qui peut définir cette propriété. Vous pouvez vous renseigner à ce sujet via le ILayerFields interface.


Si vous souhaitez que ces restrictions s'appliquent au niveau de la base de données, c'est probablement là que vous devrez les implémenter, ArcGIS ou ArcSDE ne pourrait pas empêcher un utilisateur disposant d'un accès SQL d'effectuer des mises à jour.

Pour une solution d'entreprise, Oracle propose une base de données privée virtuelle qui ajoute une granularité de ligne et de colonne aux autorisations de base de données, mais cela est probablement hors de portée pour votre projet.

Une alternative pourrait être d'avoiravant la mise à jouretà l'insertiondéclencheurs sur votre table qui empêchent l'application des mises à jour en fonction de vos règles.

Celles-ci seraient appliquées que les mises à jour aient été effectuées à partir d'Oracle ou de votre complément, bien que vous deviez faire attention à ce type de déclencheur pour vous assurer que la logique est saine, sinon les mises à jour pourraient être perdues. par exemple.

CRÉER OU REMPLACER TRIGGER TR_PREVENT_UPDATES AVANT LA MISE À JOUR SUR MY_TABLE RÉFÉRENCEMENT NOUVEAU COMME NEUF ANCIEN ANCIEN POUR CHAQUE LIGNE COMMENCER si :old.x n'est pas nul alors -- Empêcher les champs d'être mis à jour si x est défini -- Vous pouvez soit ignorer les nouvelles valeurs, soit lancer une erreur :new.col1 := :old.col1; :nouveau.col2 := :ancien.col2; -- Cela supprimera silencieusement les modifications des utilisateurs. fin si; finir;

Si vous avez besoin d'aide pour configurer un déclencheur de base de données, stackoverflow serait la meilleure communauté pour vous aider.