MSDE FunClub
Microsoft Data Engine FunClub
現在までのアクセスカウント数
Since 2006.04.08
最終更新日:2006/6/15
 
 [MSDE FunClub TOP]  > [MSDE 技術サポート情報]   > [MSDE/SQLServer FAQ]
 
【 MSDE/SQLServer FAQ 】
 
 
 
SQLServer2005時代でも
開発の基本は T-SQL
上巻で T-SQL の基礎作り
 
SQLServer2005時代でも
運用の基本はバックアップ
下巻でバックアップ手法を学びましょう
PASSJ人気コンテンツで学んだ後は下巻でさらなる学習を!
 
SQLServer必携の書
ご購入をお願いします
 

 
MSN サーチ
 
Yahoo! JAPAN
 
 
MSDE FunClub
メニュー
■ MSDE 2000
技術情報一覧に
戻る
■ MSDE 2000
初心者向け
メーリングリスト
ご案内
■ MSDE 2000
技術者向け
メーリングリスト
ご案内
■ MSDE FunClub
HOME へ戻る
 
 
マイクロソフト
関連ページ
■ 文書番号:196041
Outlook2000 のセットアップの種類を確認する方法
■ 文書番号:257824
Outlook と Outlook Express の相違点
■ 文書番号:195500
Outlook 2000 を企業/ワークグループ オプションでインストールした場合のインターネット電子メール インフォメーション サービスの構成方法
■ 文書番号:195507
Outlook 2000 でインストールの種類を変更する方法
■ 文書番号:195922
送信トレイにメールが残る場合のトラブルシューティング方法
■ 文書番号:230076
Outlook 2000 には、 Outlook Express が必要です
■ 文書番号:263297
Outlook 2000 電子メール セキュリティ アップデートの管理者向け情報
■ 文書番号:262631
Outlook 2000 電子メール セキュリティ更新プログラムに関する情報
■ 文書番号:262701
Outlook 2000 電子メール セキュリティ アップデートの開発者向け情報
■ 文書番号:262634
Outlook 電子メール セキュリティ アップデートに関する既知の問題
■ 文書番号:290499
Outlook2002 電子メールのセキュリティ機能に関する管理者向け情報
■ 文書番号:186063
VB または VBA のオートメーション エラー (Long 型) の取得方法
■ Outlook 2000 サポートページ
 
■ 文書番号:263556
SQL Mail の設定方法
■ 文書番号:311231
SQL Mail に関してよく寄せられる質問
■ 文書番号:315886
SQL Mail の一般的な問題
■ 文書番号:312839
SQL Server で SQL Mail を使用せずに電子メールを送信する方法
■ 文書番号:153159
SQLMail と Exchange Server トラブルシューティング
■ 文書番号:292761
xp_startmail のエラーで問題の詳細が表示されない
■ 文書番号:281293
SQL Mail 2000 は Microsoft Outlook 2000 クライアントを必要とする
 
MSDE/SQLServer FAQ
様々な質問にお答えします
 
質問番号 作成日
更新日
質問内容
FAQ-00480 2006/06/15 Outlook2000の単独パッケージ製品が購入できません。Outlook2000を入手する方法はありませんか?
FAQ-00470 2006/05/15 Outlook2002(Office-XP製品)を使っています。SQL Mailからの送信メールが受信トレイに残ります。
FAQ-00460 2006/05/15
2006/05/16
SQL Mail や SQLAgent Mailでは、どのOutlookのバージョンを使うべきですか?
FAQ-00450 2006/05/15 私は、MSDE 2000 を使っています。
xp_startmail がエラーになります。何が悪いのでしょうか?
FAQ-00440 2006/05/15 警告の作成(2):データベースのログの切捨て時に電子メールを通知する方法
FAQ-00430 2006/05/15 警告を発生させましたが、担当者に電子メールが入りません。何が悪いのでしょうか?
FAQ-00420 2006/05/15 警告の通知先の定義
FAQ-00410 2006/05/15 警告の作成(1):RAISERROR命令の重大度レベルn番を一律に警告として扱う方法を教えて下さい。
FAQ-00400 2006/05/15 SQLAgent Mailで使用する、メール送信先のオペレータの登録方法を教えて下さい
FAQ-00390 2006/05/15 SQLAgent Mailで使用する、プロファイルの登録方法を教えて下さい
FAQ-00380 2006/05/15 SQL Mailによる、メールの送信が、異常に時間が掛かります。何が悪いのでしょうか?
FAQ-00370 2006/05/15 SQL Mailによる、メールの送信
FAQ-00360 2006/05/15 SQL Mailのプロファイルの動作確認テスト
FAQ-00350 2006/05/15 プロファイルの動作確認テスト
FAQ-00340 2006/05/15 SQL Mailの基本設定(2) プロファイル名の登録
FAQ-00330 2006/05/15 SQL Mailの基本設定
FAQ-00320 2006/05/15 SQLServer Agentのサービス開始アカウントの変更
FAQ-00310 2006/05/15 データベースサービス開始アカウントの変更
FAQ-00300 2006/05/15 Outlook2000のインストールの流れを簡単に説明して下さい
FAQ-00290 2006/05/15 マイクロソフトのExchangeサーバーは導入していません。
どのOutlookをインストールすればよいですか?
FAQ-00280 2006/05/15 拡張MAPI接続に対応した電子メールクライアントソフトには、何がありますか?
FAQ-00270 2006/05/15 SQLAgent Mail 機能が、とても便利だと感じる場面を教えて下さい
FAQ-00260 2006/05/15 SQLAgent Mail とは、どのような機能ですか?
FAQ-00250 2006/05/15 SQL Mail とは、どのような機能ですか?
FAQ-00240 2006/05/15 SQLServer 2000 のデータベースサーバーの中から、電子メールを送信する方法はありませんか?
FAQ-00230 2006/04/14 データベースサーバーのバージョンを確認する方法を教えて下さい
FAQ-00220 2006/04/14 エラーログファイルの内容を、SQL文から簡単に取得する命令を教えて下さい
FAQ-00210 2006/04/14 エラーログファイルのファイルサイズなどの情報を取得する命令を教えて下さい
FAQ-00200 2006/04/14 エラーログファイルの保存個数を標準値に戻す、一番簡単な命令を教えて下さい
FAQ-00190 2006/04/14 エラーログファイルの保存個数を増やす、一番簡単な命令を教えて下さい
FAQ-00180 2006/04/14 エラーログファイルの保存個数を増やす方法を教えて下さい
FAQ-00170 2006/04/14 データベースサービスを開始している最中に、エラーログファイルを更新する方法を教えて下さい
FAQ-00160 2006/04/12 データベースサーバーのエラーログファイルを常時データベースで管理したいと思います。どうすればよいでしょうか?
FAQ-00150 2006/04/12 私は、ActivePerl をインストールしています。
Perl言語で記述されたtailコマンドはありませんか?
FAQ-00140 2006/04/11 エラーログファイルの内容を、常時画面に表示する方法を教えて下さい
FAQ-00130 2006/04/11 私は、MSDE2000 ユーザです。
MSDE2000 の「エラーログファイル」の内容を見る方法を教えて下さい
FAQ-00120 2006/04/11 私は、MSDE2000 ユーザです。
MSDE2000 の「エラーログファイル」は、どこに作成されますか?
FAQ-00110 2006/04/11 データベースサーバーの、「エラーログファイル」とは、何ですか?
FAQ-00100 2006/04/10 db_owner データベースロールに所属しているユーザを削除する命令
FAQ-00090 2006/04/10 db_owner データベースロールに所属しているユーザを表示する命令
FAQ-00080 2006/04/10 db_owner データベースロールに、ユーザを登録する命令
FAQ-00070 2006/04/10 db_owner データベースロールは、どのような場面で使いますか?
FAQ-00060 2006/04/08 dbo ユーザとは、誰のことですか?
FAQ-00050 2006/04/08 テーブルのレコードの表示と新規挿入の許可を与えたいです。どのような命令を実行すればよいですか?
FAQ-00040 2006/04/08 DELETE命令で、レコードの削除ができません
FAQ-00030 2006/04/08 UPDATE命令で、レコードの更新ができません
FAQ-00020 2006/04/08 INSERT命令で、レコードの挿入ができません
FAQ-00010 2006/04/08 SELECT命令で、レコードの表示ができません
 
 
[FAQ-00480:SQL Mail,SQLAgent Mail,メール]
Outlook2000の単独製品パッケージを購入することができませんでした。他にどのような方法で、手に入れることができますか?
↑戻る    ↑先頭へ
Outlook 2000 が含まれている『Office 2000 パッケージ製品』を探す方法があります。
その中で一番探しやすい製品は、「Office 2000 Personal」です。

このOffice 2000 Personalは、メーカー製Windows98やMEマシンにプレインストールされ出荷されていたものを外販パッケージ売りされたものです(マイクロソフト、『Office 2000 Personal』をパッケージ化して店頭で発売)。

この製品パッケージを中古ショップやオークションで探すよりも、むしろ、その当時に膨大に出荷されていたプリインストールパソコンに付属していたOffice 2000 PerosonalのCD-ROMを探す方が容易です。

