Проверка безопасности: как ограничить количество строк, затронутых в запросе Oracle на обновление / удаление?

#sql #oracle

#sql #Oracle

Вопрос:

В моем приложении есть миниатюрный компонент, подобный ORM, который обрабатывает генерацию запросов для базовых операций обновления / удаления, но мне нужно обеспечить некоторую безопасность на уровне запроса, поскольку первичные ключи определяются автоматически (второй уровень анализа, если хотите).

По замыслу, всякий раз, когда я обновляю или удаляю строку, это должно влиять только на 1 строку.

Итак, учитывая следующий запрос:

UPDATE Cars SET Color = 'Red' WHERE CarID = 5

Как я могу сообщить Oracle: «… этот запрос должен повлиять на 1 строку. Если это затрагивает более 1 строки, выдает большую ошибку и ничего не делает.»?

Таким образом, предположим, что когда-нибудь возникнет ошибка, и этот запрос будет выполнен:

UPDATE Cars SET Color = 'Red'

… вместо этого он просто взорвется.

Ответ №1:

Возможно, вам не нужен ОТКАТ, но при возникновении проблемы обычно требуется откат обновления:

 DECLARE
   update_exception EXCEPTION;
BEGIN
   UPDATE Cars 
      SET Color = 'Red' 
    WHERE CarID = 5;
   --
   IF SQL%ROWCOUNT > 1
   THEN
      RAISE update_exception;
   END IF;
EXCEPTION
   WHEN update_exception
   THEN
      ROLLBACK;
      -- Do your error handling...
END;
  

Ответ №2:

Используйте SQL%ROWCOUNT, чтобы определить количество затронутых записей перед фиксацией транзакции и выдать исключение в случае > 1.

Комментарии:

1. @routeNpingme, перейдите по ссылке 🙂