ПОСЛЕ ВСТАВКИ Триггер для SQL Server для создания уникального случайного 8-символьного кода? - PullRequest
0 голосов
/ 06 апреля 2009

Я начал с кода хранимой процедуры Раймонда Льюаллена для генератора паролей. Я хотел бы создать триггер, который будет создавать уникальный 8-символьный идентификатор каждый раз, когда вставляется новая строка (клиент). Что у меня так далеко:

    CREATE procedure dbo.AllAccessIDgenerator (
     
      @showID varchar(40)
      @accessID varchar(100) OUT
    )
    

    As
    

    Begin
       declare @codeLength int
       declare @characters varchar(100)
    
       declare @count int
       set @characters = ''
       set @codeLength = 8

    -- set A - Z (uppercase)
     
     set @count = 65
     
      while @count <=90
     
       begin
         
         set @characters = @characters + Cast(CHAR(@count) as char(1))
         
         set @count = @count + 1
     
       end
     end

    -- set 0-9
    set @count = 48  
     while @count <=57  
     begin  
      set @characters = @characters + Cast(CHAR(@count) as char(1))  
      set @count = @count + 1  
     end  
     end  
 
    set @count = 0  
    set @accessID = ''  

     while @count <= @codeLength
     
      begin
         
       set @accessID = @accessID + SUBSTRING(@characters,CAST(ABS(CHECKSUM(NEWID()))*RAND(@count) as int)%LEN(@characters)+1,1)
         
       set @count = @count + 1
     
      end
    
     end

    end
    
    GO

Как (а) взять хранимую процедуру и сделать ее триггером в SQL Server 2008 и (б) если бы мне нужно было проверить уникальность, как мне это сделать?

Ответы [ 3 ]

1 голос
/ 06 апреля 2009

Если честно, я бы рекомендовал делать это на уровне вашего домена, а не в базе данных. Доменная логика в базе данных может усложнить поддержку и последующее развертывание. Конечно, у вас могут быть ограничения и т. Д. В базе данных для предотвращения недопустимых значений внешнего ключа и т. Д., Но генерация уникального значения является бизнес-правилом и относится к уровню бизнес-правил вашей системы (т. Е. Уровень домена / Логика / Объекты).

Кроме того, в чем причина создания уникального значения таким образом? Будет ли столбец идентификации лучше соответствовать вашим целям? Вы всегда можете использовать столбец идентификации как часть значения с 8 символами, что обеспечит уникальность.

1 голос
/ 06 апреля 2009

Учитывая ваши требования, я бы так и сделал

  1. Создать таблицу паролей с двумя столбцами. Пароль и используется.
  2. Создать уникальный индекс в столбце Пароль.
  3. Заполните эту таблицу столько предметов, сколько вам нужно.
  4. В вашем триггере получите первый пароль, где IsUsed = 0.
  5. Set IsUsed = 1.

Очевидно, вам следует использовать некоторую форму шифрования или хеширования для ваших паролей. Пароли никогда не должны храниться в виде простого текста . Я бы посоветовал вам поискать способы защиты паролем.

Редактировать

  1. мне не совсем понятно, нужны ли вам пароли или просто уникальные 8-значные идентификаторы для ваших клиентов. Если вам нужны уникальные идентификаторы, вы должны игнорировать часть шифрования этого решения.
  2. Для заполнения таблицы я бы сгенерировал х количество идентификаторов во временной таблице и сделал бы выбор, отличный от этой таблицы, в качестве источника для вставки в фактическую таблицу.
0 голосов
/ 06 апреля 2009

Я собираюсь добавить несколько советов по использованию триггера для этого. Да, это можно сделать с помощью триггера. (И, в отличие от Нила, я думаю, что это должно быть проблемой с базой данных, потому что все записи будут нуждаться в уникальности, а не только в том, что они добавлены через определенный интерфейс. Использование подобной логики в приложении - плохая идея с точки зрения целостности данных. Ata minumum make уверен, что поле имеет уникальный индекс.)

Тем не менее, большинство неопытных разработчиков триггеров считают, что триггеры работают с каждой строкой по отдельности и не спроектируют свой триггер для обработки вставок в несколько строк. Вы можете подумать, что нет многострочных вставок; Вы бы большую часть времени были неправы. В какой-то момент вы захотите импортировать группу клиентов, триггер должен быть в состоянии справиться с этим.

Теперь, используя ваш процесс, он может обрабатывать только одну запись за раз. Это огромный недостаток, потому что единственный способ обработать его в триггере - использовать курсор или цикл while. Это очень медленно и может привести к тому, что ваш клиентский стол будет заблокирован на несколько часов, если вам потребуется добавить сразу много клиентов.

Я думаю, что идея Ливена о создании пула возможных уникальных паролей является хорошей, потому что тогда вы можете использовать основанную на множестве логику в триггере для ее заполнения. Но для правильной работы вам понадобятся три столбца (например, поле идентификатора, которое можно использовать для захвата следующих 300 строк). Вы также должны запланировать ночную работу, чтобы генерировать больше потенциальных паролей, если число неиспользованных номеров меньше определенного процента. Таким образом, вещи никогда не потерпят неудачу, потому что у вас неожиданно закончились потенциальные пароли.

...