中古ショップでその当時のデスクトップパソコンやノートパソコンを調べ、付属品が揃っていたら、そのパソコンを購入し、Outlook2000を入手しましょう。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00470:SQL Mail,SQLAgent Mail,メール]
Outlook2002をインターネットメールで使っています。SQL Mailからの送信依頼メールが受信トレイに残って送信されません。何が悪いのでしょうか?
↑戻る    ↑先頭へ
マイクロソフトサポート文書番号315886のQ5で説明されている現象です。

Outlook2002とExchangeサーバーとの組み合わせであれば送信できますが、通常のインターネットメール(SMTP)では、この問題を解決することができないようです。

Outlook2000にして下さい。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00460:SQL Mail,SQLAgent Mail,メール]
SQL Mail や SQL Agent Mail では、どのOutlookのバージョンを使うと良いですか?
↑戻る    ↑先頭へ
Outlook2000を使います。

WindowsXPPro版(SP2)+MSDE2000 Release-A+sqlmap70.dllコピー+Outlook2000の組み合わせで、試験しました。

質問番号00410,00440の電子メール送信機能が正しく働くかどうか調べました。

WindowsXPはログインしない状態で、データベースサービスとAgentサービスだけを、デーモン形式で動かしています。

その結果、サービスパックを適用しても、正しく通知されました。

Outlook2000 製品版インストール直後Outlook2000のバージョン番号
9.0.02814
Office-2000 SR-1適用9.0.0.3821
Office-2000 SP-2適用9.0.0.4527
SP-2の適用後から、セキュリティアップデート版と表示されます
Office-2000 SP-3適用9.0.0.6627
その他のセキュリティパッチ適用後9.0.0.6627
上記の組み合わせすべてで、動作確認ができました。
警告発生時に、電子メールが送信されました。
但し、MSDE2000では、SQL Mail機能は使えないことになっています。

【注意(2006.5.16追記)】
WindowsXP Pro版のライセンス使用許諾書(eula.txt)では、WindowsXPに対してネットワーク外部から 接続を行なうソフトウェアに制限があり、データベースサービスはその制限に該当します。 ここでは試験目的ではありますが、ライセンス違反を犯していることをお詫び致します。

↑戻る    ↑先頭へ
 
 
 
[Q-00450:SQL Mail,拡張ストアドプロシージャ]
私は、MSDE 2000 を使っています。
SQL Mail を使いたいと思いました。
そこで、SQL Mail クライアントシステムを初期化する、xp_startmail 拡張ストアドプロシージャ
を実行したら、エラーメッセージが表示されました。
何が悪いのでしょうか?
↑戻る    ↑先頭へ
MSDE 2000 ユーザの方が、SQLServer 2000 のBooks Online の解説に従って、xp_startmail 拡張
ストアドプロシージャを実行すると、次のようなエラーが発生します。
DLL sqlmap70.dll がロードできないか、参照している DLL の 1 つがロードできません。
理由 : 126(指定されたモジュールが見つかりません。)。
確認してみます。

拡張ストアドプロシージャが、どのDLLファイルを使用するのか調べる命令があります。

Exec sp_helpextendedproc 'xp_startmail'
sp_helpextendedproc ストアドプロシージャを実行すると、拡張ストアドプロシージャが定義されたDLLファイル名が出力されます。

xp_startmail 拡張ストアドプロシージャは、sqlmap70.dll ファイルによって提供されていることがわかります。

sqlmap70.dll ファイルは、SQLServer 2000 では、

C:\Program Files\Microsoft SQL Server\MSSQL\Binn\sqlmap70.dll

に、インストールされています。

ところが、MSDE 2000 では、このファイルは、存在しません。
DLLファイルが存在しないので、そのDLLファイルを読み込むことは当然できません。

ですから、xp_startmail 拡張ストアドプロシージャは実行できないわけです。

ここで疑問が浮かびます。

sp_helpextendedprocストアドプロシージャは、データベースシステムに登録された拡張ストアドプロシージャのDLLファイルを報告する命令です。
この命令を実行すると、xp_startmail 拡張ストアドプロシージャは、MSDE2000のシステムに正式に登録されていると報告をします。
それなのに、DLLファイルが存在しないとは?

マイクロソフトのサポート情報311231番の Q15 を見ると、

SQL Mail  は MSDE ではサポートされていません

と書かれています。

サポートされていないのではなく、単なるDLLファイルが提供されていないのでは?と考えたくなります。

もし「サポートされていない」が事実であれば、sp_helpextendedprocによる調査で、「存在しません」と判定されると思います。

試しに、SQL Server 2000用のsqlmap70.dllファイルを MSDE 2000 にコピーしてみました。

そして、私は、MSDE2000を使って、質問番号240番から440番までのSQL MailやSQLServer Agent Mailの機能について解説記事を書きました。

この解説記事をMSDE2000を使って書きましたが、今のところ、障害のような事態は起きておりません。DLLファイルがあれば、MSDE2000でも、SQL Mail機能が使えるように思えますが、何か障害が出るのでしょうか?

DLLファイルをMSDE2000ユーザに提供して下されば、SQL MailやSQLAgent Mail機能が使えるようになると私は思います。

私は、MSDE2000に適用しているサービスパック番号と同じ番号の、SQLServer 2000のサービスパックの中から、DLLファイルを取り出してきました。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00440:SQL Mail,SQLAgent Mail,メール]
警告の作成(2):データベースのログの切捨てを実行したときに、電子メールを通知する方法を教えて下さい
↑戻る    ↑先頭へ
データベースのログを切り捨てる命令は、

C:\>osql -S サーバー名 -U sa -P sa_password
1> BACKUP LOG データベース名 WITH TRUNCATE_ONLY
2> GO
1> QUIT

C:\>
上記の命令を実行すると、メッセージID番号18278の内容が書かれます(この番号は将来変更されるかもしれません)

SELECT * FROM master.dbo.sysmessages where error=18278 で検索できます

エラーメッセージ番号18278番の警告を作成し、オペレータとの関連付けを行ないます

C:\>osql -S サーバー名 -U sa -P sa_password
1> exec msdb.dbo.sp_add_alert 'ログ切捨て警告',18278,0,1
2> exec msdb.dbo.sp_add_notification 'ログ切捨て警告','堀川明',1
3> go
1> quit
ログが切り捨てられたときに通知される電子メール
↑戻る    ↑先頭へ
 
 
 
[FAQ-00430:SQL Mail,SQLAgent Mail,メール]
警告を発生させました。しかし電子メールの通知が入りません。どこが悪いのでしょうか?
↑戻る    ↑先頭へ
一般的な警告の発生方法は、RAISERROR命令を使います。
重大度レベル1番が発生すると、電子メールが送信されるようにしました。
C:\>osql -S サーバー名 -U sa -P sa_password
1> RAISERROR( '電子メールが送信されますか?' , 1 , 1 )
2> go
電子メールが送信されますか?
1> quit
C:\>
上記の方法を実行しても、実は、電子メールは送信することはできません。

SQLServer Agentが、警告を検出して電子メールを送信する仕組みは、SQLServerの中で実行されるSQL文の実行を監視するのではなく、SQLServerがSQL文の実行結果などをエラーログファイルに書き込みます。このエラーログファイルに書き込まれた内容をSQLServer Agentが監視します。

ですから、警告やオペレーターを正しく定義しても、その肝心の警告で発生された内容がエラーログファイルに書き込まれなければいけません。

RAISERROR命令では、With Logオプションを付けて実行すると、エラーログファイルにも、その内容が書かれます。

C:\>osql -S サーバー名 -U sa -P sa_password
1> RAISERROR( '電子メールが送信されますか?' , 1 , 1 ) WITH LOG
2> go
電子メールが送信されますか?
1> quit

C:\>
With log オプションを付けてRAISERROR命令を実行すれば、警告検知の電子メールが通知されます。

警告発生によって通知された電子メールです
↑戻る    ↑先頭へ
 
 
 
[FAQ-00420:SQL Mail,SQLAgent Mail,メール]
警告が発生したら、電子メールを送信したいと思います。警告と、オペレーターの関係はどのようになりますか?
↑戻る    ↑先頭へ
あらかじめ、送信先の電子メールアドレスを登録します。これが、オペレータの登録です(sp_add_operator)。

次に、通知の原因となる警告を作成します(sp_add_alert)。

最後に必要となる操作は、警告とオペレータの関係の登録です。警告が発生したら誰に電子メールを送信するかの登録です。

この作業は、sp_add_notificationストアドプロシージャで行ないます。

exec msdb.dbo.sp_add_notification '警告名','オペレータ名',通知手段番号(電子メールは1です)

C:\>osql -S サーバー名 -U sa -P sa_password
1> exec msdb.dbo.sp_add_notification
2>        '警告名称:重大度番号1番' ,
3>        'オペレータの名前',
4>         1
5> go
1> quit

C:\>
↑戻る    ↑先頭へ
 
 
 
