| MSDE FunClub |
|
最終更新日 : 2000/10/06 |
|
Microsoft Data Engine FunClub
|
Since 2000.10.06
|
|
SQLServer7.0/MSDE 完全トレーニングテキスト(下巻) |
|
【第17章274p 〜 276p掲載】 |
-- [SQL17_04.SQL]
-- SQLServer7.0 Transact-SQL言語
-- 日本技術ソフト開発 堀川 明
-- http://www.horikawa.ne.jp/msde/
--
-- このSQLプログラムは、
-- データベースの完全バックアップとその復旧を行います
-- バックアップ用メディアにDISKファイルを使います
--
-- [注意]
-- このプログラムの実行は db_owner または db_backupoperator
-- の権限が必要です
--
-- ( 件処理されました)のメッセージの表示を抑止します
SET NOCOUNT ON
GO
--******************************************************
-- 指定されたデータベースに接続があるかどうか確認する
-- 接続中は、データベースの復旧はできません
-- このストアドプロシージャは、後の例題でも使うのでmaster
-- に入れます
--******************************************************
USE master
GO
IF ( (object_id('master..InUse') IS NOT NULL ) AND
OBJECTPROPERTY(object_id('master..InUse'),'IsProcedure') = 1 )
BEGIN
DROP PROCEDURE InUse --削除
END
GO
CREATE PROCEDURE InUse
@dbname sysname --調査を行なうデータベース
AS
--sp_whoの結果セットを受け取ります
CREATE TABLE #SP_WHO(
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 EXEC sp_who
--データベースの接続を調べる
IF EXISTS ( SELECT dbname FROM #SP_WHO WHERE( dbname = @dbname ) )
BEGIN
RETURN 1 --データベースを使用しているユーザがいます
END
RETURN 0 --誰も使用していません
GO
--*******************************
-- 【スクリプト開始】
--*******************************
DECLARE @mode int
DECLARE @ret int
DECLARE @dbname varchar(20)
DECLARE @bkfname varchar(80)
PRINT ''
-- バックアップのときは=0 復旧のときは=1 です
SELECT @mode = 0
-- バックアップ/復旧を行うデータベースの名前
SELECT @dbname = 'MySampleTest'
-- 書き込み先/読み込み先のDISKのファイル名
SELECT @bkfname = 'D:\backup7\MySampleTest.DAT'
IF( @mode = 0 )
BEGIN
--*********************************
-- 【完全バックアップの実行】
-- DISKファイルに対して保存する
--*********************************
BACKUP DATABASE @dbname --バックアップDBの名前
TO DISK = @bkfname --保存先ファイル名
END
IF( @mode = 1 )
BEGIN
--*********************************
-- 【復旧操作】
--*********************************
--データベースが使用中のときは復元できません
EXEC @ret = InUse @dbname
IF( @ret = 1 )
BEGIN
RAISERROR('%s は現在使用中です。RESTORE命令は中止しました',0,127,@dbname)
RETURN
END
--バックアップメディアの内容確認
RESTORE HEADERONLY
FROM DISK = @bkfname --保存先ファイル名
--復元操作
--FILE番号は、同一メディア内の復元対象の元データ位置を表す
RESTORE DATABASE @dbname --復元したDBの名前
FROM DISK = @bkfname --保存先ファイル名
WITH
FILE = 1 --復元対象のバックアップセット番号
, REPLACE --同じ名前のDBがあれば、既存を削除
END
GO