MSDE FunClub 現在までのアクセスカウント数 最終更新日 : 2000/08/22
Microsoft Data Engine FunClub
Since 2000.08.22
SQLServer7.0/MSDE 完全トレーニングテキスト(下巻)
【第12章140p 〜 144p掲載】

-- [SQL12_06.SQL]
--             SQLServer7.0  Transact-SQL言語
--             日本技術ソフト開発  堀川 明
--            http://www.horikawa.ne.jp/msde/
--
--      【SQLServer認証ログインの一括登録処理】
--
-- [注意]
--   1人分のログイン登録は、SQL01_01プログラムでも実施しています
--   システム管理者の方に、このSQL文を実行して頂きましょう

--  SELECT文などの実行によって、( 件処理されました)の表示抑制
    SET NOCOUNT ON
GO

--  ***************************************************
--   現在実行している人のログインセキュリティのチェック
--  ***************************************************
    DECLARE @F_SYSADMIN int , @F_SECUADMIN int
    
    -- サーバーロールsysadminに、あなたは所属していますか?
    SELECT @F_SYSADMIN  = IS_SRVROLEMEMBER( 'sysadmin' )
    
    -- サーバーロールsecurityadminに、あなたは所属していますか?
    SELECT @F_SECUADMIN = IS_SRVROLEMEMBER( 'securityadmin' )
    
    IF( (@F_SYSADMIN=0) AND (@F_SECUADMIN=0) )
       BEGIN
          -- 127番にすると、osqlやisqlではスクリプト強制終了です
          RAISERROR( '残念ですがログイン登録の権限がありません',16,127)
          RETURN
       END
GO

--  *****************************************************
--   ログインを1件分登録するストアドプロシージャの作成
--  *****************************************************
    IF( (object_id('AddLogin') IS NOT NULL) AND
        (OBJECTPROPERTY( object_id('AddLogin' ) , 'IsProcedure' ) = 1 ) )
        BEGIN
               DROP PROCEDURE AddLogin   --既存のものを削除する
        END
GO

    CREATE PROCEDURE  AddLogin
               @lognm     sysname ,        -- ログイン名
               @passwd    sysname = NULL , -- パスワード
               @defdb     sysname = 'master' ,  -- 既定のデータベース
               @sysadmin      int = 0 ,    -- 所属させるサーバーロールです
               @securityadmin int = 0 ,    -- 所属させるときは =1 です
               @serveradmin   int = 0 ,
               @setupadmin    int = 0 ,
               @processadmin  int = 0 ,
               @diskadmin     int = 0 ,
               @dbcreator     int = 0
    AS
        SET NOCOUNT ON
        DECLARE @RETVAL int              -- ストアドプロシージャの戻り値を受け取る

        -- ログインを1件分登録する
        EXEC @RETVAL = sp_addlogin  
                          @lognm  ,     --ログインの名前
                          @passwd ,     --パスワードを省略するときは NULL
                          @defdb  ,     --既定のデータベース先
                           NULL   ,     --既定言語(デフォルト)
                           NULL   ,     --セキュリティID番号(デフォルト)
                           NULL         --パスワードを暗号化して登録する

        --ストアドプロシージャの実行結果は失敗しましたか?
        IF( @RETVAL = 1 ) RETURN 1

        -- 今登録したログインに対して固定サーバーロールに所属
        -- エラーの発生は無視する
        IF( @sysadmin      = 1 )  EXEC @RETVAL = sp_addsrvrolemember @lognm , 'sysadmin'
        IF( @securityadmin = 1 )  EXEC @RETVAL = sp_addsrvrolemember @lognm , 'securityadmin'
        IF( @serveradmin   = 1 )  EXEC @RETVAL = sp_addsrvrolemember @lognm , 'serveradmin'
        IF( @setupadmin    = 1 )  EXEC @RETVAL = sp_addsrvrolemember @lognm , 'setupadmin'
        IF( @processadmin  = 1 )  EXEC @RETVAL = sp_addsrvrolemember @lognm , 'processadmin'
        IF( @diskadmin     = 1 )  EXEC @RETVAL = sp_addsrvrolemember @lognm , 'diskadmin'
        IF( @dbcreator     = 1 )  EXEC @RETVAL = sp_addsrvrolemember @lognm , 'dbcreator'
        RETURN @RETVAL
GO