[FAQ-00410:SQL Mail,SQLAgent Mail,メール]
警告の作成(1):重大度レベルn番を一律に警告として登録する方法を教えて下さい。
↑戻る    ↑先頭へ
RAISERROR命令の、重大度レベルの数字(1から25まで)で、ある番号のメッセージが発生したら、自動的に担当者に電子メールを通知したい場合があります。
そのような場合、あらかじめ、SQLServer Agentに対して、重大度レベル番号n番を監視して欲しいという登録作業が必要です。

その登録方法が、「警告の作成」と呼ばれます。

例えば、重大度レベル1番の番号を、警告として登録するときは、次のような命令を実行します。

exec msdb.dbo.sp_add_alert
       @name = '警告名称:重大度番号1番' , 
       @message_id =  0,
       @severity   =  1,  --この番号に、重大度レベルの数字を指定する
       @enabled    =  1
警告を削除するときは、sp_delete_alertです。

sp_add_alertやsp_delete_alertは、Books onlineに掲載されたストアドプロシージャです。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00400:SQL Mail,SQLAgent Mail,メール]
SQLAgent Mail で使用する、メール送信先オペレーターの登録方法を教えて下さい。
↑戻る    ↑先頭へ
ストアドプロシージャsp_add_operatorを使って、オペレータの登録を行ないます。
また、オペレータの削除は、sp_delete_operatorです。
これらのストアドプロシージャは、msdbデータベースに登録されたものです。その実行では、msdbのデータベース名のプレフィックスが必要です。
これらのストアドプロシージャの使い方は、Books Onlineのマニュアルに掲載されています。

C:\>osql -S 接続先サーバー名 -U sa -P sa_password
1> exec msdb.dbo.sp_add_operator
2>        @name = 'オペレータの名前' ,
3>        @enabled = 1 ,
4>        @email_address = 'オペレータのメールアドレス'
5> go
1> quit

C:\>
↑戻る    ↑先頭へ
 
 
 
[FAQ-00390:SQL Mail,SQLAgent Mail,メール]
SQLAgent Mail で使用する、プロファイルの登録方法を教えて下さい。
↑戻る    ↑先頭へ
次のsp_set_sqlagent_propertiesシステムストアドプロシージャを実行します。

このプロシージャは、msdbデータベースに収録され、そのSQL文の処理の内容を見ることができます。

EXEC msdb.dbo.sp_set_sqlagent_properties @email_profile='プロファイルの名前'

C:\>osql -S 接続先サーバー名 -U sa -P sa_password
1> exec msdb.dbo.sp_set_sqlagent_properties
2>     @email_profile='MS Exchange の設定'
3> go
(0 件処理されました)
(0 件処理されました)
1> quit

C:\>
↑戻る    ↑先頭へ
 
 
 
[FAQ-00380:SQL Mail,SQLAgent Mail,メール]
SQL Mailによるメール送信が、異常に遅くなります。何が悪いのでしょうか?
↑戻る    ↑先頭へ
OUTLOOK2000のプロファイルに登録した、受信用メールサーバーのアドレスや受信用メールボックスのアカウントは、正しいアカウントになっているでしょうか?

メール送信を行なう前に、OUTLOOKがメールを受信する動作が行なわれます。

このため、正しいアカウントを登録しないと、タイムアウトなどが発生するまで、待機させられます。

受信用アカウントが間違っていると、メール送信でもトラブルが発生します Outlook2000の受信用アカウントのパスワードを、わざと間違ったものを登録しました。メール送信が完了するまで、5分8秒も掛かりました。

受信用アカウントが正しいとき Outlook2000の受信用アカウントのパスワードを、正しいものを登録しました。メール送信が完了するまで、わずか3秒でした。

SQL Server 2000 で、メール受信処理をする予定が無くても、アカウントは正しいものを登録しましょう。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00370:SQL Mail,SQLAgent Mail,メール]
SQL Mail によるメール送信方法を教えて下さい。
↑戻る    ↑先頭へ
SQL Mail による、メール送信は、xp_sendmailストアドプロシージャを使います。

次のような命令を実行して、メールが送信されるか確認して下さい。

 exec master.dbo.xp_startmail

 exec master.dbo.xp_sendmail
     @recipients = 'ここに、送信先メールアドレスを書いて下さい' ,
        @message = 'データベースサービスからメールを送信します' ,
        @subject = 'こちらは SQL Mail です'

 exec master.dbo.xp_stopmail
C:\>osql -S 接続先サーバー名 -U sa -P sa_password
1> exec master.dbo.xp_startmail
2> exec master.dbo.xp_sendmail
3>     @recipients = 'ここに、送信先メールアドレスを書いて下さい' ,
4>     @message = 'データベースサービスからメールを送信します' ,
5>     @subject = 'こちらは SQL Mail です'
6> exec master.dbo.xp_stopmail
7> go
SQL Mail セッションが開始されました。
メールを送信しました。
SQL Mail セッションを停止しました。
1> quit

C:\>
SQL Server 2000 が動作しているコンピュータは、ログインしない状態で、サービスを開始しておきます。

その状態でクライアントコンピュータから接続して、上記のSQL文を実行して、電子メールが送信できるかどうか確認して下さい。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00360:SQL Mail,SQLAgent Mail,メール]
SQL Mail が使用する、既定のプロファイルの動作確認テストを行ないます。
↑戻る    ↑先頭へ
レジストリキーに登録した、プロファイルが正しく動くかどうか、次の命令で確認をして下さい。

C:\>osql -S 接続先サーバー名 -U sa -P sa_password
1> exec master.dbo.xp_startmail
2> exec master.dbo.xp_stopmail
3> go
SQL Mail セッションが開始されました。
SQL Mail セッションを停止しました。
1> quit
C:\>
SQL Mail システムを初期化するxp_startmailストアドプロシージャと、システムを終了するxp_stopmailストアドプロシージャを実行します。

この2つの命令が、上記のように、何もエラーメッセージを表示しないときは、レジストリに登録されたプロファイルが正しいことがわかります。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00350:SQL Mail,SQLAgent Mail,メール]
プロファイルの動作を確認する方法は、ありませんか?
↑戻る    ↑先頭へ
SQL Server 2000 上にインストールされたOutlook2000のプロファイルが正しく利用できるかどうか、確認する命令があります。

exec master.dbo.xp_test_mapi_profile  'プロファイルの名前'

exec master.dbo.xp_test_mapi_profile 'MS Exchange の設定'

このストアドプロシージャを実行して、エラーが表示されなければ、プロファイルは正しいことがわかります。

C:\>osql -S 接続先サーバー名 -U sa -P sa_password
1> exec master.dbo.xp_test_mapi_profile 'MS Exchange の設定'
2> go
1> quit

C:\>
この例では、何もエラーが表示されませんでした(プロファイルは正しいことがわかります)。
↑戻る    ↑先頭へ
 
 
 
[FAQ-00340:SQL Mail,SQLAgent Mail,メール]
SQL Mailの基本設定(2) プロファイル名の登録
↑戻る    ↑先頭へ
SQL Mail で使用するプロファイルの名前「MS Exchange の設定」を、SQL Server 2000 側のシステムに登録を行ないます。

SQL Server 2000 で使用する次のレジストリに登録を行ないます。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer

上記レジストリの中に、MailAccountNameキーを作成し、プロファイルの名前を登録します。

なお、次のストアドプロシージャを実行すれば、「MS Exchange の設定」が登録されますので、この方法をおすすめします。

C:\>osql -S サーバー名 -U sa -P sa_password
1> exec master.dbo.xp_instance_regwrite
2> 'HKEY_LOCAL_MACHINE' ,
3> 'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer',
4>  'MailAccountName' ,  'REG_SZ' ,  'MS Exchange の設定'
5> go
(0 件処理されました)
1>
(0 件処理されました)という表示が出ても、正しくレジストリキーが作成され、プロファイル名が登録されます。

exec master.dbo.xp_instance_regwrite 
           'HKEY_LOCAL_MACHINE' ,  
           'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer', 
           'MailAccountName' ,  'REG_SZ' ,  'Outlook2000で作成されたプロファイルの名前'
この命令を実行して、プロファイル名を登録します。

なお、レジストリにキーを登録したら、次の命令でその確認ができます。

exec master.dbo.xp_instance_regread 
           'HKEY_LOCAL_MACHINE', 
           'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer', 
           'MailAccountName'
正しいプロファイルの名前が登録されたことを確認します。
↑戻る    ↑先頭へ
 
 
 
[FAQ-00330:SQL Mail,SQLAgent Mail,メール]
SQL Mail の基本設定は、どのように行ないますか?
↑戻る    ↑先頭へ
SQL Mail の基本設定は、Outlook側で作成された「プロファイル」の名前を、SQL Mail 側で登録する作業になります。

このプロファイルとは、電子メールの送受信設定などが定義されたファイルと考えて下さい。

現在ログインしているユーザが使用するプロファイルの名前を調べる方法はいくつかありますが、一番簡単な方法は、レジストリを見るのがよいでしょう。

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles

このレジストリを見ます。

Outlookで作成されたプロファイルの名前を調べる

この例では、2つのプロファイルが登録されているのがわかります。1つ目の名前は、Outlook です。2つ目の名前は、SQL Mail です(注意:自分で明示的にSQL Mailという名前を作成したのであり、SQL Server 2000 がこのような名前を作成したわけではありません)。

