#oracle #view
#Oracle #Вид
Вопрос:
Я хочу создать представление, содержащее столбец, который ссылается на владельца этого представления. Что-то вроде этого:
create or replace view scott.owner_v
as
select something() owner from dual;
Примечание: something()
необязательно должна быть ссылка на функцию или пакет. Это может быть все, что дает желаемый результат.
Таким образом, запрос select owner from scott.owner_v
под JEREMY
пользователем, например, вернется SCOTT
, и когда я скомпилирую такое представление в HR
схеме, я получу HR
owner
столбец.
Возможно, запрос get кажется глупым SCOTT.owner_v
SCOTT
, но мне это нужно с точки зрения построения DWH, ссылающегося на разные источники, которые расположены в разных схемах. Итак, тогда я бы динамически создал новое представление, которое находится на «более высоком» уровне, которое собирает данные из всех схем с дополнительным столбцом, например owner
, который показывает источник данных. Я могу поместить этот столбец при создании этого «более высокого» представления, но я хочу, чтобы он был настолько простым, насколько это возможно.
Очевидно, я пытался поместить в представление следующие параметры
- sys_context(‘USERENV’,’CURRENT_USER’)
- sys_context(‘USERENV’,’CURRENT_SCHEMA’)
- пользователь
но это относится к текущему зарегистрированному пользователю, а не к владельцу представления.
Любая помощь приветствуется.
Комментарии:
1. Если вы создаете представление динамически, почему вы не можете включить владельца в качестве постоянного значения — у вас уже должно быть это имя, поскольку оно вам нужно (используйте) в инструкции CREATE в любом случае
2. Я хочу сохранить всю логику внутри схем «stage», которые содержат исходные данные. И на следующем уровне у вас просто есть представление, которое объединяет все источники.
Ответ №1:
Просто создайте локальные функции, которые возвращают собственные схемы во всех схемах, где вы хотите создавать представления:
create or replace function local_obj_owner return varchar2 as
begin
return $$PLSQL_UNIT_OWNER;
end;
/
Затем добавьте его в свои представления:
create view test_view as
select
local_obj_owner as view_owner,
dummy
from dual;
Комментарии:
1. Забыл упомянуть, что я использую Oracle 11g, поэтому
$$PLSQL_UNIT_OWNER
возвращает NULL. Но я изменил его, чтобыsys_context('USERENV', 'CURRENT_USER')
помнить, что функция естьAUTHID DEFINER
.
Ответ №2:
Попробуйте
select owner from all_views where view_name = 'OWNER_V';
и / или некоторые альтернативы ( USER_VIEWS
, DBA_VIEWS
, ALL_OBJECS
, …).
Комментарии:
1. Это работает, если схема хранения представления знает только о своем представлении, но я не хочу связываться с отсутствием грантов для того же представления в другой схеме.