--  ***********************************************************
--     ログイン一括登録を行なうテーブルの定義とレコードの登録
--  ***********************************************************
    CREATE TABLE #LOGIN_LIST (
               lognm     sysname        ,              -- ログイン名
               passwd    sysname NULL DEFAULT NULL ,   -- パスワード
               defdb     sysname   DEFAULT 'master' ,  -- 既定のデータベース
               sysadmin      int   DEFAULT  0 ,    -- 所属させるサーバーロールです
               securityadmin int   DEFAULT  0 ,    -- 所属させるときは =1 です
               serveradmin   int   DEFAULT  0 ,
               setupadmin    int   DEFAULT  0 ,
               processadmin  int   DEFAULT  0 ,
               diskadmin     int   DEFAULT  0 ,
               dbcreator     int   DEFAULT  0
    )
    --ログイン登録者リストの定義
    INSERT INTO #LOGIN_LIST( lognm  )         VALUES ( 'Guest01' )
    INSERT INTO #LOGIN_LIST( lognm , passwd ) VALUES ( 'Guest02' , 'pass' )
    INSERT INTO #LOGIN_LIST VALUES ( 'Guest03' , 'pass'  , 'MySampleTest' , 0,0,0,0,0,0,1)
    INSERT INTO #LOGIN_LIST VALUES ( 'Guest04' , 'pass'  , DEFAULT        , 0,0,0,0,0,1,1)
    INSERT INTO #LOGIN_LIST VALUES ( 'Guest05' , 'pass'  , DEFAULT        , 0,0,0,0,1,1,1)
    INSERT INTO #LOGIN_LIST VALUES ( 'Guest06' , 'pass'  , DEFAULT        , 0,0,0,1,1,1,1)
    INSERT INTO #LOGIN_LIST VALUES ( 'Guest07' , 'pass'  , DEFAULT        , 0,0,1,1,1,1,1)
    INSERT INTO #LOGIN_LIST VALUES ( 'Guest08' , 'pass'  , DEFAULT        , 0,1,1,1,1,1,1)
    INSERT INTO #LOGIN_LIST VALUES ( 'sa2'     , DEFAULT , DEFAULT        , 1,0,0,0,0,0,0)
GO

--  **************************
--   ログインの一括登録処理
--  **************************
    DECLARE @lognm     sysname         -- ログイン名
    DECLARE @passwd    sysname         -- パスワード
    DECLARE @defdb     sysname         -- 既定のデータベース
    DECLARE @sysadmin  int             -- 所属させるサーバーロールです
    DECLARE @securityadmin int         -- 所属させるときは =1 です
    DECLARE @serveradmin   int
    DECLARE @setupadmin    int 
    DECLARE @processadmin  int 
    DECLARE @diskadmin     int 
    DECLARE @dbcreator     int

    --カーソルを定義する 
    DECLARE Log_CUR INSENSITIVE CURSOR
        FOR SELECT * FROM #LOGIN_LIST
        FOR READ ONLY

    -- カーソルを開く
    OPEN Log_CUR

    -- 先頭行の読み込み
    FETCH NEXT FROM Log_CUR INTO
              @lognm , @passwd , @defdb , 
              @sysadmin , @securityadmin , @serveradmin , @setupadmin , 
              @processadmin , @diskadmin , @dbcreator

    WHILE( @@FETCH_STATUS = 0 )
      BEGIN
             -- 1件分のログインの登録(エラー処理は省略)
             EXEC  AddLogin  @lognm , @passwd , @defdb , 
                             @sysadmin , @securityadmin , @serveradmin ,
                             @setupadmin , @processadmin , @diskadmin ,
                             @dbcreator

             -- 次行の読み込み
             FETCH NEXT FROM Log_CUR INTO
                  @lognm , @passwd , @defdb , 
                  @sysadmin , @securityadmin , @serveradmin , @setupadmin , 
                  @processadmin , @diskadmin , @dbcreator
      END

    -- カーソルを閉じる
    CLOSE Log_CUR

    -- カーソルを破棄する
    DEALLOCATE Log_CUR

    -- 一時テーブルを破棄する
    DROP TABLE  #LOGIN_LIST

    -- プロシージャも削除する
    DROP PROCEDURE AddLogin  
GO




技術評論社の書籍ガイドへ
下巻:ISBN4-7741-0966-5

ウィンドウを閉じる


(株)日本技術ソフト開発 責任編集:堀川 明
MSDE FunClubに関するご意見・ご要望等ございましたら、 msdefun@horikawa.ne.jp までご連絡下さい。
HOME: http://www.horikawa.ne.jp/msde/


MSDE FunClubの運営は、マイクロソフト社とは一切の関係はありません