powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как применить строковую функцию только к части выборки?
29 сообщений из 29, показаны все 2 страниц
Как применить строковую функцию только к части выборки?
    #39627816
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть информационная система (веб-приложение), в которой имеется конфиденциальная информация, которую не должны видеть почти все пользователи. Например пароль на доступ к определенному сервису, который хранится текстом. В информационной системе показ или скрытие этой информацией регулируется правами доступа пользователей (штатным инструментом).
В информационной системе также есть функция "Журнал действий пользователей", который показывает выполняемые действия. Одно из таких действий — это смена пароля, для этого действия в текстовом описании действия указывается старый и новый пароль. То есть это недоработка информационной системы, посредством которой пользователи могут узнать пароль клиента.
Чтобы исправить эту недоработку, я внес изменения в серверный код информационной системы — точнее в текст SQL-запроса, который использует серверный код для получения информации из журнала. В SQL-запросе для поля с текстовым описанием действия я с помощью case определяю тип действия и для сообщений и смене пароля выполняю regexp_replace.
Все работает, но таблица журнала действий содержит миллионы строк и в результате задача "Журнал действий пользователей" начинает очень сильно тормозить — а без применения функции к полям таблицы задача отрабатывает быстро, поскольку необходимые поля индексированы и для вывода записей используется пагинация.
Сейчас я временно использую другое решение — SQL-запрос оставил как есть, а замену текста выполняю в процессе вывода строк для веб-сервера. Так работает приемлемо, поскольку выводится не более 100 строк и даже построчная их обработка выполняется быстро.
А можно ли нужные изменения применить прямо в SQL-запросе, чтобы из БД уже возвращалась замаскированная информация?
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627822
Бельфя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может быть не стоит хранить пароль в открытом виде в описании к действию?
То есть подменять его при вставке в БД истории действия пользователей?
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627824
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B. а без применения функции к полям таблицы задача отрабатывает быстро, поскольку необходимые поля индексированы и для вывода записей используется пагинация.
Не верю
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627827
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.в текстовом описании действия указывается старый и новый пароль
У вас тут ошибка.
Попробуйте хранить хэш.
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627828
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, пароль должен быть текстом, он используется оборудованием, которое не умеет работать с кодированным или хешированным паролем, поддерживает только plain password.
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627830
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,
Планы в студию с наложение regexp_replace и без
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627832
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooУ вас тут ошибка.
Попробуйте хранить хэш.
Так информационная система сделана.
Программный код информационной системы мне доступен, поэтому теоретически я могу это сделать — маскировать пароль при регистрации действия в журнале. Но пароль может изменяться в разных местах и разными способами, поэтому я могу что-то пропустить.
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627834
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLerПланы в студию с наложение regexp_replace и без
Это сложновато будет.
SQL собирается в информационной системе, в SQL есть хинты, поэтому для правильности нужно перехватить тот SQL-запрос, который информационная система отправляет в СУБД. А я не настолько хорошо знаю ЯП информационной системы, чтобы это сделать.
Но попробую собрать SQL вручную, исходя из программного кода.
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627861
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

1) странно что сильно тормозит из-за regexp_replace
2) разово в журнале шифровать пароли олд/нью напр раз в 15минут (не выход, но ...)
3) если "Журнал действий пользователей" имеет триггер, шифровать в нем

зы
можно добавить триггер на журнал но могут возникнуть тормоза