またこのユーザのデフォルトプロファイルは、Outlookになっていることがわかります。

Outlook2000 を、企業ワークグループモードでインストールした場合、プロファイルの名前の初期値は、「MS Exchange の設定」となっていると思います。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00320:SQL Mail,SQLAgent Mail,メール]
SQLServer Agentサービスの、サービスの開始アカウントも変更します。
↑戻る    ↑先頭へ
データベースサービスのサービス開始アカウントを、ローカルシステムから、明示的なAdministrator権限を所持するユーザに変更したのと同様に、SQLServer Agentサービスのサービス開始アカウントも変更します。

Enterprise Managerを使って、サービス開始アカウントの変更を行ないます。

SQLServer Agentプロパティを表示します SQLServer Agentプロパティを表示して、サービスの開始アカウントを、システムアカウントから特定のアカウントに変更を行ないます。
Administrator権限を所持するユーザAさんに変更を行ないます。このユーザAさんによって、Outlook2000のセットアップが行なわれます。
デフォルトのローカルシステムアカウントから、変更を行ないます デフォルトのローカルシステムアカウントから、Administrator権限を所持するユーザAさんに、サービスの開始アカウントを変更します。
Administrator権限を所持するユーザAさんに、アカウントを変更します Administrator権限を所持するユーザAさんに、アカウントを変更します。
「コンピュータ名\ユーザ名」で、アカウントを入力します。
以上によって、SQLServer Agentの、サービス開始アカウントが変更されました。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00310:SQL Mail,SQLAgent Mail,メール]
データベースサービスの開始アカウントは、どのようになっていますか?
ローカルシステムアカントの場合は、Outlook 2000 を設定した明示的なユーザアカウントに変更します
↑戻る    ↑先頭へ
Outlook2000を使うときは、ユーザプロファイルの設定情報が読み込まれます。具体的には、HKEY_CURRENT_USERのレジストリツリーです。

ところが、ローカルシステムアカウントの特別なユーザの場合、このHKEY_CURRENT_USERのレジストリは存在しないことになっています。

データベースサーバーをログインしない状態で動かしているときに、メールを送信する場合は、Outlook2000で設定されたユーザ情報を、参照することができません。

そこで、データベースサーバーのサービス開始アカウントを明示的なユーザ名に変更をします。そしてこのユーザによって、Outlook2000のメール送信設定を行なって下さい。

具体的な操作としては、データベースサービスの開始アカウントを、ローカルシステムから、Administrators管理者グループに所属するユーザAさんに、変更を行ないます。そして、ユーザAさんがWindowsにログインして、ユーザAさんのOutlook2000のセットアップを行ないます。Outlook2000のインストールは、ユーザAさんで行ないます(ユーザAさんは、Administratorの名前でもよいです)

データベースサービスの開始アカウントの変更操作は、マイクロソフトサポート文書番号:283811でも解説しているように、Enterprise Managerを使わないと非常に難しい操作となります。そこでここでは、Enterprise Managerを使って操作を行ないます。

SQL Server 2000がインストールされた同じコンピュータ上にあるEnterprise ManagerをAdministrator権限のある人が立ち上げて、アカウントの変更操作を行ないます。

別のクライアントコンピュータにインストールされたEnterprise Managerを使う場合は、セキュリティ上のトラブルが発生することがあります。サービスのアカウント変更操作は、サービスがインストールされたコンピュータ上で操作を行ないましょう。

インストールした直後は、サービスの開始アカウントは、システムになっている SQL Server 2000 の、データベースサービスの開始アカウントが、システムになっています。これを変更します。
ローカルシステムアカウントから、変更を行ないます インストール直後は、ローカルシステムアカウントになっている。このアカウントを変更します。
明示的な、Administratorsグループに所属するユーザに変更します Administratorsグループに所属するユーザ名に、変更します。
「コンピュータ名¥ユーザ名」の形式で、入力します。
以上の操作によって、データベースサービスの開始アカウントが、ローカルシステムから、特定のAdministrator権限を持つユーザに変更されました。
この方によって、Outlook2000のセットアップ処理を行ないます。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00300:SQL Mail,SQLAgent Mail,メール]
Outlook2000の、インストールの流れを教えて下さい
↑戻る    ↑先頭へ
SQL Server 2000 が動いているコンピュータ上に、Outlook2000 をインストールします。
次のような手順になります。
Outlook2000だけを、インストールします Office-2000の中の、Outlook2000だけを取り出してインストールします。WordやExcelなどは、新しいバージョンを入れるとよいでしょう。
Outlook2000のインストールを始めます Outlook2000の、インストールを始めます
企業、ワークグループモードでインストールを行ないます メールサービスオプションを、「企業/ワークグループ」として、インストールを行ないます。
間違って「インターネットのみ」でインストールしそうですが、SQL Server 2000 で利用する拡張MAPI接続は、「企業/ワークグループ」で提供されます。
インターネット電子メールだけを行ないます 今回はExchangeサーバーは導入しないので、インターネット電子メールだけを組み込みます
SQL Server 2000 から送信されるメールの送信元の名前の定義 SQL Server 2000 から送信されるメールの、メールアドレスや名前を入力します
POP3とSMTPサーバーの情報を入力します SMTPサーバーのアドレスと、POP3サーバーのアドレスとそのアカウント情報を入力します。
SQL Server 2000 によって、受信したメールを読む操作を行なう予定が無い場合でも、受信用のアカウントとパスワードは、正しいアカウントを入れて下さい。
SQL Mail機能のメール送信命令のxp_sendmailストアドプロシージャの実行では、Outlook側で、POP3サーバーへのログインの試みが行なわれていました。メールを受信しようとしており、パスワードが違っていると、リトライなどで長時間待たされます。
LAN接続です メールの送受信は、必ずLAN接続です。
接続用ポート番号の定義 メール送受信の、詳細設定を行ないます。既定のままです。
個人用フォルダファイルの保存場所を定義する メールボックスに相当する、個人用フォルダファイルの保存場所を定義します。既定の場所から、わかりやすい場所に移すとよいかも知れません。
以上で、セットアップは完了です 以上で、Outlook2000の、インストール時のセットアップは完了しました。
Outlook2000を、通常使う電子メールソフトにします Outlook2000を、通常使う電子メールソフトにします。
インターネットエクスプローラー(IE)のインターネットオプションのプログラムの設定でも、その変更を行なうことができます
送信されるメールの形式を、テキストメールにします Outlook2000の送信メール形式は、HTML書式が既定になっています。それを、テキスト形式に直します。
新着メールの確認は、行ないません SQL Server 2000 では、受信メールを読み取るような操作は、行ないません。そこで、新着メールの確認オプションを、外します。

Outlook2000では、セキュリティ上の問題が数多く発生しております。このため、電子メールを受信すると、データベースサーバーに悪影響がでる可能性があります。

安全を期して、SQL Server 2000 では、メール送信だけを行なうようにします。

以上の設定によって、Outlook2000からメールが送信できるようになりました。

メールを作成し、送信してみて下さい。このとき、「送信」ボタンを押したら、すぐにメールが送信されることを確認してください。

送信フォルダにメールが残っているような状態では、自動送信を行なうことはできません。

実際に送信されたメールは、「送信フォルダ」から「送信済みフォルダ」に移されます。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00290:SQL Mail,SQLAgent Mail,メール]
マイクロソフトのExchangeサーバーは導入していません。
電子メールは、インターネットプロバイダが提供するSMTPサーバー(通常のSMTPプロトコルに従うインターネットメール)で、送信をしています。
このような環境の場合、どのOutlookのバージョンをインストールすればよいですか?
↑戻る    ↑先頭へ
データベースサーバーの運用方法が、誰かがログインした状態で、Outlookのソフトを常に 起動しているような状態であれば、どのOutlookのバージョンをインストールしても構いません。

しかし通常は、データベースサーバーは、誰もログインしていない状態にするのが常識です。

このような一般的な運用環境では、実は、Outlookのバージョンに注意が必要になります。

ログインしていないので、Outlookがダイアログボックス等を表示したら、そこでメール処理が 止まってしまいます。ですから、Outlookがユーザ操作を要求しないことが必要条件になります。

しかしマイクロソフト社のオフィス開発チームは、様々なセキュリティ問題に対処するため、Outlookのセキュリティ機能を強化しました。これが反って災いになります。

そこでOutlookのセキュリティが強化されたバージョンを使うと、外部から拡張MAPI接続が行なわれると、様々な場面で、ユーザに許可を求めるダイアログボックスが表示されたりします。

このようなOutlookのセキュリティ機能が組み込まれたバージョンでは、SQL Mail や SQLAgent Mail は正しく動きません。

SQL Mail や SQLAgent Mail と一番相性の良いOutlookは、2000 です(Office-2000製品)。

Outlook2000では、セキュリティ機能が組み込まれても、SQL Server 2000と一緒に使うことができます。

SQL Mail や SQLAgent Mail 機能は、データベース開発では便利な機能です。この機能を生かすためにはOutlook2000という古いソフトが必要となります。Outlook2000を必ず入手して下さい。

