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

-- [SQL04_04.SQL]
--             SQLServer7.0  Transact-SQL言語
--             日本技術ソフト開発  堀川 明
--            http://www.horikawa.ne.jp/msde/
--
-- このSQLプログラムは、環境設定を行います
--   1)SQLServerへの新規ログイン名A,B,Cの3人を登録します
--   2)新しいデータベース [ストアドテスト用] を新規に作成します
--   3)[ストアドテスト用]へ データベースユーザA,B,Cを登録します
--   4)[ストアドテスト用]へ ストアドプロシージャを登録します
--     このユーザには、ストアドプロシージャだけは実行できる
--     権限を与えます
-- 以上の環境設定を行います
--


-- ************************
--  作業用一時プロシージャ
-- ************************
    CREATE PROCEDURE #Is_LoginExist
          @lognm varchar(10)
  AS
    SET NOCOUNT ON    --メッセージの抑止
    -- ログイン名の登録検査は、システムビュー表を調査します
    IF EXISTS(SELECT * FROM master.dbo.syslogins where loginname = @lognm )
       BEGIN
          RAISERROR( 'ログイン名 ''%s'' が存在します。削除してください' ,
                     0 , 127 , @lognm )
          RETURN(1)
      END
    RETURN(0)
GO


-- **********************************************
--   【STEP-1:スクリプト実行者の権限チェック】
--   1) ログインユーザを新規登録できる権限は sysadmin
--      および securityadmin だけです
--      sysadmin は securityadminの権限を持っています
--   2)データベースの新規作成が可能な権限は、dbcreator です
-- **********************************************
    IF ( NOT IS_SRVROLEMEMBER( 'securityadmin' ) = 1 )
      BEGIN
          -- 私は、securityadmin固定サーバーロールに所属しません
          PRINT 'システム管理者権限(例えばsa)でログインしてください'
          RAISERROR( '私には、ログイン新規登録処理の権限はありません' , 16 , 127 )
          RETURN
      END

    IF ( NOT IS_SRVROLEMEMBER( 'dbcreator' ) = 1 )
      BEGIN
          -- 私は、dbcreator 固定サーバーロールに所属しません
          RAISERROR( '私には、データベースを新規作成することはできません' , 16 , 127 )
          RETURN
      END
GO

-- **********************************************
--   【STEP-2:ログインの登録】
--      ログイン'A','B','C'の3人を登録する
--      すでに存在していればエラーとする
-- **********************************************
    DECLARE @Ret int

    -- ログインA はすでにありますか?
    EXECUTE @Ret = #Is_LoginExist 'A'
    IF @Ret <> 0 RETURN   -- すでに存在します(中止)

    -- ログインB はすでにありますか?
    EXECUTE @Ret = #Is_LoginExist 'B'
    IF @Ret <> 0 RETURN   -- すでに存在します(中止)

    -- ログインC はすでにありますか?
    EXECUTE @Ret = #Is_LoginExist 'C'
    IF @Ret <> 0 RETURN   -- すでに存在します(中止)

    -- ログインの登録(第2引数がパスワードです。この例では省略です)
    EXECUTE sp_addlogin 'A' , NULL , 'master' , NULL , NULL , NULL
    EXECUTE sp_addlogin 'B' , NULL , 'master' , NULL , NULL , NULL
    EXECUTE sp_addlogin 'C' , NULL , 'master' , NULL , NULL , NULL
GO


-- **********************************************
--   【STEP-3:データベースの作成】
--      データベースを新規に作成します
-- **********************************************
    -- すでに同名のデータベースが存在したらエラーとする
    IF EXISTS(SELECT * FROM master.dbo.sysdatabases where name = 'ストアドテスト用' )
       BEGIN
          RAISERROR( 'ストアドテスト用のデータベースが存在しました。削除してください' , 16 , 127 )
          RETURN
      END

    -- データベースを新規に作成する
    CREATE DATABASE [ストアドテスト用]
GO


-- **********************************************
--   【STEP-4:データベースのユーザを登録する】
--      ログインA,B,Cログインの既定データベースを変更する
--      データベースユーザを登録する
-- **********************************************

    -- ログイン者の既定データベースをmasterから[ストアドテスト用]に変更する
    EXECUTE sp_defaultdb 'A' , 'ストアドテスト用'
    EXECUTE sp_defaultdb 'B' , 'ストアドテスト用'
    EXECUTE sp_defaultdb 'C' , 'ストアドテスト用'

    -- ユーザ名の登録。第1引数がログイン名、第2引数がユーザ名
    -- sp_grantdbaccess は、現在のデータベースに対してユーザ登録を行う
    -- 現在のデータベースを変更すること
    USE [ストアドテスト用]
    EXECUTE sp_grantdbaccess 'A', 'USER_A'
    EXECUTE sp_grantdbaccess 'B', 'USER_B'
    EXECUTE sp_grantdbaccess 'C', 'USER_C'
GO


-- **********************************************
--  【STEP-5:ストアドプロシージャの登録を行う】
--    このプロシージャを登録するのは、私(dbo)です
--    所有者はdboです。このことに注意してください
-- **********************************************

    -- このプロシージャを実行した人が、テーブルの所有者になる
    CREATE PROCEDURE PROC_MakeTable
  AS
        IF( (object_id('MyTable') IS NOT NULL) AND
             OBJECTPROPERTY(object_id('MyTable') ,'IsTable')=1)
         BEGIN
               DROP TABLE MyTable
         END

         CREATE TABLE MyTable(
                   ID int , ID2 char(6)
           )
GO

    CREATE PROCEDURE PROC_SetData
  AS
           -- このMyTableの所有者は一体誰でしょうか???
           DELETE FROM MyTable
           INSERT INTO MyTable VALUES( 1 , 'A' )
           INSERT INTO MyTable VALUES( 2 , 'B' )
           INSERT INTO MyTable VALUES( 3 , 'C' )
           SELECT * FROM MyTable
GO


-- ****************************************************
--  【STEP-6:ストアドプロシージャの実行権限を与える】
--    STEP-4で登録したユーザは、public ロールで何も権限がありません
--    ストアドプロシージャの実行権限を与えます
--    またテーブル作成権限も必要です
-- ****************************************************
    --     実行許可   ストアドの名前     許可するユーザリスト
    GRANT  EXECUTE ON PROC_MakeTable  TO USER_A,USER_B,USER_C
    GRANT  EXECUTE ON  PROC_SetData   TO USER_A,USER_B,USER_C

    -- CREATE TABLE 作成権限がないとストアドプロシージャ内でエラーが起こる
    GRANT CREATE TABLE TO USER_A,USER_B,USER_C
GO


-- 最初に作成した一時ストアドプロシージャを削除する
    DROP PROCEDURE #Is_LoginExist
GO




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

ウィンドウを閉じる


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


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