Каждый раз присваивать пользователю уникальное значение - PullRequest
0 голосов
/ 13 июля 2020

Как сгенерировать и присвоить уникальное значение (последовательность) пользователю каждый раз, когда пользователь входит в систему? Если два пользователя одновременно входят в систему, я смогу избежать присвоения одинакового значения обоим. И это не конкретное требование c. Это может быть любая операция, для которой требуется сгенерировать и назначить последовательность. Я пытаюсь понять, как можно справиться с ситуацией, если операция происходит одновременно. Мне требуется решение для Oracle 11g.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вы назвали его - используйте последовательность .

create sequence myseq;

Извлеките из него значение, используя

select myseq.nextval from dual;

Назначив его этому пользователю. Хотя я не уверен, что понимаю, что это на самом деле; на что бы вы его назначили на самом деле? Надеюсь, ты знаешь.

0 голосов
/ 13 июля 2020

Не понимая, что именно вы хотите достичь sh с уникальным значением, поскольку вы не объясняете это, вы можете сделать что-то вроде этого:

Создайте последовательность для создания добавочного порядковый номер

SQL> create sequence my_seq start with xxx increment by yyy cache zzz;

Где

  • xxx - это номер, с которого должна начинаться последовательность
  • yyy - значение приращения последовательности (обычно 1 )
  • Поскольку вы планируете использовать его каждый раз, когда пользователь входит в систему, было бы неплохо кэшировать некоторые значения для более быстрого доступа. zzz представляет количество значений последовательности, которую вы хотите кэшировать.

Назначьте значения каждому пользователю, который входит в систему

Способ присвоения этого значения для пользователя каждый раз, когда он входит в систему, через триггер входа в систему и связывает его со свойствами сеанса, используя преимущества, предоставляемые контекстом по умолчанию SYS_CONTEXT. Конечно, для этого вам понадобится пользователь DBA для установки триггера в схеме администратора (как sys или system)

Пример сохранения этих значений в настраиваемой таблице аудита:

SQL> CREATE TRIGGER AFT_LOG_DBT 
     AFTER LOGON ON DATABASE
     DECLARE 
     -- declare variables
     v_db_user varchar2(100);
     v_os_user varchar2(100);
     v_seq number;
     BEGIN
         SELECT sys_context('userenv','session_id') , -- the session id 
                sys_context('userenv','osuser') , -- the os user
                my_seq.nextval                   -- the sequence next val
         INTO
               v_db_user,
               v_os_user,
               v_seq 
         FROM DUAL;
     -- insert those values into an audit table 
     insert into your_schema.log_audit ( logon_time , db_user, os_user, seq_val )
     values ( sysdate , v_db_user, v_os_user, v_seq );
     commit;
   END;

Поскольку вы не объясняли, что вы хотите сделать с уникальным значением последовательности, я попытался предоставить вам пример варианта использования.

Я никогда не получал повторяющиеся номера последовательности от генератора последовательности, если он не обернут максимальное значение или настроен на цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...