MSDE FunClub 現在までのアクセスカウント数 最終更新日 : 2000/06/01
Microsoft Data Engine FunClub
Since 2000.06.01
SQLServer7.0/MSDE 完全トレーニングテキスト(上巻)
【第1章39p 〜 42p掲載】

-- [SQL01_02.SQL]
--             SQLServer7.0  Transact-SQL言語
--             日本技術ソフト開発  堀川 明
--            http://www.horikawa.ne.jp/msde/
--
-- このSQLプログラムは、
--   MySampleTest データベースを新規に作成します
--
-- [注意]
--   このSQL文を実行するログイン者に、データベースの新規作成権限
--   を与えてください。
--   ログインのサーバーロールで、Database Creators の権限が必要です
--   System Administrators の権限でもOKです
--

-- ( 件処理されました)のメッセージの表示を抑止します
    SET NOCOUNT ON
GO

-- **************************
-- ログイン名のチェックを行う
--      simon ですか?
-- **************************
    DECLARE @LOGIN  varchar(20)
    DECLARE @MSG    varchar(80)
    SELECT @LOGIN = SYSTEM_USER   -- ログイン名を取得
    IF @LOGIN <> 'simon'
      BEGIN
            SELECT @MSG = '現在のログイン名が、''' + @LOGIN +
                           ''' です。simonではありません。'
            RAISERROR('%s 中止します' , 0 , 127 , @MSG )
            RETURN
      END
GO


-- 一時テーブル #MyTempTable が存在していたら、そのテーブルを削除します
    IF EXISTS (SELECT name FROM tempdb..sysobjects
                   WHERE id =  object_id('tempdb..#MyTempTable') AND type = 'U ')  
    BEGIN
             DROP TABLE  #MyTempTable
    END
GO
     

-- ************
--   【注意】
-- ************
-- 権限調査は[SQL01_01]で行っているように IS_SRVROLEMEMBER で可能です
-- この例では自分で直接行う方法でプログラムを作りましたが実際は IS_SRVROLEMEMBER
-- を使ってください

-- 固定サーバーロールDatabase Creators に私は登録済みですか?
-- 私に、果たしてデータベースを作成する権限はあるのでしょうか?

-- ストアドプロシージャの結果を受け取るための一時作業テーブルを作成する
-- sp_helpsrvrolemember のマニュアルを参照のこと
    CREATE TABLE #MyTempTable (
                    ServerRole sysname , 
                    MemberName sysname , 
                    MemberSID varbinary(85)
    )
GO

--  ***************************************************** 
--   固定サーバーロールに登録されたログイン名の取得を行う
--  *****************************************************
    DECLARE @RETVAL int  -- ストアドプロシージャの関数値を受け取る作業用変数
    DECLARE @LOGIN_NAME varchar(20)

    SELECT  @LOGIN_NAME = SUSER_SNAME() ,   -- ログインの名前
            @RETVAL = 0                     -- ストアドでエラーが発生すると1です

    --  ストアドプロシージャの返す内容を、作業用テーブルに登録します
    --  Database Creators のサーバーロールのメンバを取得する
    INSERT INTO #MyTempTable EXEC @RETVAL = sp_helpsrvrolemember 'dbcreator'

    -- もしエラーチェックを行う場合は、この方法で行う
    IF @RETVAL = 1       -- エラーは起きましたか?
    BEGIN
          RAISERROR( 'sp_helpsrvrolemember でエラーが発生しました' , 16 , 127)
          RETURN  --バッチ処理を止める 
    END

    --  System Administratorsのサーバーロールのメンバを取得する
    INSERT INTO #MyTempTable EXEC @RETVAL = sp_helpsrvrolemember 'sysadmin'

    -- 一時作業テーブルの内容を表示しましょう
    PRint ''   -- 改行
    SELECT CONVERT(varchar(30),MemberName) AS データベース作成権限者一覧
         FROM #MyTempTable

    -- ログイン名が発見できましたか?
    IF EXISTS (SELECT MemberName  FROM #MyTempTable
                          WHERE MemberName = @LOGIN_NAME )
      BEGIN
        -- 発見できました(データベースの作成権限あり)
        PRINT @LOGIN_NAME + 'ログイン者は、データベースの作成権限がありました'

        -- データベースMySampleTestが存在しますか?
        -- 存在しなければ、新しく作ります
        -- データベースの存在チェックは、masterデータベースのsysdatabasesを参照します
        -- sp_databasesストアドプロシージャによって、存在テストを行うこともできます
        IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases
                       WHERE name = 'MySampleTest' )
          BEGIN

            -- ******************************
            --  データベースの新規作成を行う
            -- ******************************
            CREATE DATABASE MySampleTest 

            PRINT 'データベース MySampleTestを作成しました' 
          END
        ELSE
          BEGIN
            PRINT 'データベース はすでに存在します'
            PRINT 'データベース MySampleTestを削除してください'
            PRINT '処理を中止します'
            RETURN
          END
      END
    ELSE
      BEGIN
        PRINT '残念ながら、データベースの作成権限はありません'
        PRINT '処理を中止します'
        RETURN
      END
GO

    -- 一時作業テーブルを削除します
    DROP TABLE  #MyTempTable
GO





技術評論社の書籍ガイドへ
上巻:ISBN4-7741-0965-7

ウィンドウを閉じる


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


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