Я пытаюсь увидеть, какие запросы в настоящее время выполняются в базе данных Oracle. Однако когда я пытаюсь использовать таблицу v$session, я получаю сообщение об ошибке:
В чем причина этого и как правильно запустить активные процессы?
Я ищу информацию, необходимую для отмены запроса для данного пользователя. Приведу пример:
1) Пользователь выполняет запрос в приложении. Мы добавляем комментарий, чтобы мы могли «отслеживать» этот запрос:
/* Query-ID-1283849 */ select * from mytable
2) Теперь, если пользователь нажимает кнопку «Отмена» во время выполнения запроса (скажем, на запрос требуется очень много времени для ответа), мы позволяем пользователю отменить этот запрос, учитывая, что пользователь, вероятно, НЕ будет пользователь sys, но «обычный» пользователь с правами только для чтения.
Как это можно было сделать?
@SamM - спасибо, есть ли способ запросить процессы, владельцем которых является текущий пользователь?
Зависит от того, какие подробности вы хотите получить. Отредактируйте свой вопрос, добавив в него список того, что вы ищете.
@SamM благодарит за предложение. Я обновил вопрос.
Привилегия select_catalog_role дает вам доступ для чтения к основным представлениям словаря, включая v $ session.


На фундаментальном уровне базы данных вы не можете убивать отдельные запросы. Вы убиваете отдельные сеансы. Из вашего вопроса я предполагаю, что ваш конкретный вариант использования находится внутри приложения, а не такого инструмента, как Sql Developer или Sql Plus.
Удаление сеанса может быть выполнено пользователями, у которых есть специальные привилегии базы данных для уничтожения сеансов. Если вы находитесь внутри приложения, выполняющего несколько запросов в одном сеансе, завершение сеанса фактически уничтожит ваше приложение и потребует либо а) перезапуска приложения, либо б) изящной программной обработки сброшенного сеанса.
Если вы используете n-уровневую структуру ORM, которая обрабатывает взаимодействия с базой данных за вас, вы можете оказаться в положении, когда завершение сеанса не повлияет на ваше приложение, кроме выполняемого в данный момент оператора.
Другой способ в вашем приложении обрабатывать изолирующие сеансы и запросы - запускать многопоточное приложение. Каждый запрос порождает новый поток, и этот поток можно убить, не обязательно завершая сеанс.
По сути, краткий ответ - вы можете убить запрос, только уничтожив его сеанс. Ваш подход к просмотру v $ session правильный и необходим для поиска идентификатора сеанса для любого оператора givel sql, вам просто нужно, чтобы ваш администратор баз данных предоставил вам привилегии для синонимов v $ session и v $ sql.
Обновление, специфичное для Sql Developer, на основе комментария OP для пояснения:
Sql Developer имеет возможность разрешать выполнение параллельных запросов, используя преимущества потоков и множественных подключений. Этот параметр находится в Инструменты> Настройки> База данных> Рабочий лист. Независимо от настройки, когда вы нажимаете кнопку отмены запроса, приложение по-прежнему отправляет запрос на закрытие сеанса. Графический интерфейс обычно корректно запускает новый сеанс, и конечный пользователь об этом не догадывается. Но иногда что-то не получается, и графический интерфейс зависает, или вы теряете соединение, и вам приходится вручную переподключаться.
Чтобы усложнить ситуацию, поведение зависит от драйвера / клиента, используемого вашим приложением. OCI, толстые клиенты и тонкие клиенты в прошлом демонстрировали различное поведение, когда дело доходило до уничтожения запросов. Фактически, в Sql Developer у вас есть возможность заставить его использовать OCI или толстый драйвер, чтобы избежать определенного поведения.
Я настоятельно рекомендую получить права на просмотр v $ session и поэкспериментировать с этим. Интересно узнать больше о том, как Oracle управляет сеансами.
Я только что обнаружил, что последняя версия Oracle 18c позволяет убивать отдельные запросы в рамках сеанса. Я на 12c, поэтому не пробовал. https://docs.oracle.com/en/database/oracle/oracle-database/18/admin/managing-processes.html#GUID-7D8E5E00-515D-4338-8B86-C2044F6D2957
Соответствующие части из документации.
5.10.5 Cancelling a SQL Statement in a Session You can cancel a SQL statement in a session using the ALTER SYSTEM CANCEL SQL statement.
Instead of terminating a session, you can cancel a high-load SQL statement in a session. When you cancel a DML statement, the statement is rolled back.
The following clauses are required in an ALTER SYSTEM CANCEL SQL statement:
SID – Session ID
SERIAL – Session serial number
The following clauses are optional in an ALTER SYSTEM CANCEL SQL statement:
INST_ID – Instance ID
SQL_ID – SQL ID of the SQL statement
You can view this information for a session by querying the GV$SESSION view.
The following is the syntax for cancelling a SQL statement:
ALTER SYSTEM CANCEL SQL 'SID, SERIAL, @INST_ID, SQL_ID';
спасибо за подробный ответ. Как тогда клиент GUI, такой как SQLDeveloper от Oracle, будет обрабатывать операцию отмены, когда пользователь отменяет свой запрос? Например: thatjeffsmith.com/wp-content/uploads/2013/04/kill_me_now2.pn g
@DavidL Я обновил свой ответ, включив в него подробности о Sql Developer и других клиентах графического интерфейса.
@DavidL Еще одно изменение, но оно относится к Oracle 18c. Если вы используете эту версию, вам повезло.
Это означает, что пользователь, с которым вы вошли в систему, не имеет соответствующих прав для запроса одного или обоих представлений. Проверьте права доступа к базе данных вашего пользователя.