Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как применить строковую функцию только к части выборки?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3726
Есть информационная система (веб-приложение), в которой имеется конфиденциальная информация, которую не должны видеть почти все пользователи. Например пароль на доступ к определенному сервису, который хранится текстом. В информационной системе показ или скрытие этой информацией регулируется правами доступа пользователей (штатным инструментом).
В информационной системе также есть функция "Журнал действий пользователей", который показывает выполняемые действия. Одно из таких действий — это смена пароля, для этого действия в текстовом описании действия указывается старый и новый пароль. То есть это недоработка информационной системы, посредством которой пользователи могут узнать пароль клиента.
Чтобы исправить эту недоработку, я внес изменения в серверный код информационной системы — точнее в текст SQL-запроса, который использует серверный код для получения информации из журнала. В SQL-запросе для поля с текстовым описанием действия я с помощью case определяю тип действия и для сообщений и смене пароля выполняю regexp_replace.
Все работает, но таблица журнала действий содержит миллионы строк и в результате задача "Журнал действий пользователей" начинает очень сильно тормозить — а без применения функции к полям таблицы задача отрабатывает быстро, поскольку необходимые поля индексированы и для вывода записей используется пагинация.
Сейчас я временно использую другое решение — SQL-запрос оставил как есть, а замену текста выполняю в процессе вывода строк для веб-сервера. Так работает приемлемо, поскольку выводится не более 100 строк и даже построчная их обработка выполняется быстро.
А можно ли нужные изменения применить прямо в SQL-запросе, чтобы из БД уже возвращалась замаскированная информация?
10 апр 18, 11:14    [21325636]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Бельфя
Member

Откуда: Краснодар
Сообщений: 78
может быть не стоит хранить пароль в открытом виде в описании к действию?
То есть подменять его при вставке в БД истории действия пользователей?
10 апр 18, 11:31    [21325710]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
XMLer
Member

Откуда:
Сообщений: 258
Alibek B.
а без применения функции к полям таблицы задача отрабатывает быстро, поскольку необходимые поля индексированы и для вывода записей используется пагинация.

Не верю
10 апр 18, 11:35    [21325728]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Dshedoo
Member

Откуда:
Сообщений: 393
Alibek B.
в текстовом описании действия указывается старый и новый пароль

У вас тут ошибка.
Попробуйте хранить хэш.
10 апр 18, 11:36    [21325736]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3726
Нет, пароль должен быть текстом, он используется оборудованием, которое не умеет работать с кодированным или хешированным паролем, поддерживает только plain password.
10 апр 18, 11:36    [21325737]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
XMLer
Member

Откуда:
Сообщений: 258
Alibek B.,
Планы в студию с наложение regexp_replace и без
10 апр 18, 11:38    [21325749]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3726
Dshedoo
У вас тут ошибка.
Попробуйте хранить хэш.

Так информационная система сделана.
Программный код информационной системы мне доступен, поэтому теоретически я могу это сделать — маскировать пароль при регистрации действия в журнале. Но пароль может изменяться в разных местах и разными способами, поэтому я могу что-то пропустить.
10 апр 18, 11:38    [21325752]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3726
XMLer
Планы в студию с наложение regexp_replace и без

Это сложновато будет.
SQL собирается в информационной системе, в SQL есть хинты, поэтому для правильности нужно перехватить тот SQL-запрос, который информационная система отправляет в СУБД. А я не настолько хорошо знаю ЯП информационной системы, чтобы это сделать.
Но попробую собрать SQL вручную, исходя из программного кода.
10 апр 18, 11:41    [21325772]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
Alibek B.,

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

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

....
stax
10 апр 18, 12:16    [21325966]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3726
Журнал действий операторов — это одна из самых больших таблиц, там порядка 200кк записей, я с ней экспериментировать не рискну.
Что касается тормозов от применения функции к одному из полей выборки — может быть это ломает какой-нибудь хинт. Когда извлеку SQL и воспроизведу проблему, приложу оба плана.
10 апр 18, 12:23    [21326010]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
XMLer
Member

Откуда:
Сообщений: 258
Alibek B.
Что касается тормозов от применения функции к одному из полей выборки — может быть это ломает какой-нибудь хинт.

