Utworzono procedurę składowaną, która uruchamia szereg poleceń służących do modyfikacji danych. Chcę tylko dokonać transakcji, jeśli wszystko się powiedzie. Robię to za pomocą bloku try-catch w sposób widoczny poniżej (gdzie mój blok CATCH w prawdziwych używa RAISERROR wrócić komunikaty o błędach):SQL: Try/Catch nie przechwytuje błędu podczas próby uzyskania dostępu do tabeli, której nie może znaleźć
BEGIN TRY
BEGIN TRANSACTION
UPDATE Table1 SET MyVarcharColumn = 'test'
UPDATE Table2 SET MyBitColumn = 1
UPDATE Table3 SET MyIntColumn = 42
COMMIT TRANSACTION
END TRY
CATCH
ROLLBACK TRANSACTION
END CATCH
To działa tak, jak chcemy. Jeśli, na przykład, ustawię MyBitColumn na "b" zamiast 1, błąd zostanie przechwycony, sterowanie przejdzie do CATCH, a transakcja nie zostanie zatwierdzona.
Jednym z problemów, które zauważyłem jest to, że jeśli, powiedzmy, Tabela 3 nie istnieje w bazie danych, to powoduje błąd (nieważna nazwa obiektu), ale blok CATCH nigdy nie jest wykonywany, a transakcja pozostaje otwarta.
Chcę poradzić sobie z tym, aby zająć się jakąkolwiek (zdalną) możliwością modyfikacji bazy danych (lub dzieje się tak, gdy procedura składowana jest poprawnie dodawana, ale jedna z tabel nie jest).
Jak obsługiwać te przypadki błędów?
-Dziękuję za pomoc.
Dziękuję. Przydaje się ustawienie, które powoduje wycofanie transakcji. Jednak nadal nie wykonuje tego, co znajduje się w bloku CATCH po błędzie. Działa to dla mojej aplikacji (ponieważ błąd zostanie przekazany w górę w każdym razie), ale jeśli ktoś próbowałby upewnić się, że blok CATCH jest wykonywany z innych powodów, nie zrobiłby tego. – Luke
Ah, rozumiem, oni nie są po prostu złapani za tego rodzaju błędy w tym przypadku. Dzięki! – Luke