Использовать SA_USER_NAME в функции

Я попытался создать простую функцию, подобную этой, но она не работает. Данные возвращаются, но это так же, как если бы не было политики.

CREATE OR REPLACE FUNCTION test (schema in varchar2, tab in varchar2)
RETURN varchar2 AS
   predicate varchar2(4000);
   pre2 VARCHAR2(2000);
BEGIN
   pre2 := sa_session.SA_USER_NAME('policy');
   predicate := '"USER" = '''|| pre2 ||'''';
   return (predicate);
END test;
/

Я буду использовать эту функцию с политикой VPD, поэтому, когда пользователь выбирает из таблицы, он может выбрать только свою строку.


person Vũ Đình Hùng    schedule 12.06.2013    source источник
comment
но это не работает не является допустимым сообщением об ошибке Oracle   -  person a_horse_with_no_name    schedule 12.06.2013
comment
ошибки нет. просто ничего не происходит. это работает так же, как не было этой политики   -  person Vũ Đình Hùng    schedule 12.06.2013
comment
Ничего не происходит, вы имеете в виду, что получаете возвращаемое значение NULL? Что происходит, когда вы выполняете запрос SELECT sa_session.sa_user_name('policy') FROM DUAL из SQLPlus (или Toad или SQL Developer)?   -  person Ed Gibbs    schedule 12.06.2013
comment
когда я выполняю запрос SELECT sa_session.sa_user_name('policy') FROM DUAL; он возвращает имя пользователя базы данных, которого я использую.   -  person Vũ Đình Hùng    schedule 12.06.2013
comment
ничего не происходит, это означает, что я хочу, чтобы эта функция и политика VPD добавлялись к моему запросу, где user = 'value of pre2', но запрос по-прежнему возвращает всю мою таблицу.   -  person Vũ Đình Hùng    schedule 12.06.2013
comment
Вы уверены, что название вашей политики policy? Кроме того, вы передаете две ненужные переменные в свою функцию...   -  person Ben    schedule 12.06.2013
comment
моя политика имеет другое имя, просто используйте здесь политику в качестве примера. Я уверен, что использую правильное имя политики в своей функции. Как я могу проверить, что возвращает моя функция?   -  person Vũ Đình Hùng    schedule 12.06.2013


Ответы (1)


Проблема в следующем:

«Я выполняю запрос SELECT sa_session.sa_user_name('policy') FROM DUAL; он возвращает имя пользователя базы данных, которого я использую»

USER — это псевдостолбец SQL, который также возвращает «имя пользователя базы данных». Итак, в основном вы оцениваете предикат...

where 1 = 1

... и поэтому он не ограничивает набор результатов.

Вам нужен предикат, который применяет имя политики к столбцу таблицы. Итак, если ваш столбец таблицы USER_NAME, это будет:

BEGIN
   pre2 := sa_session.SA_USER_NAME('policy');
   predicate := ' user_name = '''|| pre2 ||'''';
   return (predicate);
END test;

Теперь, возможно, ваша таблица имеет USER в качестве имени столбца. Это было бы прискорбно (и поразительно плохой практикой), но вы могли бы спасти ситуацию с помощью:

BEGIN
   pre2 := sa_session.SA_USER_NAME('policy');
   predicate := tab||'.user = '''|| pre2 ||'''';
   return (predicate);
END test; 
person APC    schedule 12.06.2013