....
stax
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627867
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журнал действий операторов — это одна из самых больших таблиц, там порядка 200кк записей, я с ней экспериментировать не рискну.
Что касается тормозов от применения функции к одному из полей выборки — может быть это ломает какой-нибудь хинт. Когда извлеку SQL и воспроизведу проблему, приложу оба плана.
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627871
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Что касается тормозов от применения функции к одному из полей выборки — может быть это ломает какой-нибудь хинт.
Какой именно хинт ломает изменение select кляузы с field1 на case when a=1 then regexp_replace(fild_1 else field_1 end
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627889
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, это предположение и может быть причина в другом.

Вот DDL основной таблицы:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
CREATE TABLE BM_ACTION_LOG
(
  ACTION_LOG_ID  NUMBER                         NOT NULL,
  ACTION_ID      NUMBER                         NOT NULL,
  SUB_ACTION_ID  NUMBER,
  STAFF_ID       NUMBER,
  SCRIPT_NAME    VARCHAR2(255 BYTE)             NOT NULL,
  CUSTOMER_ID    NUMBER,
  ACCOUNT_ID     NUMBER,
  SERVICE_ID     NUMBER,
  GROUP_ID       NUMBER,
  DOMAIN_ID      NUMBER,
  TARGET_ID      NUMBER,
  OLD_VALUE      VARCHAR2(255 BYTE),
  NEW_VALUE      VARCHAR2(255 BYTE),
  REMOTE_ADDR    VARCHAR2(255 BYTE),
  STAFF_COMMENT  VARCHAR2(255 BYTE),
  MOMENT         DATE                           NOT NULL
)
TABLESPACE BM_DATA
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING;


CREATE UNIQUE INDEX ACTION_LOG_PK ON BM_ACTION_LOG
(ACTION_LOG_ID)
LOGGING
TABLESPACE BM_INDEX
PCTFREE    10
INITRANS   2
MAXTRANS   255
NOPARALLEL
REVERSE;


CREATE INDEX BM_ACTLOG_ACCOUNT_ID_IDX ON BM_ACTION_LOG
(ACCOUNT_ID)
LOGGING
TABLESPACE BM_INDEX
PCTFREE    10
INITRANS   2
MAXTRANS   255
NOPARALLEL
COMPRESS 1;


CREATE INDEX BM_ACTLOG_ACTION_ID_IDX ON BM_ACTION_LOG
(ACTION_ID)
LOGGING
TABLESPACE BM_INDEX
PCTFREE    10
INITRANS   2
MAXTRANS   255
NOPARALLEL
COMPRESS 1;


CREATE INDEX BM_ACTLOG_CUSTOMER_ID_IDX ON BM_ACTION_LOG
(CUSTOMER_ID)
LOGGING
TABLESPACE BM_INDEX
PCTFREE    10
INITRANS   2
MAXTRANS   255
NOPARALLEL
COMPRESS 1;


CREATE INDEX BM_ACTLOG_DOMAIN_ID_IDX ON BM_ACTION_LOG
(DOMAIN_ID)
LOGGING
TABLESPACE BM_INDEX
PCTFREE    10
INITRANS   2
MAXTRANS   255
NOPARALLEL
COMPRESS 1;


CREATE INDEX BM_ACTLOG_GROUP_ID_IDX ON BM_ACTION_LOG
(GROUP_ID)
LOGGING
TABLESPACE BM_INDEX
PCTFREE    10
INITRANS   2
MAXTRANS   255
NOPARALLEL
COMPRESS 1;


CREATE INDEX BM_ACTLOG_MOMENT_IDX ON BM_ACTION_LOG
(MOMENT)
LOGGING
TABLESPACE BM_INDEX
PCTFREE    10
INITRANS   2
MAXTRANS   255
NOPARALLEL
COMPRESS 1;


CREATE INDEX BM_ACTLOG_SERVICE_ID_IDX ON BM_ACTION_LOG
(SERVICE_ID)
LOGGING
TABLESPACE BM_INDEX
PCTFREE    10
INITRANS   2
MAXTRANS   255
NOPARALLEL
COMPRESS 1;


CREATE INDEX BM_ACTLOG_STAFF_ID_IDX ON BM_ACTION_LOG
(STAFF_ID)
LOGGING
TABLESPACE BM_INDEX
PCTFREE    10
INITRANS   2
MAXTRANS   255
NOPARALLEL
COMPRESS 1;


CREATE INDEX BM_ACTLOG_SUB_ACTION_ID_IDX ON BM_ACTION_LOG
(SUB_ACTION_ID)
LOGGING
TABLESPACE BM_INDEX
PCTFREE    10
INITRANS   2
MAXTRANS   255
NOPARALLEL
COMPRESS 1;


CREATE OR REPLACE TRIGGER auto_action_log
BEFORE INSERT OR UPDATE OF action_log_id ON BM_ACTION_LOG FOR EACH ROW
BEGIN
    IF((:new.action_log_id IS NULL) OR (:new.action_log_id = 0))
    THEN
        SELECT  action_log_seq.NEXTVAL
        INTO    :new.action_log_id
        FROM    DUAL;
        SELECT  SYSDATE
        INTO    :new.moment
        FROM    DUAL;
    END IF;
END;
/


CREATE OR REPLACE TRIGGER ts_action_log
BEFORE INSERT OR UPDATE ON BM_ACTION_LOG FOR EACH ROW
BEGIN
    IF(:new.moment IS NULL)
    THEN
        SELECT  SYSDATE
        INTO    :new.moment
        FROM    DUAL;
    END IF;
END;
/




Запрос в целом базируется на таком:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
SELECT
    bm_action.action_desc bm_action_action_desc,
    bm_sub_action.description bm_sub_action_description,
    bm_staff.login bm_staff_login,
    bm_staff.first_name bm_staff_first_name,
    bm_staff.middle_name bm_staff_middle_name,
    bm_staff.last_name bm_staff_last_name,
    services.service_id services_service_id,
    services.login services_login,
    accounts.account_id accounts_account_id,
    customers.customer_id customers_customer_id,
    bm_action_log.action_id bm_action_log_type,
    bm_action_log.staff_comment bm_action_log_staff_comment,
    bm_action_log.script_name bm_action_log_script_name,
    bm_action_log.target_id bm_action_log_target_id,
    bm_action_log.old_value bm_action_log_old_value,
    bm_action_log.new_value bm_action_log_new_value,
    bm_action_log.remote_addr bm_action_log_remote_addr,
    bm_action_log.moment bm_action_log_moment
FROM 
    bm_action_log
    , bm_action
    , bm_sub_action
    , bm_staff
    , services
    , accounts
    , customers
WHERE
    bm_action_log.action_id = bm_action.action_id (+) AND
    bm_action_log.sub_action_id = bm_sub_action.sub_action_id (+) AND
    bm_action_log.staff_id = bm_staff.staff_id (+) AND
    bm_action_log.service_id = services.service_id (+) AND
    bm_action_log.account_id = accounts.account_id (+) AND
    bm_action_log.customer_id = customers.customer_id (+) AND
    bm_action_log.service_id =  $service_id AND
    bm_action_log.customer_id = $customer_id AND
    bm_action_log.account_id = $account_id AND
    bm_action_log.staff_id IS NULL AND
    bm_staff.login like $staff_login AND
    bm_action_log.moment > $quote_start AND
    bm_action_log.moment < $quote_stop AND
    bm_action_log.domain_id = $domain_id AND
    bm_action_log.action_id IN ( $actions )
ORDER BY bm_action_log.moment DESC


(строки, где указаны переменные с символом доллара, формируются динамически, в зависимости от выбранных условий)
Но в серверном коде он как-то обрабатывается дополнительно, потому что там есть листание по страницам. Где это делается в коде я пока не нашел, скорее всего это какой-то общий механизм, вынесенный в отдельную библиотеку.

Вот пример запроса с конкретными параметрами:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
SELECT
    bm_action.action_desc bm_action_action_desc,
    bm_sub_action.description bm_sub_action_description,
    bm_staff.login bm_staff_login,
    bm_staff.first_name bm_staff_first_name,
    bm_staff.middle_name bm_staff_middle_name,
    bm_staff.last_name bm_staff_last_name,
    services.service_id services_service_id,
    services.login services_login,
    accounts.account_id accounts_account_id,
    customers.customer_id customers_customer_id,
    bm_action_log.action_id bm_action_log_type,
    bm_action_log.staff_comment bm_action_log_staff_comment,
    bm_action_log.script_name bm_action_log_script_name,
    bm_action_log.target_id bm_action_log_target_id,
    bm_action_log.old_value bm_action_log_old_value,
    bm_action_log.new_value bm_action_log_new_value,
    bm_action_log.remote_addr bm_action_log_remote_addr,
    bm_action_log.moment bm_action_log_moment
FROM 
    bm_action_log
    , bm_action
    , bm_sub_action
    , bm_staff
    , services
    , accounts
    , customers
WHERE
    bm_action_log.action_id = bm_action.action_id (+) AND
    bm_action_log.sub_action_id = bm_sub_action.sub_action_id (+) AND
    bm_action_log.staff_id = bm_staff.staff_id (+) AND
    bm_action_log.service_id = services.service_id (+) AND
    bm_action_log.account_id = accounts.account_id (+) AND
    bm_action_log.customer_id = customers.customer_id (+) AND
    --bm_action_log.service_id =  $service_id AND
    --bm_action_log.customer_id = 90007 AND
    --bm_action_log.account_id = $account_id AND
    --bm_action_log.staff_id IS NULL AND
    --bm_staff.login like $staff_login AND
    bm_action_log.moment > DATE'2018-01-01' AND
    bm_action_log.moment < DATE'2018-01-10' AND
    bm_action_log.domain_id = 1 AND
    bm_action_log.action_id IN ( 306 )
ORDER BY bm_action_log.moment DESC


В веб-интерфейсе информационной системы и в TOAD запрос с такими параметрами выполняется менее секунды.
Если поле bm_action_log_staff_comment я формирую в зависимости от bm_action_log.action_id и определенного параметра, зависящего от текущего пользователя, то в информационной системе этот запрос выполняется очень долго. В TOAD я его повторить пока не могу.
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627895
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.в текст SQL-запроса, который использует серверный код для получения информации из журнала. В SQL-запросе для поля с текстовым описанием действия я с помощью case определяю тип действия и для сообщений и смене пароля выполняю regexp_replace.
Все работает,А что мешает сделать это один раз в триггере?
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627899
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я стараюсь не лезть туда, где могу что-то сломать.
Если я что-то неправильно сделаю в программном коде информационной системы, который осуществляет вывод информации в браузер, то это ошибку легко будет исправить, в самом крайнем случае просто скопировав заранее сделанную копию программного модуля.
Если я что-то сделаю неправильно в триггере, я могу испортить данные. Их конечно можно вернуть через бэкап, но это сложнее и дольше.
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627900
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К тому же у некоторых пользователей есть доступ к просмотру паролей, и им вполне можно разрешить смотреть эти пароли в журнале.
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627908
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Я стараюсь не лезтьОбратись к разработчикам, не майся дурью.
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627933
Бельфя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как выглядит запрос с case?
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627957
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.В веб-интерфейсе информационной системы и в TOAD запрос с такими параметрами выполняется менее секунды.
Если поле bm_action_log_staff_comment я формирую в зависимости от bm_action_log.action_id и определенного параметра, зависящего от текущего пользователя, то в информационной системе этот запрос выполняется очень долго. В TOAD я его повторить пока не могу.

в запросе нет bm_action_log_staff_comment

я так понимаю Вам надо поменять
bm_action_log.new_value bm_action_log_new_value,
на типа
....
decode(bm_action_log.target_id?,xxx.'******',new_value) bm_action_log_new_value
...

.....
stax
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627964
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicОбратись к разработчикам
Это слишком дорого.
Кроме того, сейчас эта версия информационной системы уже не поддерживается, нужно обновляться на 3 мажорных версии и переносить модификации.
Практически это нереально.

Бельфяа как выглядит запрос с case?
Как-то так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
case
  when bm_action_log.action_id in (306) then
    case
      when bm_action_log.staff_id in (1,2,3) then bm_action_log.staff_comment
      when bm_staff.role_id in (1,2,3) then bm_action_log.staff_comment
      else regexp_replace(bm_action_log.staff_comment, '\sпароль: \S+\s?',  'пароль: ******')
    end
  else bm_action_log.staff_comment
end bm_action_log_staff_comment


По хорошему вместо in (1,2,3) должно быть exists (select ... from bm_staff join bm_role on ...), но как я понимаю, такой подход на больших таблицах противопоказан, поэтому списки идентификаторов у меня вписаны прямо в запрос.
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39627975
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
case
  when bm_action_log.action_id in (306) then
    case
      when bm_action_log.staff_id in (1,2,3) then bm_action_log.staff_comment
      when bm_staff.role_id in (1,2,3) then bm_action_log.staff_comment
      else regexp_replace(bm_action_log.staff_comment, '\sпароль: \S+\s?',  'пароль: ******')
    end
  else bm_action_log.staff_comment
end bm_action_log_staff_comment



Код: plsql
1.
2.
3.
4.
5.
case
  when bm_action_log.action_id in (306) and bm_action_log.staff_id not in (1,2,3) and bm_staff.role_id not in (1,2,3)
  then regexp_replace(bm_action_log.staff_comment, '\sпароль: \S+\s?',  'пароль: ******')
  else bm_action_log.staff_comment
end bm_action_log_staff_comment
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39628037
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Нет, пароль должен быть текстом, он используется оборудованием, которое не умеет работать с кодированным или хешированным паролем, поддерживает только plain password.Я верно понял, что оборудование лезет в логи для получения самого свежего пароля?
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39628040
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, я имел ввиду, что открытый пароль нужен в рабочих таблицах — оборудование авторизует услуги по RADIUS и умеет только plain password.
Хранить открытый пароль в логах необходимости нет, но сама информационная система устроена так, что любые атрибуты (в том числе и пароли) сохраняет в логах как есть, в виде текста. Если маскировать пароль перед сохранением в логах (с помощью триггера), то это на функционировании системы никак не скажется.
В принципе на таблице логов и без того висит триггер, и насколько я могу видеть, в него маскировку паролей несложно будет добавить. Но теперь уже из любопытства хотелось бы узнать, можно ли маскировать пароль непосредственно в SQL-запросе, не изменяя БД.
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39628052
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повесь RLS policy для маскировки от всех кто не должен видеть. Например только владелец может видеть поле sal в таблице sec_emp:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
SQL> show user
USER is "SCOTT"
SQL> create table sec_emp as select * from emp
  2  /

Table created.

SQL> CREATE OR REPLACE
  2    FUNCTION sec_user_rls(
  3                          p_owner IN VARCHAR2,
  4                          p_name IN VARCHAR2
  5                         )
  6      RETURN VARCHAR2 AS
  7      BEGIN
  8          RETURN Q'[USER = ']' || p_owner || Q'[']';
  9  END;
 10  /

Function created.

SQL> BEGIN
  2    DBMS_RLS.ADD_POLICY(
  3                        object_schema         => 'scott',
  4                        object_name           => 'sec_emp',
  5                        policy_name           => 'sec_emp_rls',
  6                        function_schema       => 'scott',
  7                        policy_function       => 'sec_user_rls',
  8                        policy_type           => DBMS_RLS.STATIC,
  9                        sec_relevant_cols     => 'sal',
 10                        sec_relevant_cols_opt => DBMS_RLS.ALL_ROWS
 11                       );
 12  END;
 13  /

PL/SQL procedure successfully completed.

SQL> select ename,sal from sec_emp
  2  /

ENAME             SAL
---------- ----------
SMITH             800
ALLEN            1600
WARD             1250
JONES            2975
MARTIN           1250
BLAKE            2850
CLARK            2450
SCOTT            3000
KING             5000
TURNER           1500
ADAMS            1100

ENAME             SAL
---------- ----------
JAMES             950
FORD             3000
MILLER           1300

14 rows selected.

SQL> grant select on sec_emp to u1
  2  /

Grant succeeded.

SQL> connect u1@pdb1sol122
Enter password: **
Connected.
SQL> select ename,sal from scott.sec_emp
  2  /

ENAME             SAL
---------- ----------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS

ENAME             SAL
---------- ----------
JAMES
FORD
MILLER

14 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39628059
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Но теперь уже из любопытства хотелось бы узнать, можно ли маскировать пароль непосредственно в SQL-запросе, не изменяя БД.

можно, ведь " В SQL-запросе для поля с текстовым описанием действия я с помощью case определяю тип действия и для сообщений и смене пароля выполняю regexp_replace."

вопрос в другом, почему "начинает очень сильно тормозить "

я б так делал
задал параметры с хитринкой напр с 29 апреля или что-то подобное для запроса с тормозами
и искал итоговый оператор в v$sql

.....
stax
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39628066
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

ему колонку надо пoказывать, маскировать только если ... с regexp_replace (часть оставить)

аля скрыть ЗП президента маскируюя 4-й и больше знаки 5000->***000

.....
stax
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39628078
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxSY,

ему колонку надо пoказывать, маскировать только если ... с regexp_replace (часть оставить)

аля скрыть ЗП президента маскируюя 4-й и больше знаки 5000->***000

.....
stax

аля скрыть ЗП президента через RLS - запросто а вот часть оставить через RLS не получится. Придется создавать view и давaть грант на view а не на таблицу.

SY.
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39628082
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYStaxSY,

ему колонку надо пoказывать, маскировать только если ... с regexp_replace (часть оставить)

аля скрыть ЗП президента маскируюя 4-й и больше знаки 5000->***000

.....
stax

аля скрыть ЗП президента через RLS - запросто а вот часть оставить через RLS не получится. Придется создавать view и давaть грант на view а не на таблицу.

SY.
так я ж об етом (regexp_replace)

.....
stax
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39628265
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoowhen bm_action_log.action_id in (306) and bm_action_log.staff_id not in (1,2,3) and bm_staff.role_id not in (1,2,3)
Идею понял. Правда у меня внешние соединения (то есть в сравниваемых значениях может быть null) и это усложнит выражение.

SYНапример только владелец может видеть поле sal в таблице sec_emp
Если бы каждому пользователю ИС соответствовал отдельный пользователь БД, это было бы возможно.
Но в БД только один пользователь и с помощью механизма RLS невозможно определить полномочия текущего пользователя ИС.
Ну и у меня Oracle 10g, там вроде бы RLS отсутствует.

Staxя б так делал
задал параметры с хитринкой напр с 29 апреля или что-то подобное для запроса с тормозами
и искал итоговый оператор в v$sql

Да, я понял. Попробую поискать так.
...
Рейтинг: 0 / 0
Как применить строковую функцию только к части выборки?
    #39628290
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Ну и у меня Oracle 10g, там вроде бы RLS отсутствует.
dbms_rls даже в Ora 8 был
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как применить строковую функцию только к части выборки?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]