0

パスワードジェネレータ用のRaymondLewallenによるストアドプロシージャコードから始めました。新しい行(顧客)が挿入されるたびに一意の8文字のIDを作成するトリガーを作成したいと思います。私がこれまでに持っているもの:

    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

(a)ストアドプロシージャを取得してSQL Server 2008でトリガーにする方法、および(b)一意性をテストする必要がある場合はどうすればよいですか?

4

3 に答える 3

1

あなたの要件を考えると、これは私がそれを行う方法です

  1. 2 つの列を持つテーブル passwords を作成します。パスワードと IsUsed。
  2. [パスワード] 列に一意のインデックスを作成します。
  3. 必要な数の項目をこのテーブルに入力してください。
  4. トリガーで、IsUsed = 0 の最初のパスワードを取得します。
  5. IsUsed = 1 に設定します。

明らかに、パスワードには何らかの形式の暗号化またはハッシュを使用する必要があります。パスワードはプレーン テキストとして保存しないでください。パスワード保護の方法を検索することをお勧めします。

編集

  1. パスワードが必要なのか、顧客に固有の 8 文字の ID だけが必要なのか、私には完全にはわかりません。一意の ID だけが必要な場合は、もちろん、このソリューションの暗号化部分を無視する必要があります。
  2. テーブルを埋めるために、x 個の ID を一時テーブルに生成し、実際のテーブルへの挿入のソースとして、このテーブルとは異なる選択を行います。
于 2009-04-06T07:28:07.087 に答える
0

このためのトリガーの使用に関するアドバイスをいくつか追加します。はい、トリガーでこれを行うことは可能です。(Neilとは異なり、特定のインターフェイスを介して追加されたレコードだけでなく、すべてのレコードに一意性が必要になるため、データベースの問題になると思います。このようなロジックをアプリケーションに組み込むことは、データの整合性の観点からは悪い考えです。フィールドに一意のインデックスがあることを確認してください。)

ただし、ほとんどの経験の浅いトリガー開発者は、トリガーは各行で個別に機能すると考えており、複数の行の挿入を処理するようにトリガーを設計していません。複数の行の挿入はないと思うかもしれません。ほとんどの場合、あなたは間違っているでしょう。ある時点で、顧客のグループをインポートする場合、トリガーはこれを処理できる必要があります。

procを使用すると、一度に1つのレコードしか処理できません。トリガーでそれを処理する唯一の方法はカーソルまたはwhileループを使用することであるため、これは大きな欠陥です。これは非常に遅く、一度に多数の顧客を追加する必要がある場合は、顧客テーブルが何時間もロックされる可能性があります。

可能な一意のパスワードのプールを作成するというLievenのアイデアは、トリガーでセットベースのロジックを使用して入力できるため、良いアイデアだと思います。ただし、正しく機能させるには、3つの列(たとえば、次の300行を取得するために使用するIDフィールド)が必要になります。また、未使用の数が特定の割合を下回っている場合は、より多くの潜在的なパスワードを生成するために、夜間のジョブをスケジュールする必要があります。そうすれば、潜在的なパスワードが予期せず不足したために失敗することはありません。

于 2009-04-06T15:33:35.110 に答える