なお、Exchangeサーバーを導入すると、このような相性問題が解決できます。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00280:SQL Mail,SQLAgent Mail,メール]
拡張MAPI接続に対応した、電子メールクライアントソフトを教えて下さい
↑戻る    ↑先頭へ
拡張MAPI接続とは、マイクロソフト社のOutlook電子メールクライアントが提供している方式です。

Outlookのバージョンで、2000、2002(XPのこと)、2003の製品です。
使用上の注意がありますが、Outlook98も対応します。

なお、Outlook Express は、拡張MAPI接続には対応していません。

MSDE や SQL Server をインストールしたコンピュータ上に、Outlookも一緒にインストールして下さい。

データベースサーバーとOutlookを、別々のコンピュータに入れることはできません。

詳しくは、
マイクロソフトサポート文書番号:263556
マイクロソフトサポート文書番号:315886
を参照下さい。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00270:SQL Mail,SQLAgent Mail,メール]
SQLServer 2000 の SQLAgent Mail 機能が、とても便利だと感じる場面を教えてください
↑戻る    ↑先頭へ
普段は正常終了するジョブでも、時々失敗して、管理者の手作業を必要とするときに、管理者を呼び出す手段として使うと便利です。

例えば、テープ装置にデータベースをバックアップするジョブで、ジョブが失敗したときに、電子メールを送信するように設定します。
通常のバックアップは正常終了するのですが、テープが一杯になってテープ交換が必要になったら、そのバックアップジョブは失敗し、システム管理者に、テープ交換が必要だという電子メールが入ります。

遠隔地にあるデータベースサーバーで、時々しか現場に行けないような場合は、現場作業が必要になるタイミングで、管理者を呼び出すトリガとして、SQLAgent Mail を活用すると便利です。

ただ実際は、その電子メールが入ること自体は、管理者の手抜きだと言われますが。。。。
管理者が現場に駆けつけたら、サーバーがダウンしているかもしれません。
本来は、警告やエラーメールが通知される前に対処しなければいけません。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00260:SQL Mail,SQLAgent Mail,メール]
SQLServer 2000 の SQLAgent Mail とは、どのような機能ですか?
どのような時に、使う命令でしょうか?
↑戻る    ↑先頭へ
SQLServer 2000 の SQLAgent Mail 機能では、SQLServer Agentによって実行されたジョブの実行結果(正常終了やエラー終了など)を、システム管理者に電子メールで通知することができます。

また、データベースシステムで発生した何かの警告メッセージやエラーメッセージなどをシステム管理者に電子メールで通知することもできます。

このような、ジョブの実行結果通知やデータベースシステムの監視結果通知は、Windowsのイベントログなどに記録することができますが、それを管理者あてに、電子メールで通知することができるようになっています。この電子メールによる通知機能が、SQLAgent Mail と呼ばれます。

SQL Mail のような、SQLプログラミングの中で使うものではありません。
SQLServer Agent に対する、電子メールを送信するための送信条件を定義する作業となります。

SQLAgent Mail でも、実際の電子メール送信機能は、拡張MAPI接続に対応した電子メールクライアントソフトがその送信実務を担当します。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00250:SQL Mail,SQLAgent Mail,メール]
SQL Server 2000 の SQL Mail とは、どのような機能ですか?
どのような時に、使う命令でしょうか?
↑戻る    ↑先頭へ
SQL Server 2000 の SQL Mail 機能では、電子メールに関する拡張ストアドプロシージャが提供されます。

この拡張ストアドプロシージャを使った場合は、暗黙のうちに、SQL Mail 機能を呼び出していることになります。

SQL Mail では、次の拡張ストアドプロシージャが提供されます。

拡張ストアドプロシージャ名その機能
xp_startmailメール クライアント セッションの開始。拡張MAPI接続の初期化処理を始める。
他のストアドプロシージャより前に先立って、実行を行なう。
xp_stopmailメール クライアント セッションの終了。拡張MAPI接続の終了処理を行なう。
xp_findnextmsg次のメッセージの取得
xp_readmail電子メールの読み込み
xp_deletemail電子メールの削除
xp_sendmail電子メールの送信
sp_processmailSQLクエリ依頼メールの処理
通常のストアドプロシージャとして提供
SQLで書かれたソースプログラムが読めるので、このプログラムを参考に、自分流の使いやすい方法に改良するとよい

上記の、ストアドプロシージャを使ったプログラミングが、SQL Mail と呼ばれます。

「電子メールの読み込み」とは、拡張MAPI接続対応のメールクライアントソフトが読み込んだ電子メールの受信トレイからメールを読み出す機能です。

「電子メールの削除」とは、拡張MAPI接続対応のメールクライアントソフトが読み込んだ電子メールを削除する機能です。

「電子メールの送信」とは、拡張MAPI接続対応のメールクライアントソフトに対して、電子メールの送信を依頼する機能です。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00240:SQL Mail,SQLAgent Mail,メール]
SQLServer 2000 のデータベースサーバーの中から、電子メールを送信する方法を教えてください
↑戻る    ↑先頭へ
SQLServer 2000 のデータベースサーバーの中から、電子メールを送信する方法には、

(1)SQL Mail
(2)SQLAgent Mail
の、2種類の方法があります。

どちらの方法でも、「拡張MAPI接続」に対応したメールクライアントソフトウェアをSQLServer 2000 データベースサーバーをインストールしたコンピュータに、一緒に入れる必要があります。

SQLServer 2000 自身が、SMTPなどの電子メールプロトコルを話すわけではありません。

SQLServer 2000 が、拡張MAPIに対応したメールクライアントソフトウェアに対して、送信したいメールを依頼します。
実際の送信は、拡張MAPIに対応したメールクライアントソフトウェアが担当します

つまり、SQLServer 2000 の電子メール機能とは、拡張MAPI接続に対応したメールクライアントソフトウェアと一緒に、拡張MAPI接続機能を使って協同作業ができるという意味です。

SQLServer 2000 の単独だけでは、電子メールの送信はできません。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00230:エラーログ,バージョン]
データベースサーバーのバージョンを確認する方法を教えて下さい
↑戻る    ↑先頭へ
データベースサービスが開始しているときに、バージョン番号を確認する場合は、次のSQL文を実行するのがよいでしょう。
SELECT @@VERSION
データベースサービスが止まっているときは、 ERRORLOG ファイルを調べるのが簡単です。
ERRORLOG ファイルの第1行目に、製品名とバージョン番号が記録されます。
但し、エラーログファイル名がデータベースサービス提供中に更新された場合は、過去保存のエラーログファイルを調べて下さい。

ERRORLOG ファイルは、WindowsのAdministrator権限を持っている人が閲覧することができます。一般のユーザはその中身を確認することはセキュリティ上許されません。

製品区分データベースサービス(Sqlservr.exe)のバージョン
リリース出荷製品(RTM)2000.8.00.194
SQL Server 2000 SP12000.8.00.384
SQL Server 2000 SP22000.8.00.534
SQL Server 2000 SP32000.8.00.760
SQL Server 2000 SP3a2000.8.00.760
SQL Server 2000 SP42000.8.00.2039
 
参照:マイクロソフトサポート文書番号:321185

↑戻る    ↑先頭へ
 
 
 
[FAQ-00220:エラーログ,管理業務]
エラーログファイルの内容を、SQL文から簡単に取得する命令はありませんか?
↑戻る    ↑先頭へ
エラーログファイルの内容を全部取得しレコードセット形式で返す、非公開ストアドプロシージャ sp_readerrorlog を実行します。 引数に、ログファイル番号(0,1,2,...)を与えます。
CREATE TABLE #TMP(
      ERRORLOG         VARCHAR(256) , 
      ContinuationRow  INTEGER
)
--
--現在使用中のログファイルの中身を取得する
--
INSERT INTO #TMP EXEC master.dbo.sp_readerrorlog  0

SELECT ERRORLOG FROM #TMP
       WHERE(  ERRORLOG like '%logon%' )

DROP TABLE #TMP
エラーログファイルを全部読み込みますので、ファイルサイズが大きい場合は、繰り返しsp_readerrorlogを実行するのは避けた方がよいです。
その場合は、Q-00160の方法を参照下さい。
↑戻る    ↑先頭へ
 
 
 
[FAQ-00210:エラーログ,管理業務]
エラーログファイルを、その大きさがある上限値に達したら、名前を更新したいと考えています
エラーログファイルのファイルサイズを簡単に求める命令はありませんか?
↑戻る    ↑先頭へ
エラーログファイルの、ファイルサイズや更新日などのファイル情報を取得するためには、非公開ストアドプロシージャ sp_enumerrorlogs を実行します。
EXEC master.dbo.sp_enumerrorlogs
エラーログファイルの情報が、レコードセット形式で返されます。

番号,日付,ファイルサイズ

