| 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