Dans mon code .NET, dans une transaction de base de données (en utilisant TransactionScope
), je pourrais inclure un bloc imbriqué avec TransactionScopeOption.Suppress
, qui assure que les commandes dans le bloc imbriqué sont validées même si le bloc externe revient en arrière. Voici un exemple de code:Equivalent T-SQL de .NET TransactionScopeOption.Suppress
using (TransactionScope txnScope = new TransactionScope(TransactionScopeOption.Required))
{
db.ExecuteNonQuery(CommandType.Text, "Insert Into Business(Value) Values('Some Value')");
using (TransactionScope txnLogging = new TransactionScope(TransactionScopeOption.Suppress))
{
db.ExecuteNonQuery(CommandType.Text, "Insert Into Logging(LogMsg) Values('Log Message')");
txnLogging.Complete();
}
// Something goes wrong here. Logging is still committed
txnScope.Complete();
}
je tentais de trouver si cela pourrait être fait dans T-SQL. Quelques personnes ont recommandé OPENROWSET, mais il ne semble pas très «élégant» à utiliser. En outre, je pense que c'est une mauvaise idée de mettre des informations de connexion dans le code T-SQL. J'ai utilisé SQL Service Broker par le passé, mais il prend également en charge la messagerie transactionnelle, ce qui signifie que le message n'est pas publié dans la file d'attente tant que la transaction de base de données n'est pas validée.
Mon exigence: Nos procédures stockées d'application sont lancées par une application tierce, au sein d'une transaction implicite initiée en dehors de la procédure stockée. Et je veux être en mesure d'attraper et d'enregistrer toutes les erreurs (dans une table de base de données dans la même base de données) dans mes procédures stockées. Je dois relancer l'exception pour permettre à l'application tierce de restaurer la transaction et pour qu'elle sache que l'opération a échoué (et donc faire tout ce qui est requis en cas de défaillance).
Votre code .NET est donc appelé par un code .NET tiers? – usr
Avez-vous regardé les tables de variables? – Shaneis
@usr - Je n'ai aucune connaissance du code de l'application tierce. Le code .NET que j'ai posté dans ma question était juste que je voudrais faire la même chose dans le code T-SQL. –