MSDE FunClub | 最終更新日 : 2000/07/29 | |
Microsoft Data Engine FunClub |
|
|
検証用スクリプト−1番 |
/* ** [1.SQL] ** ** このプログラムは、 ** 1)新しいデータベースを作成する ** 2)テーブル1番を作成し、レコードの登録 ** 3)データベースの完全バックアップの実施 ** 4)テーブル2番を作成し、レコードの登録 ** を実行するものです。 ** ** プログラムが複雑なのは、データベースの名前などが、皆様の環境に合わせて書き換えが ** できるように、パラメータで定義しました。 ** ** このプログラムは、(3)の完全バックアップデータファイルの中に、(4)の2番目テーブルの ** 情報が含まれていないことを、意識することです。 ** しかし幸いにも、(4)の情報は、トランザクションログの方に記録されています。 ** ** (C)(株)日本技術ソフト開発 堀川 明 2000/07/29 ** */ /* ** ( 件処理されました)のメッセージの抑止 */ SET NOCOUNT ON GO /* ** バッチ間で、データの受け渡しを行なうための、ローカル一時テーブル ** が存在していますか? 存在していれば、それを削除します */ IF EXISTS ( SELECT NAME FROM TEMPDB.DBO.SYSOBJECTS WHERE( ID = OBJECT_ID('TEMPDB.DBO.#MyTmpTbl') AND TYPE = 'U ') ) BEGIN --PRINT 'ローカル一時テーブルを削除しました' DROP TABLE #MyTmpTbl END GO /* ** バッチ間で、データの受け渡しを行なうためのローカル一時テーブルを作成します */ CREATE TABLE #MyTmpTbl ( Param_Name VARCHAR(20) , --データを検索するときの名前 Param_Data VARCHAR(80) --その値(パラメータ) ) GO /* ** バッチ間で受け渡すデータのセット ** みなさんの環境に合わせて、適当に書き換えてください */ --新しく作成するデータベースの名前(MySampleTestDB_20000729) --もしその名前のデータベースが存在したら、それを削除します!! --絶対に存在する名前は、避けてください INSERT INTO #MyTmpTbl VALUES( 'DB_NAME' , 'MySampleTestDB_20000729' ) --MDFファイルの物理的なパス名の定義(データファイル名) INSERT INTO #MyTmpTbl VALUES( 'MDF_FILE' , 'D:\DATA\MySampleTestDB.mdf' ) --LDFファイルの物理的なパス名の定義(トランザクションログファイル名) INSERT INTO #MyTmpTbl VALUES( 'LDF_FILE' , 'D:\DATA\MySampleTestDB.ldf' ) --データベースのバックアップファイル名 INSERT INTO #MyTmpTbl VALUES( 'BAK_FILE' , 'D:\DATA\MySampleTestDB.bak' ) --レコードの確認 --SELECT * FROM #MyTmpTbl GO /* ** 現在実行しているSQLServerのバージョン番号(7または8)を判断する */ IF EXISTS ( SELECT NAME FROM TEMPDB.DBO.SYSOBJECTS WHERE( ID = OBJECT_ID('TEMPDB.DBO.#XP_MSVER') AND TYPE = 'U ') ) BEGIN --PRINT 'ローカル一時テーブルを削除しました' DROP TABLE #XP_MSVER END CREATE TABLE #XP_MSVER ( Idx SMALLINT , Nm VARCHAR(80) , Internal_Value VARCHAR(80) , Character_Value VARCHAR(80) ) --バージョン番号の取得 -- Character_Valueの左側文字が、7または8(SQLServer2000)を判断する INSERT INTO #XP_MSVER EXEC master.dbo.xp_msver 'ProductVersion' DECLARE @VER CHAR(1) SET @VER = LEFT((SELECT Character_Value FROM #XP_MSVER WHERE( Idx = 2 ) ),1) --バージョン番号を登録する INSERT INTO #MyTmpTbl VALUES( 'SQL_VER' , @VER ) GO /* ** データベースを誰か使用しているかどうか判断するストアドプロシージャの登録 */ USE TEMPDB IF ( (OBJECT_ID('#InUse') IS NOT NULL ) AND OBJECTPROPERTY(object_id('#InUse'),'IsProcedure') = 1 ) BEGIN --PRINT '#InUseストアドプロシージャを削除します' DROP PROCEDURE #InUse --削除 END GO CREATE PROCEDURE #InUse @dbname sysname --調査を行なうデータベース AS --sp_whoの結果セットを受け取ります --SQLServer2000では、ecid列が追加されている DECLARE @VER CHAR(1) SET @VER = (SELECT Param_Data FROM #MyTmpTbl WHERE( Param_Name = 'SQL_VER' ) ) --PRINT 'VER=' + @VER IF( @VER = '7' ) BEGIN PRINT 'Now SQLServer 7.x ...' CREATE TABLE #SP_WHO_7( spid smallint , --システム プロセス ID status nchar(30) , --プロセスの状態 loginame nchar(128) , --ログイン名 hostname nchar(128) , --コンピュータ名 blk char(5) , --ブロック中のプロセス dbname nchar(128) , --プロセスで使用されているデータベース cmd nchar(16) --SQL Server コマンド ) --sp_who を実行します INSERT INTO #SP_WHO_7 EXEC SP_WHO --データベースの接続を調べる IF EXISTS ( SELECT dbname FROM #SP_WHO_7 WHERE( dbname = @dbname ) ) BEGIN RETURN 1 --データベースを使用しているユーザがいます END END ELSE BEGIN PRINT 'Now SQLServer 2000 ...' CREATE TABLE #SP_WHO_8( spid smallint , --システム プロセス ID ecid smallint , --SQLServer2000で新規に追加されました status nchar(30) , --プロセスの状態 loginame nchar(128) , --ログイン名 hostname nchar(128) , --コンピュータ名 blk char(5) , --ブロック中のプロセス dbname nchar(128) , --プロセスで使用されているデータベース cmd nchar(16) --SQL Server コマンド ) --sp_who を実行します INSERT INTO #SP_WHO_8 EXEC SP_WHO --データベースの接続を調べる IF EXISTS ( SELECT dbname FROM #SP_WHO_8 WHERE( dbname = @dbname ) ) BEGIN RETURN 1 --データベースを使用しているユーザがいます END END RETURN 0 --誰も使用していません GO /* ** 新しくデータベースを作成します ** 既存のデータベースが存在するときは、それを削除します */ DECLARE @RET INT --バッチ間の受け渡しパラメータの取得 DECLARE @DB_NAME VARCHAR(80) , @MDF_FILE VARCHAR(80) , @LDF_FILE VARCHAR(80) SET @DB_NAME = (SELECT Param_Data FROM #MyTmpTbl WHERE( Param_Name = 'DB_NAME' ) ) IF( @DB_NAME IS NULL ) BEGIN -- OSQLコマンドで実行しているときは、RAISERROR(127番)で終了させることができる RAISERROR('パラメータの検索 DB_NAME に失敗しました',0,127 ) -- このプログラムは、クエリアナライザで実行していますので、STOPレコードを登録 INSERT INTO #MyTmpTbl VALUES( 'STOP' , 'STOP' ) -- バッチの終了 RETURN END ELSE PRINT '作成するデータベースの名前:' + @DB_NAME SET @MDF_FILE = (SELECT Param_Data FROM #MyTmpTbl WHERE( Param_Name = 'MDF_FILE' ) ) PRINT 'MDFファイル名:' + @MDF_FILE SET @LDF_FILE = (SELECT Param_Data FROM #MyTmpTbl WHERE( Param_Name = 'LDF_FILE' ) ) PRINT 'LDFファイル名:' + @LDF_FILE --削除するデータベースを誰か使用していますか? EXEC @RET = #InUse @DB_NAME IF( @RET = 1 ) BEGIN RAISERROR('データベース %s は使用中。中止します',0,127,@DB_NAME ) INSERT INTO #MyTmpTbl VALUES( 'STOP' , 'STOP' ) RETURN END --データベースが存在したら、それを削除する IF EXISTS ( SELECT NAME FROM MASTER.DBO.SYSDATABASES WHERE( NAME = @DB_NAME ) ) BEGIN PRINT 'データベースが存在しますので、それを削除します' EXEC( 'DROP DATABASE ' + @DB_NAME ) END --データベースを新しく作成します DECLARE @CRLF CHAR(2) , @SQL_CMD VARCHAR(512) SET @CRLF = CHAR(13) + CHAR(10) SET @SQL_CMD = 'CREATE DATABASE ' + @DB_NAME + @CRLF + 'ON PRIMARY ' + @CRLF + ' ( ' + @CRLF + ' NAME = '+@DB_NAME+'_DAT' + ',' + @CRLF + ' FILENAME = ''' + @MDF_FILE + '''' + @CRLF + ' ) ' + @CRLF + 'LOG ON ' + @CRLF + ' ( ' + @CRLF + ' NAME = '+@DB_NAME+'_LOG' + ',' + @CRLF + ' FILENAME = ''' + @LDF_FILE + '''' + @CRLF + ' ) ' + @CRLF --PRINT @SQL_CMD EXEC( @SQL_CMD ) -- SQL文を実行する GO /* ** トランザクションログの機能を有効にします ** MSDEの場合、初期状態では、ログの機能が停止となっています */ -- バッチの継続実行ができますか? IF EXISTS ( SELECT Param_Name FROM #MyTmpTbl WHERE( Param_Name = 'STOP' ) ) BEGIN PRINT 'バッチの継続実行はできません' RETURN END --バッチ間の受け渡しパラメータの取得 DECLARE @DB_NAME VARCHAR(80) SET @DB_NAME = (SELECT Param_Data FROM #MyTmpTbl WHERE( Param_Name = 'DB_NAME' ) ) -- SP_DBOPTIONを受け取るローカル一時テーブルの作成 IF EXISTS ( SELECT NAME FROM TEMPDB.DBO.SYSOBJECTS WHERE( ID = OBJECT_ID('TEMPDB.DBO.#GetDBOption') AND TYPE = 'U ') ) BEGIN DROP TABLE #GetDBOption END CREATE TABLE #GetDBOption ( OptionName VARCHAR(35) , CurrentSetting varchar(10) ) -- データベースオプション select into/bulkcopy を調べる DECLARE @VALUE VARCHAR(35) INSERT INTO #GetDBOption EXEC SP_DBOPTION @DB_NAME , 'select into/bulkcopy' SET @VALUE = (SELECT CurrentSetting FROM #GetDBOption WHERE( OptionName = 'select into/bulkcopy' ) ) --PRINT 'select into/bulkcopy の値は [' + @VALUE + ']' --ONのときは、OFFに設定する IF( @VALUE = 'ON' ) BEGIN PRINT '' PRINT 'select into/bulkcopy オプションが設定されていました' PRINT 'このままでは、ログに記録されない操作が許されます' PRINT 'データベースの運用上良くありませんので、禁止にします' EXEC SP_DBOPTION @DB_NAME , 'select into/bulkcopy' , 'FALSE' END -- データベースオプション trunc. log on chkpt. を調べる INSERT INTO #GetDBOption EXEC SP_DBOPTION @DB_NAME , 'trunc. log on chkpt.' SET @VALUE = (SELECT CurrentSetting FROM #GetDBOption WHERE( OptionName = 'trunc. log on chkpt.' ) ) --PRINT 'trunc. log on chkpt. の値は [' + @VALUE + ']' --ONのときは、OFFに設定する IF( @VALUE = 'ON' ) BEGIN PRINT '' PRINT 'trunc. log on chkpt. オプションが設定されていました' PRINT 'このままでは、チェックポイント時にログが切り捨てられます' PRINT 'データベースの運用上良くありませんので、禁止にします' EXEC SP_DBOPTION @DB_NAME , 'trunc. log on chkpt.' , 'FALSE' END GO /* ** データベースに新しいテーブルを作成し、レコードを登録します */ -- バッチの継続実行ができますか? iF EXISTS ( SELECT Param_Name FROM #MyTmpTbl WHERE( Param_Name = 'STOP' ) ) BEGIN PRINT 'バッチの継続実行はできません' RETURN END --バッチ間の受け渡しパラメータの取得 DECLARE @DB_NAME VARCHAR(80) SET @DB_NAME = (SELECT Param_Data FROM #MyTmpTbl WHERE( Param_Name = 'DB_NAME' ) ) -- テーブル作成SQL文の作成 DECLARE @SQL_CMD VARCHAR(512),@CRLF CHAR(2) SET @CRLF = CHAR(13) + CHAR(10) SET @SQL_CMD = 'USE ' + @DB_NAME + @CRLF + ' CREATE TABLE Test1 ( ' + @CRLF + ' ID CHAR(4) PRIMARY KEY , ' + @CRLF + ' DT CHAR(10) ' + @CRLF + ' )' --PRINT @SQL_CMD EXEC( @SQL_CMD ) --レコードの登録 SET @SQL_CMD = 'INSERT INTO ' + @DB_NAME + '.DBO.Test1 VALUES( ''0001'' , ''AAAAA'' ) ' EXEC( @SQL_CMD ) SET @SQL_CMD = 'INSERT INTO ' + @DB_NAME + '.DBO.Test1 VALUES( ''0002'' , ''BBBBB'' ) ' EXEC( @SQL_CMD ) SET @SQL_CMD = 'INSERT INTO ' + @DB_NAME + '.DBO.Test1 VALUES( ''0003'' , ''CCCCC'' ) ' EXEC( @SQL_CMD ) SET @SQL_CMD = 'INSERT INTO ' + @DB_NAME + '.DBO.Test1 VALUES( ''0004'' , ''DDDDD'' ) ' EXEC( @SQL_CMD ) --登録したレコードの表示 --SET @SQL_CMD = 'SELECT * FROM ' + @DB_NAME + '.DBO.Test1 ' --EXEC( @SQL_CMD ) GO /* ** データベースの完全バックアップを実行します ** このバックアップには、上記テーブルの内容が保存されます */ -- バッチの継続実行ができますか? IF EXISTS ( SELECT Param_Name FROM #MyTmpTbl WHERE( Param_Name = 'STOP' ) ) BEGIN PRINT 'バッチの継続実行はできません' RETURN END --バッチ間の受け渡しパラメータの取得 DECLARE @DB_NAME VARCHAR(80),@BK_FILE VARCHAR(80) SET @DB_NAME = (SELECT Param_Data FROM #MyTmpTbl WHERE( Param_Name = 'DB_NAME' ) ) SET @BK_FILE = (SELECT Param_Data FROM #MyTmpTbl WHERE( Param_Name = 'BAK_FILE' ) ) --完全バックアップの実施 PRINT '' BACKUP DATABASE @DB_NAME TO DISK = @BK_FILE WITH INIT GO /* ** バックアップには含まれない新しいテーブルを作成する */ -- バッチの継続実行ができますか? IF EXISTS ( SELECT Param_Name FROM #MyTmpTbl WHERE( Param_Name = 'STOP' ) ) BEGIN PRINT 'バッチの継続実行はできません' RETURN END --バッチ間の受け渡しパラメータの取得 DECLARE @DB_NAME VARCHAR(80) SET @DB_NAME = (SELECT Param_Data FROM #MyTmpTbl WHERE( Param_Name = 'DB_NAME' ) ) -- テーブル作成SQL文の作成 DECLARE @SQL_CMD VARCHAR(512),@CRLF CHAR(2) SET @CRLF = CHAR(13) + CHAR(10) SET @SQL_CMD = 'USE ' + @DB_NAME + @CRLF + ' CREATE TABLE Test2 ( ' + @CRLF + ' ID2 CHAR(4) PRIMARY KEY , ' + @CRLF + ' DT2 CHAR(10) ' + @CRLF + ' )' --PRINT @SQL_CMD EXEC( @SQL_CMD ) --レコードの登録 SET @SQL_CMD = 'INSERT INTO ' + @DB_NAME + '.DBO.Test2 VALUES( ''AAAA'' , ''11111'' ) ' EXEC( @SQL_CMD ) SET @SQL_CMD = 'INSERT INTO ' + @DB_NAME + '.DBO.Test2 VALUES( ''BBBB'' , ''22222'' ) ' EXEC( @SQL_CMD ) SET @SQL_CMD = 'INSERT INTO ' + @DB_NAME + '.DBO.Test2 VALUES( ''CCCC'' , ''33333'' ) ' EXEC( @SQL_CMD ) SET @SQL_CMD = 'INSERT INTO ' + @DB_NAME + '.DBO.Test2 VALUES( ''DDDD'' , ''44444'' ) ' EXEC( @SQL_CMD ) --登録したレコードの表示 --SET @SQL_CMD = 'SELECT * FROM ' + @DB_NAME + '.DBO.Test2 ' --EXEC( @SQL_CMD ) GO PRINT '' PRINT 'プログラムの終了です' GO