の表が得られますので、その中のファイルサイズ列から、ログファイルの大きさがわかります。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00200:エラーログ,管理業務]
レジストリ操作に不安があります
エラーログのファイル保存個数を、標準値に戻すための、簡単な命令があれば教えて下さい
↑戻る    ↑先頭へ
レジストリ NumErrorlogs を削除すれば、標準値に戻ります。 ただレジストリ操作に不安がある場合は、SQLServer の Enterprise Manager が行なっている次の非公開命令を使うと、レジストリを削除することができます。
EXEC master.dbo.xp_instance_regdeletevalue N'HKEY_LOCAL_MACHINE', 
                   N'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer',
                   N'NumErrorlogs'
この命令を実行することによって、エラーログファイルの過去分の保存個数が標準値に戻ります。
↑戻る    ↑先頭へ
 
 
 
[FAQ-00190:エラーログ,管理業務]
レジストリ操作に不安があります
エラーログのファイル保存個数を、簡単に増やす命令があれば教えて下さい
↑戻る    ↑先頭へ
SQLServer の Enterprise Manager が行なっている次の非公開命令を使うと、レジストリを直接操作せずに、エラーログファイルの個数を増やすことができます。
EXEC master.dbo.xp_instance_regwrite N'HKEY_LOCAL_MACHINE',
             N'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer',
             N'NumErrorlogs', REG_DWORD, 10
この命令を実行することによって、エラーログファイルの過去分の保存個数が10個となります。
レジストリNumErrorLogsが自動的に作成されますので、レジストリエディタを使わずに済みます。
↑戻る    ↑先頭へ
 
 
 
[FAQ-00180:エラーログ,管理業務]
エラーログのファイル個数(ERRORLOG,ERRORLOG.1, ... ,ERRORLOG.6の合計7個。過去分は6個保存)をもっと増やしたいと思います。

過去分のエラーログを10個ぐらいにしたいです
ERRORLOG.1,ERRORLOG.2, ... ,ERRORLOG.9,ERRORLOG.10

どのようにすれば、エラーログファイルの個数が増えますか?

↑戻る    ↑先頭へ
エラーログファイルの個数を増やす方法は、マイクロソフトサポート文書番号196909で書かれているように、次のレジストリキーを作成します。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\NumErrorLogs
値は REG_DWORD 型

NumErrorLogs の値を、10進数で、10と設定すれば、

ERRORLOG.1,ERRORLOG.2,...,ERRORLOG.9,ERRORLOG.10

までの、合計10個の過去のエラーログファイルが保存されます。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00170:エラーログ,管理業務]
データベースサービスを開始している最中に、エラーログファイルの名前を更新したいと思います。
どのような方法があるでしょうか?
↑戻る    ↑先頭へ
エラーログファイル(ERRORLOG,ERRORLOG.1, ... ,ERRORLOG.6)は、データベースサービスを開始するときに、自動的にファイルの名前がずれて更新されます。

また、現在使用している ERRORLOG ファイルはデータベースサービスによって開かれており、メモ帳等の他のソフトによって、エラーログの内容を変更することはできません。

特別な目的があって、データベースサービスを運用している最中に、このエラーログファイルの更新を行ないたいことがあります。

そのような場面では、ストアドプロシージャ sp_cycle_errorlog を実行して下さい。

EXEC sp_cycle_errorlog
masterデータベースの中の、sp_cycle_errorlog ストアドプロシージャのソースプログラムを見ると、その内部では、
dbcc errorlog
という、未公開DBCCコマンドを実行していることがわかります。

sp_cycle_errorlog ストアドプロシージャのかわりに、このDBCCコマンドを実行しても同様の結果が得られます。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00160:エラーログ,管理業務]
データベースサーバーのエラーログファイルの内容を、データベースで管理したいと思います。
どのようにすればよいでしょうか?
↑戻る    ↑先頭へ
データベースサーバーを運営しているのですから、サーバーから出力されるメッセージをデータベース内部で管理したいと考えるの当然かもしれません。

データベースで管理できれば、メッセージ内容をSQL文で検索できたりして、とても便利です。

しかしデータベースサーバーが起動できないほどの致命傷が発生したときは、データベース内部のデータを調べることができず、その原因を追究することができません。このような理由から、データベースサービスで出力されるメッセージは、データベースとは異なるテキストファイルで記録されます。

しかし工夫すれば、エラーログファイルに記録されるメッセージ内容を、別途データベース内部のテーブルに保存することは可能になります。

次のような手順で作業して下さい。

なおここでは、CPANから取得したPerlで記述されたtail コマンドを使います。

(1)エラーログを保存する、データベースERRORLOGを作成します
CREATE DATABASE ERRORLOG
(2)エラーログを保存するテーブル ERRORLOG を、データベース ERRORLOG 内に作成します
USE ERRORLOG
GO

CREATE TABLE ERRORLOG (

   CNT  INTEGER  IDENTITY(1,1)  Primary Key , 

    DT  DATETIME ,

  [ID]  VARCHAR(20) ,

   MSG  VARCHAR(256)

)
GO
(3)データベースサービスを起動したときに、自動実行されるストアドプロシージャ start_logging を作成します。
ストアドプロシージャの中で、xp_cmdshell拡張ストアドプロシージャ経由で、Perl言語で作成されたプログラムstart_logging.plを起動します。
このstart_logging.plプログラムは、その内部で、tail -f を実行しますので、終了することはありません。
USE master
GO

IF EXISTS(
     SELECT name FROM master.dbo.sysobjects
       where( name = 'start_logging' and type = 'P ' )
)
BEGIN
          DROP PROC start_logging
END
GO

CREATE  PROC  start_logging
AS
      EXEC  master.dbo.xp_cmdshell 'perl D:\Perl\start_logging.pl'  , no_output
GO

EXEC sp_procoption  'start_logging' , 'startup' , 'True'
GO
(4)D:\Perl\start_logging.pl プログラムを作成します。

このプログラムは、tail -f コマンドをパイプによって実行し、その標準出力に出力される内容を読み込みます。

読み込まれた文字列をパーツに分解して、INSERT命令を組み立てます

Perl言語の中から、ADO接続オブジェクトを作成し、ConnectionオブジェクトのExecuteメソッドを利用して、INSERT命令のSQL文を実行し、ERRORLOGファイルに記録されたメッセージをデータベースのテーブルに保存します。

#
#
# ADOオブジェクトを作成し、ERRORLOGデータベースに接続を行なう
# Windows認証で接続します
#
# データベースサービスは、Administratorアカウントで起動しています
# ローカルシステムアカウントではありません。 
#

use Win32::OLE;
use Win32::OLE::Const 'Microsoft ActiveX Data Objects';

my $Conn   = Win32::OLE->new('ADODB.Connection');
my $DBName = "ERRORLOG";

my $ConnectStr = "Provider=SQLOLEDB;"       .
                 "Data Source=(local);"     .
                 "Initial Catalog=$DBName;" .
                 "Trusted_Connection=YES;"; 

$Conn->Open( $ConnectStr );
die "***Connect Open Error***"  if( Win32::OLE->LastError() );


#
# tail -f ファイル名
# パイプからtailコマンドの出力結果を読み込む
#
open( PH , "perl D:/Perl/tail.pl -f \"C:/Program Files/Microsoft SQL Server/MSSQL/LOG/ERRORLOG\" |") || die "End";

while( (defined($line=<PH>)) ) {

      chomp $line;

      #
      #日付時刻 プロセス名 メッセージ文字列内容
      #
      $line =~ /(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{2}) (\S+)\s+([\S\s]+)/;

      $dt   = $1;            #日付け時刻情報
      $id   = $2;            #プロセス名
      $msg  = $3;            #メッセージ文字列
      $msg =~ s/\'/\'\'/g;   #シングルクォート文字を2重化する

      if( $msg ne '' ) {

          #レコード挿入SQL文を作成する
          $sql = "INSERT INTO ERRORLOG.dbo.ERRORLOG(DT,ID,MSG) " .
                 "  VALUES(\'" . $dt . "\' , \'" . $id . "\' , \'" . $msg . "\' )";

          #*** print "(1)=$dt\n";
          #*** print "(2)=$id\n";
          #*** print "(3)=$msg\n";
          #*** print "SQL=$sql\n";

          #レコード挿入の実行
          $Conn->Execute( $sql );

      }

}
(5)ERRORLOGデータベースのERRORLOGテーブルを表示する
Accessプロジェクトから、ERRORLOGデータベースに接続するプロジェクトを作成しました。
AccessプロジェクトからERRORLOGデータベースへ接続する。別ウィンドウで拡大表示します
AccessプロジェクトからERRORLOGデータベースへ接続する
(6)レコード選択フィルタを使って必要なレコードだけを表示する
Accessプロジェクトのフォームフィルタなど、フィルタ機能を使って必要なエラーログの情報を表示します。
必要なERRORLOGの情報を表示する。別ウィンドウで拡大表示します
Accessプロジェクトから、必要なERRORLOGの情報を表示する
↑戻る    ↑先頭へ
 
 
 
[FAQ-00150:エラーログ,管理業務]
私は、ActivePerlをインストールしています。
Perl言語で記述された tail コマンドはありませんか?
↑戻る    ↑先頭へ
Perl に関するモジュールなどの入手は、CPANで、調べることができます。 CPAN Searchを使って、tail コマンドを探します。 いくつか該当するものが見つかりますが一番最初に表示されたものが、Perl言語で記述された tail コマンドです。

