powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Как не трогать/обновлять поле, если оно не изменялось
6 сообщений из 6, страница 1 из 1
Как не трогать/обновлять поле, если оно не изменялось
    #38596842
Рустамка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Преамбула:
Разработал для нужд отдела маленькое приложеньице, доступ к которому осуществлялся через собственную систему аутентификации для 5-7 пользователей. Нарисовал я для нее простенькую админку. Была единственная проблема - при изменении ключевых характеристик пользователя (блокировка, изменение е-мыла или, не дай Б-г, имени пользователя) надо было постоянно вводить пароль в поле, отвечающее за пароль. Пока приложением пользовались 5-7 пользователей - проблема часто не возникала - все пароли в голове. Но! Приложеньице увидел большой босс. Обозвал его специализированным программным обеспечением и сказал допустить к пользованию других сотрудников из других отделов. Защитники информации одобрили вариант аутентификации, но только если сам пароль в БД будет храниться в зашифрованном виде. Создал в Page Processing -> After Submit -> Computation -> md5(:PASSWD). И вот тут-то я столкнулся с проблемой постоянного набора пароля. В форму в поле PASSWD при FETCH падает значение из таблицы, т.е. результат выполнения md5(:PASSWD). Естественно при следующем сабмите страницы в таблицу падает md5(md5(:PASSWD)), что не соответствует действительности.
Фабула:
В итоге ПОКА изменение характеристик пользователя обхожу следующим образом:
1. Открываю ползователя для редактирования в админке
2. Копирую результат функции из прямого доступа к таблице (через TOAD) содержимое поля.
3. При изменении характеристик ставлю рандомный пароль аля "что под пальцы попало"
4. Сохраняю пользователя
5. Через TOAD вставляю содержимое буфера обмена в нужное поле
Внимание, уважаемые знактоки! Вопрос:
Есть ли возможность "обходить" как-то поле "PASSWD", если оно не изменялось? Можно тыкнуть носом в маны.
Ну и, согласно правилам:
Код: plsql
1.
select version, status from dba_registry where comp_id = 'APEX';


version|status
4.2.3.00.08|VALID
.....
Embedded PL/SQL Gateway + XDB Protocol Server;
Код: plsql
1.
select * from v$version where rownum = 1;


banner
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

P.S.: Для обнаруживших в Oracle новую неизвестную функцию:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create or replace function md5 (p_value varchar2) return varchar2 as
v_result dbms_obfuscation_toolkit.varchar2_checksum;
begin

  dbms_obfuscation_toolkit.md5 (
      input_string => p_value
    , checksum_string => v_result
  );
return v_result;
end;
...
Рейтинг: 0 / 0
Как не трогать/обновлять поле, если оно не изменялось
    #38597193
rockclimber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам надо изменить логику работы. Поле PASSWD не селектить вообще, при сабмите брать md5 от значения, введенного пользователем, и сравнивать его с тем, что лежит в таблице. Если не совпадают - не апдейтить таблицу, а выбрасывать исключение.
...
Рейтинг: 0 / 0
Как не трогать/обновлять поле, если оно не изменялось
    #38597198
Gustly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В какой момент у вас происходит обхэшивание?

Как вариант. У вас в поле MD5. При фетче в поле попадает хэш. Жмем субмит на апдейт.

Делаем триггер если :OLD = :NEW тогда null, иначе берем :NEW = md5(:NEW);

Если Вас так не устраивает, подумаю еще.
...
Рейтинг: 0 / 0
Как не трогать/обновлять поле, если оно не изменялось
    #38597337
Рустамка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GustlyВ какой момент у вас происходит обхэшивание?
After submit page.
Gustly Как вариант. У вас в поле MD5. При фетче в поле попадает хэш. Жмем субмит на апдейт.
Делаем триггер если :OLD = :NEW тогда null, иначе берем :NEW = md5(:NEW);
Если Вас так не устраивает, подумаю еще.
Вариант вполне имеет место быть. Спасибо. Вот только какой из двух:
1. Создаю доп.поле на форме. Делаю его hidden. Если после сабмита поля не равны-хеширую. В противном случае кладу в поле таблицы готовый хеш.
2. На форму и в таблицу добавляю поля md5value. И триггер начинает работать только в таблице по событию before update в случае расхождения.
3. ?

P.S.: Уважаемый, rockclimber. Прошу прощения что не ответил Вам, но доводы второго оратора были для меня яснее, и показалось мне, что вы говорите с ним об одном и том же. Но могу ошибаться. ;-)
...
Рейтинг: 0 / 0
Как не трогать/обновлять поле, если оно не изменялось
    #38597600
Рустамка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решение:
Сделал на таблицу USERS триггер
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE OR REPLACE TRIGGER SCHEME.BU_USERS
BEFORE UPDATE
ON SCHEME.USERS 
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
	 if :New.PASSWD <> :Old.PASSWD then :New.PASSWD := md5(:New.PASSWD);
	 else null;
	 end if; 
END BU_USERS;


И все заработало. Спасибо Gustly и rockclimber
...
Рейтинг: 0 / 0
Как не трогать/обновлять поле, если оно не изменялось
    #38597618
Рустамка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UPD : Естественно "обхеширование" происходит теперь _только_ по триггеру. Никаких привязок к Computation страницы
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Как не трогать/обновлять поле, если оно не изменялось
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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