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

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

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

....
stax
...
Рейтинг: 0 / 0
10.04.2018, 12:23
    #39627867
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как применить строковую функцию только к части выборки?
Журнал действий операторов — это одна из самых больших таблиц, там порядка 200кк записей, я с ней экспериментировать не рискну.
Что касается тормозов от применения функции к одному из полей выборки — может быть это ломает какой-нибудь хинт. Когда извлеку SQL и воспроизведу проблему, приложу оба плана.
...
Рейтинг: 0 / 0
10.04.2018, 12:28
    #39627871
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как применить строковую функцию только к части выборки?
Alibek B.Что касается тормозов от применения функции к одному из полей выборки — может быть это ломает какой-нибудь хинт.
Какой именно хинт ломает изменение select кляузы с field1 на case when a=1 then regexp_replace(fild_1 else field_1 end
...
Рейтинг: 0 / 0
10.04.2018, 13:07
    #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
10.04.2018, 13:11
    #39627895
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как применить строковую функцию только к части выборки?
Alibek B.в текст SQL-запроса, который использует серверный код для получения информации из журнала. В SQL-запросе для поля с текстовым описанием действия я с помощью case определяю тип действия и для сообщений и смене пароля выполняю regexp_replace.
Все работает,А что мешает сделать это один раз в триггере?
...
Рейтинг: 0 / 0
10.04.2018, 13:15
    #39627899
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как применить строковую функцию только к части выборки?
Я стараюсь не лезть туда, где могу что-то сломать.
Если я что-то неправильно сделаю в программном коде информационной системы, который осуществляет вывод информации в браузер, то это ошибку легко будет исправить, в самом крайнем случае просто скопировав заранее сделанную копию программного модуля.
Если я что-то сделаю неправильно в триггере, я могу испортить данные. Их конечно можно вернуть через бэкап, но это сложнее и дольше.
...
Рейтинг: 0 / 0
10.04.2018, 13:16
    #39627900
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как применить строковую функцию только к части выборки?
К тому же у некоторых пользователей есть доступ к просмотру паролей, и им вполне можно разрешить смотреть эти пароли в журнале.
...
Рейтинг: 0 / 0
10.04.2018, 13:30
    #39627908
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как применить строковую функцию только к части выборки?
Alibek B.Я стараюсь не лезтьОбратись к разработчикам, не майся дурью.
...
Рейтинг: 0 / 0
10.04.2018, 14:06
    #39627933
Бельфя
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как применить строковую функцию только к части выборки?
а как выглядит запрос с case?
...
Рейтинг: 0 / 0
10.04.2018, 14:41
    #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
10.04.2018, 14:48
    #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
10.04.2018, 15:06
    #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
10.04.2018, 16:55
    #39628037
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как применить строковую функцию только к части выборки?
Alibek B.Нет, пароль должен быть текстом, он используется оборудованием, которое не умеет работать с кодированным или хешированным паролем, поддерживает только plain password.Я верно понял, что оборудование лезет в логи для получения самого свежего пароля?
...
Рейтинг: 0 / 0
10.04.2018, 17:05
    #39628040
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как применить строковую функцию только к части выборки?
Нет, я имел ввиду, что открытый пароль нужен в рабочих таблицах — оборудование авторизует услуги по RADIUS и умеет только plain password.
Хранить открытый пароль в логах необходимости нет, но сама информационная система устроена так, что любые атрибуты (в том числе и пароли) сохраняет в логах как есть, в виде текста. Если маскировать пароль перед сохранением в логах (с помощью триггера), то это на функционировании системы никак не скажется.
В принципе на таблице логов и без того висит триггер, и насколько я могу видеть, в него маскировку паролей несложно будет добавить. Но теперь уже из любопытства хотелось бы узнать, можно ли маскировать пароль непосредственно в SQL-запросе, не изменяя БД.
...
Рейтинг: 0 / 0
10.04.2018, 17:32
    #39628052
SY
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
10.04.2018, 17:42
    #39628059
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как применить строковую функцию только к части выборки?
Alibek B.Но теперь уже из любопытства хотелось бы узнать, можно ли маскировать пароль непосредственно в SQL-запросе, не изменяя БД.

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

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

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

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

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

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

.....
stax
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как применить строковую функцию только к части выборки? / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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