この tail コマンドのソースプログラムを取得します。

このWebブラウザに表示された内容をすべて選択し、コピーして、テキストファイルに貼り付けて下さい。 tail.pl という名前で保存します。

Windowsのコマンドプロンプトから次のように実行して下さい。エラーログファイルを常時監視することができます。

perl tail.pl -f "C:¥Program Files¥Microsoft SQL Server¥MSSQL¥LOG¥ERRORLOG"

tail.plを使ったエラーログファイルの監視。別ウィンドウで拡大表示します
tail.plを使ったエラーログファイルの監視
↑戻る    ↑先頭へ
 
 
 
[FAQ-00140:エラーログ,管理業務]
私はデータベースサーバー管理者です。
エラーログファイルの中身を常時画面に表示して、データベースサーバーの運営状態を把握したいと思います。
どのような方法がありますか?
簡単な方法を教えて下さい。
↑戻る    ↑先頭へ
SQLServer では、Enterprise Manager を使ってエラーログファイルの内容を見ることができますが、リアルタイムに表示するわけではありません。

「最新の情報に更新」を押さないと、いつまでも過去の状態を見ていることになります。
このため、データベースサーバーの運営状態を正確に把握する方法としては、Enterprise Manager は、適任ではありません。

リアルタイムに、エラーログファイルの内容を表示するソフトウェアが必要です。

このような分野では、テキストファイル処理に多くのコマンドを提供しているUNIX系のコマンドを探すとよいでしょう。

tail コマンドが代表格です。

tail -f テキストファイル名

で、テキストファイルに書き込まれるメッセージの内容を常時表示することができます。

tailコマンドは、Windowsのコマンドプロンプトで提供される標準コマンドの中には存在しません。このため、Windowsで動作するtailコマンドを作っている人が多数おられますので、そのようなサイトからダウンロードすることができます。

エラーログファイルの監視。別ウィンドウで拡大表示します
cygwinの中のtailコマンドを使ってエラーログファイルを表示しています。
↑戻る    ↑先頭へ
 
 
 
[FAQ-00130:MSDE,エラーログ]
私は、MSDE2000 ユーザです。
エラーログファイルの中身を見る方法を教えて下さい
↑戻る    ↑先頭へ
SQLServer では、Enterprise Manager を使ってエラーログファイルの内容を見ることができます。
しかし、MSDE2000 では、GUI監視ツールは付属しません。

エラーログファイルはテキストファイルなので、手軽な方法としては、『メモ帳』を使って、その中身を確認することができます。

データベースサービスが停止しているときは、ERRORLOG ファイルの内容をメモ帳から変更することができますので、誤って気がつかずにキーボードからキーを押して文字を入力することがないようにご注意下さい。

データベースサービスを提供している間は、データベースサービスが ERRORLOG ファイルを開いているので、メモ帳などからその内容を更新することはできません。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00120:MSDE,エラーログ]
私は、MSDE2000 ユーザです。
データベースサーバーのエラーログファイルは、どこに存在しますか?
↑戻る    ↑先頭へ
MSDE2000 は、データベースエンジンとして提供され、GUI監視ツールは付属しません。

このため MSDE2000 でデータベースサーバーを運営していても、エラーログファイルの存在をまったく知らない方もおられます。

MSDE2000 だからと言って、データベースサーバーの監視業務をしなくてもよいとは、考えないで下さい。

SQLServer とまったく同様のデータベースエンジン性能を有していますので、快適なデータベースサービスを提供するためには、MSDE2000 でも、エラーログファイルの内容を正しく監視することが大事です。

次のディレクトリの中に、エラーログファイルが作成されます。

C:\Program Files\Microsoft SQL Server\MSSQL\LOG

名前付きインスタンスのデータベースサーバーでは、フォルダ名が異なる

このディレクトリの中に、

              ERRORLOG
              ERRORLOG.1
              ERRORLOG.2
              ERRORLOG.3
              ERRORLOG.4
              ERRORLOG.5
              ERRORLOG.6
の、合計7個の、エラーログファイルがあります。

データベースサービスを起動すると、最後のエラーログファイル(ERRORLOG.6)は破棄されて、ERRORLOG.5ファイルがERRORLOG.6と名前が変更されます。ERRORLOG.4ファイルがERRORLOG.5と名前が変更されます。以下同様に、 ERRORLOGファイルが、ERRORLOG.1となります。

そして、新しく起動されたデータベースサービスが使うエラーログファイルが、ERRORLOGです。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00110:エラーログ]
データベースサーバーのエラーログファイルとは、何ですか?
↑戻る    ↑先頭へ
データベースのトランザクションログファイルと、その意味を混同する方がおられますので、ご注意下さい。

MSDE や SQLServer (データベースサーバー) のエラーログファイルは、データベースサーバーが動作している間に発生した様々な情報メッセージや警告メッセージ、エラーメッセージなどが記録されるテキストファイルのことです。

エラーログファイルに記録された内容を監視することで、データベースサーバーの運営状態を把握することができます。

エラーログファイルに記録される一部のメッセージは、Windows側のイベントメッセージとしても、同じように記録されます。

このため、Windowsのイベントビューワーを使って、MSDE や SQLServer の監視を行なうこともありますが、正式には、データベースサーバーが記録しているエラーログファイルを監視するのがよいと思います。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00100:db_owner,dbo,データベースロール]
db_owner データベースロールに所属するデータベースユーザを削除する命令を教えて下さい
↑戻る    ↑先頭へ
固定データベースロール db_owner に、所属しているデータベースユーザを削除する命令は、次のストアドプロシージャを実行します。

EXECUTE sp_droprolemember 'db_owner' , 'データベースユーザ名'

dbo ユーザまたは db_owner データベースロールに所属している方が、この命令を実行してください。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00090:db_owner,dbo,データベースロール]
db_owner データベースロールに所属するデータベースユーザを表示する命令を教えて下さい
↑戻る    ↑先頭へ
固定データベースロール db_owner に、現在所属しているデータベースユーザ名を表示する命令は、次のストアドプロシージャを実行します。

EXECUTE sp_helprolemember 'db_owner'

誰でもこの命令を実行することができます。

この命令を実行すると、レコードセット(表)が返されます。その中の、MemberName列に、ユーザ名が表示されます。

次のようなSQL文を実行するとよいでしょう。

CREATE TABLE #TMP (
  DbRole      sysname , 
  MemberName  sysname ,
  MemberSID   varbinary(85)
)

INSERT  INTO #TMP EXECUTE sp_helprolemember 'db_owner'

SELECT  CAST(MemberName AS VARCHAR(40)) AS 所属するユーザ名
     FROM #TMP

DROP TABLE #TMP

↑戻る    ↑先頭へ
 
 
 
[FAQ-00080:db_owner,dbo,データベースロール]
db_owner データベースロールに、データベースユーザを登録する命令を教えて下さい
↑戻る    ↑先頭へ
固定データベースロール db_owner に、データベースユーザを登録する(その権限を与える)命令は、次のストアドプロシージャを実行します。

EXECUTE sp_addrolemember 'db_owner' , 'データベースユーザ名'

dbo ユーザの方が、この命令を実行します(または db_owner データベースロールに所属している人も実行ができます)

↑戻る    ↑先頭へ
 
 
 
[FAQ-00070:db_owner,dbo,データベースロール]
db_owner データベースロールは、どのような用途で使うのでしょうか?
dbo ユーザとは、異なるのでしょうか?
↑戻る    ↑先頭へ
あなたは、データベースCustomersの、dbo ユーザとします。

あなたが、

CREATE DATABASE Customers

命令を実行してデータベースを作成しました。

あなたは、明日から3ヶ月間の長期出張に出なければいけません。

さて、長期出張している間、Customersデータベースの管理者が不在になります。非常に困ったことが起きました。

あなたが不在の間、新しいデータベースのユーザ登録は、誰が行なうのでしょうか?

テーブルに対するセキュリティの設定は、誰が行なうのでしょうか?

データベースのバックアップは、誰が行なうのでしょうか?

このように、dbo ユーザは、データベース管理者として、様々な仕事を行ないます。その dbo ユーザが不在になると、そのデータベースの運営に支障を来たすことがあります。

そこで、SQLServer では、dbo ユーザの仕事を、他のユーザに任せることができます(権限委譲)。

db_owner,db_accessadmin,db_securityadmin,db_ddladmin,db_backupoperator の各データベースロールが、仕事の分類に対応します。

この中で、db_owner は、「データベース内のすべての権限」を持つことができます。言うなれば、dbo ユーザの名代(分身?)として、働くことができます。

つまり、db_owner データベースロールに所属することは、dbo ユーザとまったく同等になります。

但し、注意点が1つだけあります。

それは、テーブルなどデータベースオブジェクトを新規に作成した場合の所有者名です。

dbo ユーザがオブジェクトを作成したときは、その所有者名は、dbo になります。

db_owner データベースロールに所属しているユーザがオブジェクトを作成したときは、その所有者名は dbo ではなく、本人のユーザ名となります。

