Это довольно легко проверить: создать пустую таблицу в схеме A. Предоставить привилегию на вставку для схемы B. В схеме B запустите длительный оператор INSERT. Пока он работает, отмените привилегию вставки.
Если вы сделаете это, вы увидите, что вставка продолжается и успешно завершается. Затем, если вы немедленно попытаетесь выполнить его снова, вы получите ORA-01031: insufficient privileges
. Поэтому кажется очевидным, что Oracle проверяет привилегии один раз для каждого выполнения оператора. Я просмотрел какую-то документацию и не увидел ничего такого, что прямо указывало бы на это, но кажется, что это самый логичный подход, и эксперимент поддерживает его.
Вы спросили:
"Oracle гарантирует, что вставки не будут остановлены в середине строки?"
Как показано выше, это не очень важно в случае отзыва привилегий; но, по-видимому, стоит более подробно объяснить, как Oracle ведет себя, если в процессе обработки оператора возникает ошибка. Исключая ошибки в Oracle, невозможно, чтобы частичная строка была вставлена и оставлена после ошибки. Если какая-либо ошибка происходит в середине обработки одного оператора SQL, то изменения, сделанные до сих пор этим оператором (не транзакцией), откатываются внутри Oracle. Например, если вы вставляете много строк и сегмент данных должен быть расширен, но нет свободного места, работа, выполненная до настоящего времени текущим оператором, будет откатываться, а затем в коде, выполнившем этот оператор, будет возвращена ошибка , Это не «ненормально завершенный процесс», как обсуждалось в другом потоке, на который вы ссылались; процесс продолжает работать и определяет, как устранить ошибку - он имеет возможность откатить всю транзакцию , но не обязан это делать.