Получить владельца текущего представления в Oracle

#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. Это работает, если схема хранения представления знает только о своем представлении, но я не хочу связываться с отсутствием грантов для того же представления в другой схеме.