dbo ユーザが留守の間に調子に乗って、テーブルなど新規に作成すると、後から所有者名を dbo に戻さなければいけなくなるような作業が出てきます。
ご注意下さい。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00060:dbo,データベースユーザ]
データベースユーザの中に、dbo ユーザがあります。この dbo ユーザとは、誰のことですか?
↑戻る    ↑先頭へ
dbo ユーザとは、database owner のことで、データベース所有者を表します。

データベースを新しく作成する命令は、CREATE DATABASE 文です。このSQL文を実行した人が、dbo ユーザに該当します。

dbo ユーザは、そのデータベースに関するすべての権限が許可されています。SQL文を実行する前に、事前に命令の内容を確認することが大事です。
レコードを削除する DELETE 命令もすぐに実行できますので、重要なレコードを削除するときは注意が必要です。

データベースサーバーのサーバー管理者権限(sysadminと呼ばれる)を持っている人は、自動的に、個々のデータベースの dbo ユーザに割り当てられます。この結果、そのデータベースサーバーで作成されたあらゆるデータベースの所有者になります。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00050:テーブル,レコード,セキュリティ,権限]
テーブルに対して、レコードの表示と新規挿入の許可を与えたいです。
どのような命令を実行すればよいですか?
↑戻る    ↑先頭へ
テーブルに対して、セキュリティを許可するGRANT命令を実行します。

表示権限(SELECT権限)と挿入権限(INSERT権限)を同時に与える場合は、次のSQL文を実行します。

このSQL文は、許可を与えるテーブルの所有者の方が実行します

GRANT SELECT,INSERT ON テーブル名 TO 許可を与えるデータベースユーザ名

データベースに所属するすべてのユーザに対して許可を与えるときは、データベースユーザ名の部分をPUBLICロールとします。

GRANT SELECT,INSERT ON テーブル名 TO PUBLIC

この命令によってデータベースに所属するすべてのデータベースユーザが、テーブルに対して、SELECT命令とINSERT命令を実行することが許可されます。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00040:DELETE,セキュリティ,権限]
DELETE命令を実行しても、テーブルのレコードを削除することができませんでした。
何が悪いのでしょうか?
↑戻る    ↑先頭へ
レコードの削除ができないテーブルは、誰が作成したものでしょうか?

SQLServer では、他人が作成したテーブルに対して、その作成者の許可を得ずに、そのテーブルのレコードを勝手に削除することはできません。

テーブルに対して、DELETE実行権限が与えられることによって、レコードを削除することができるようになります。

DELETE実行権限セキュリティが、許可されているかどうか、そのテーブルを作成した所有者の方に、確認を取って下さい。

データベースユーザ User_A さんが作成したテーブルTBL_Aに対して、DELETE実行権限セキュリティをデータベースユーザ User_B さんに与える命令は、次のように実行します。

このSQL文は、テーブルの所有者であるデータベースユーザ User_A さんが実行します。

GRANT DELETE ON TBL_A TO User_B

GRANT命令(セキュリティを許可する命令)によって、データベースユーザ User_Bさんは、データベースユーザ User_Aさんが所有するテーブルTBL_Aに対して、DELETE命令を実行することができるようになります。

データベースに所属するすべてのユーザに対して、DELETE実行権限を許可するためには、データベースユーザ名の部分をPUBLICロールとします。

GRANT DELETE ON TBL_A TO PUBLIC

この命令によってデータベースに所属するすべてのデータベースユーザが、User-Aさんが所有するテーブルTBL_Aに対して、DELETE命令を実行することが許可されます。

データベースのテーブルを新しく作成したら、レコードの削除を誰に許可するのか、そのセキュリティについて考えなければいけません。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00030:UPDATE,セキュリティ,権限]
UPDATE命令を実行しても、テーブルのレコードを更新することができませんでした。
何が悪いのでしょうか?
↑戻る    ↑先頭へ
レコードの更新ができないテーブルは、誰が作成したものでしょうか?

SQLServer では、他人が作成したテーブルに対して、その作成者の許可を得ずに、そのテーブルのレコードを勝手に更新することはできません。

テーブルに対して、UPDATE実行権限が与えられることによって、レコードを更新することができるようになります。

UPDATE実行権限セキュリティが、許可されているかどうか、そのテーブルを作成した所有者の方に、確認を取って下さい。

データベースユーザ User_A さんが作成したテーブルTBL_Aに対して、UPDATE実行権限セキュリティをデータベースユーザ User_B さんに与える命令は、次のように実行します。

このSQL文は、テーブルの所有者であるデータベースユーザ User_A さんが実行します。

GRANT UPDATE ON TBL_A TO User_B

GRANT命令(セキュリティを許可する命令)によって、データベースユーザ User_Bさんは、データベースユーザ User_Aさんが所有するテーブルTBL_Aに対して、UPDATE命令を実行することができるようになります。

データベースに所属するすべてのユーザに対して、UPDATE実行権限を許可するためには、データベースユーザ名の部分をPUBLICロールとします。

GRANT UPDATE ON TBL_A TO PUBLIC

この命令によってデータベースに所属するすべてのデータベースユーザが、User-Aさんが所有するテーブルTBL_Aに対して、UPDATE命令を実行することが許可されます。

データベースのテーブルを新しく作成したら、レコードの更新を誰に許可するのか、そのセキュリティについて考えなければいけません。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00020:INSERT,セキュリティ,権限]
INSERT命令を実行しても、テーブルに新しいレコードを挿入することができませんでした。
何が悪いのでしょうか?
↑戻る    ↑先頭へ
レコードの挿入ができないテーブルは、誰が作成したものでしょうか?

SQLServer では、他人が作成したテーブルに対して、その作成者の許可を得ずに、そのテーブルに新しいレコードを勝手に挿入することはできません。

テーブルに対して、INSERT実行権限が与えられることによって、新しいレコードを挿入することができるようになります。

INSERT実行権限セキュリティが、許可されているかどうか、そのテーブルを作成した所有者の方に、確認を取って下さい。

データベースユーザ User_A さんが作成したテーブルTBL_Aに対して、INSERT実行権限セキュリティをデータベースユーザ User_B さんに与える命令は、次のように実行します。

このSQL文は、テーブルの所有者であるデータベースユーザ User_A さんが実行します。

GRANT INSERT ON TBL_A TO User_B

GRANT命令(セキュリティを許可する命令)によって、データベースユーザ User_Bさんは、データベースユーザ User_Aさんが所有するテーブルTBL_Aに対して、INSERT命令を実行することができるようになります。

データベースに所属するすべてのユーザに対して、INSERT実行権限を許可するためには、データベースユーザ名の部分をPUBLICロールとします。

GRANT INSERT ON TBL_A TO PUBLIC

この命令によってデータベースに所属するすべてのデータベースユーザが、User-Aさんが所有するテーブルTBL_Aに対して、INSERT命令を実行することが許可されます。

データベースのテーブルを新しく作成したら、レコードの新規挿入を誰に許可するのか、そのセキュリティについて考えなければいけません。

↑戻る    ↑先頭へ
 
 
 
[FAQ-00010:SELECT,セキュリティ,権限]
SELECT命令を実行しても、テーブルのレコードを表示することができませんでした。
何が悪いのでしょうか?
↑戻る    ↑先頭へ
レコードの表示ができないテーブルは、誰が作成したものでしょうか?

SQLServer では、他人が作成したテーブルを、その作成者の許可を得ずに、そのテーブルのレコードの内容を勝手に表示することはできません。

テーブルに対して、SELECT実行権限が与えられて、初めてそのテーブルのレコードの内容を取得することができます。

SELECT実行権限セキュリティが、許可されているかどうか、そのテーブルを作成した所有者の方に、確認を取って下さい。

データベースユーザ User_A さんが作成したテーブルTBL_Aに対して、SELECT実行権限セキュリティをデータベースユーザ User_B さんに与える命令は、次のように実行します。

このSQL文は、テーブルの所有者であるデータベースユーザ User_A さんが実行します。

GRANT SELECT ON TBL_A TO User_B

GRANT命令(セキュリティを許可する命令)によって、データベースユーザ User_Bさんは、データベースユーザ User_Aさんが所有するテーブルTBL_Aに対して、SELECT命令を実行することができるようになります。

データベースに所属するすべてのユーザに対して、SELECT実行権限を許可するためには、データベースユーザ名の部分をPUBLICロールとします。

GRANT SELECT ON TBL_A TO PUBLIC

この命令によってデータベースに所属するすべてのデータベースユーザが、User-Aさんが所有するテーブルTBL_Aに対して、SELECT命令を実行することが許可されます。

データベースのテーブルを新しく作成したら、テーブルのレコードの表示を誰に許可するのか、そのセキュリティについて考えなければいけません。

↑戻る    ↑先頭へ
 
 
 
 
MSDE FunClubに関するご意見・ご要望等ございましたら、
msdefun@horikawa.ne.jp までご連絡下さい。
MSDE や SQL Server を始めとする各種データベースシステムの開発や、
システムコンサルタントに関するご要望は、
msdedev@horikawa.ne.jp までご連絡下さい。