Как насчет ALTER SESSION?
ALTER SESSION SET CURRENT_SCHEMA = schema
Это позволит вам войти в систему как пользователь, которому предоставлены права выбора для таблицы, принадлежащей схеме X, и выполнить SP, который изменяетсеанс к схеме X. Внешний код не будет знать, что это произошло.
Однако, если ваш внешний код задает схему X:
select * from X.tableName
Я не думаю,это вызовет ошибку.
Возможно, вы могли бы объяснить, почему важно, чтобы клиентский код получал ошибку, когда он использует правильное имя текущей схемы?
Возможно ли создать новую схемупередать владелец объектов старой схемы, а затем удалить старую схему и затем использовать подход, описанный выше?
PS См. триггеры ПОСЛЕ ВХОДА: http://psoug.org/reference/system_trigger.html
PPS Поскольку вы разработалиВаши требования:
... таблица может быть синонимом, использующим ссылку на базу данных, или таблица может быть размещена в нескольких схемах, каждая для своего выпуска.Следует оставить базу данных для разрешения фактического местоположения объекта, на который ссылается клиентское приложение.
Если местоположение объекта находится не в CURRENT_SCHEMA, а в какой-то другой схеме, обе из которыхслучается, что есть таблицы с именем CUSTOMER, например, ядро СУБД не будет знать, что оператор, отправленный ему клиентским приложением, должен ссылаться на другую схему, если имя таблицы не настолько квалифицированно.Это подразумевает уровень мета-знаний, которых нет у движка, хотя он предоставляет разработчику инструменты для создания такого интеллекта в форме хранимых процедур и триггеров и предоставления / отзыва контроля над объектами.
Ваш лучшийшансы на успех при внедрении этого интеллектуального анализа будут аннулировать все прямые права на таблицы и представления и потребовать от клиентских приложений доступа к объектам с помощью хранимых процедур, поскольку движок базы данных сам по себе не знает о таких вещах, как уровни выпуска приложений.Я не вижу чисто декларативного способа сделать это.Это должно быть процедурным в значительной степени.Ваша собственная внутренняя логика должна была бы взять на себя ответственность за арбитраж между объектами с одинаковыми именами в разных схемах.Тем не менее, такие функции, как триггеры AFTER LOGON и ALTER SCHEMA должны оказаться полезными для вас.