Какой именно хинт ломает изменение select кляузы с field1 на case when a=1 then regexp_replace(fild_1 else field_1 end
10 апр 18, 12:28    [21326049]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3726
Не знаю, это предположение и может быть причина в другом.

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

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;
/



Запрос в целом базируется на таком:
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

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

Вот пример запроса с конкретными параметрами:
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 я его повторить пока не могу.
10 апр 18, 13:07    [21326257]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Elic
Member

Откуда:
Сообщений: 29990
Alibek B.
в текст SQL-запроса, который использует серверный код для получения информации из журнала. В SQL-запросе для поля с текстовым описанием действия я с помощью case определяю тип действия и для сообщений и смене пароля выполняю regexp_replace.
Все работает,
А что мешает сделать это один раз в триггере?
10 апр 18, 13:11    [21326284]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3726
Я стараюсь не лезть туда, где могу что-то сломать.
Если я что-то неправильно сделаю в программном коде информационной системы, который осуществляет вывод информации в браузер, то это ошибку легко будет исправить, в самом крайнем случае просто скопировав заранее сделанную копию программного модуля.
Если я что-то сделаю неправильно в триггере, я могу испортить данные. Их конечно можно вернуть через бэкап, но это сложнее и дольше.
10 апр 18, 13:15    [21326306]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3726
К тому же у некоторых пользователей есть доступ к просмотру паролей, и им вполне можно разрешить смотреть эти пароли в журнале.
10 апр 18, 13:16    [21326311]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Elic
Member

Откуда:
Сообщений: 29990
Alibek B.
Я стараюсь не лезть
Обратись к разработчикам, не майся дурью.
10 апр 18, 13:30    [21326374]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Бельфя
Member

Откуда: Краснодар
Сообщений: 78
а как выглядит запрос с case?
10 апр 18, 14:06    [21326535]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
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
10 апр 18, 14:41    [21326707]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3726
Elic
Обратись к разработчикам

Это слишком дорого.
Кроме того, сейчас эта версия информационной системы уже не поддерживается, нужно обновляться на 3 мажорных версии и переносить модификации.
Практически это нереально.

Бельфя
а как выглядит запрос с case?

Как-то так:
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 ...), но как я понимаю, такой подход на больших таблицах противопоказан, поэтому списки идентификаторов у меня вписаны прямо в запрос.
10 апр 18, 14:48    [21326729]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Dshedoo
Member

Откуда:
Сообщений: 393
Alibek B.
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


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
10 апр 18, 15:06    [21326813]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54396
Alibek B.
Нет, пароль должен быть текстом, он используется оборудованием, которое не умеет работать с кодированным или хешированным паролем, поддерживает только plain password.
Я верно понял, что оборудование лезет в логи для получения самого свежего пароля?
10 апр 18, 16:55    [21327293]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Alibek B.
Member

Откуда:
Сообщений: 3726
Нет, я имел ввиду, что открытый пароль нужен в рабочих таблицах — оборудование авторизует услуги по RADIUS и умеет только plain password.
Хранить открытый пароль в логах необходимости нет, но сама информационная система устроена так, что любые атрибуты (в том числе и пароли) сохраняет в логах как есть, в виде текста. Если маскировать пароль перед сохранением в логах (с помощью триггера), то это на функционировании системы никак не скажется.
В принципе на таблице логов и без того висит триггер, и насколько я могу видеть, в него маскировку паролей несложно будет добавить. Но теперь уже из любопытства хотелось бы узнать, можно ли маскировать пароль непосредственно в SQL-запросе, не изменяя БД.
10 апр 18, 17:05    [21327337]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Повесь RLS policy для маскировки от всех кто не должен видеть. Например только владелец может видеть поле sal в таблице sec_emp:

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.

Сообщение было отредактировано: 10 апр 18, 17:33
10 апр 18, 17:32    [21327436]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
Alibek B.
Но теперь уже из любопытства хотелось бы узнать, можно ли маскировать пароль непосредственно в SQL-запросе, не изменяя БД.


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

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

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

.....
stax
10 апр 18, 17:42    [21327461]     Ответить | Цитировать Сообщить модератору
 Re: Как применить строковую функцию только к части выборки?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
SY,

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

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

.....
stax
10 апр 18, 17:51    [21327503]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить