Comments
Description
Transcript
SQL Server
プログラミング William C.Amo 著 有限会社トップスタジオ 翻訳 目次 はじめに ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・7 謝 辞 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・9 第 1 部 SQL Server プログラミング環境 第 1 章 SQL Server プログラミング環境の概要 27 1.1 SQL Server 環境のコンポーネント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・28 SQL Server ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・29 データベースとデータベースオブジェクト ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・31 テーブル ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・32 インデックス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・33 ストアドプロシージャ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・35 ネットワークコンポーネント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・36 クライアント側ライブラリ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・37 クライアントアプリケーション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・38 Transact-SQL 言語 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・38 1.2 ライセンスモードと接続 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・39 接続クライアント数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・39 同時使用ユーザー数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・39 ノードベースのクライアントアクセス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・40 1.3 文字セットと並べ替え順 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・40 1.4 SQL Server のツール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・41 BCP ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・41 SQL Server Enterprise Manager ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・41 SQL Server プロファイラ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・42 SQL Server クエリアナライザ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・42 1.5 データベースアプリケーションインターフェイスの詳細 ・・・・・・・・・・・・・・・・42 DB-Library ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・43 ODBC ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・43 11 目次 OLE DB と ActiveX Data Objects ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・44 Open Data Services による SQL Server の拡張 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・46 1.6 サンプルプログラム ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・46 1.7 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・47 第 2 章 SQL Server ツールの使用方法 49 2.1 SQL Server Enterprise Manager ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・51 Enterprise Manager の機能 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・51 信託口座サンプルデータベースの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・54 Accounts テーブルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・57 列制約の作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・58 SQL スクリプトファイルの生成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・59 参照整合性の宣言 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・60 2.2 BCP ユーティリティ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・62 フォーマットファイルの使用方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・62 BCP ユーティリティの実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・64 2.3 SQL Server クエリアナライザ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・66 クエリの実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・67 クエリ分析情報の表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・67 2.4 SQL Server クライアントネットワークユーティリティ ・・・・・・・・・・・・・・・68 新しいネットワークプロトコルの追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・69 DB-Library オプションの設定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・69 2.5 makepipe と readpipe ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・70 接続のテスト ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・70 結果の表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・70 2.6 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・71 第 3 章 SQL Server のセキュリティ 3.1 SQL Server のセキュリティの概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・73 セキュリティモード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・74 ユーザーとグループ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・75 ログイン ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・75 ロール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・75 権限 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・75 12 73 目次 3.2 ユーザーとログインの管理 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・76 ユーザーとログインの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・76 ストアドプロシージャによるユーザーの追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・76 権限とロール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・78 3.3 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・85 第 2 部 Transact-SQL 言語 第 4 章 Transact-SQL 入門 89 4.1 投資信託口座データベースの構造 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・89 4.2 Transact-SQL の要素 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・90 コメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・91 リテラル ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・92 識別子 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・92 式 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・93 キーワード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・95 演算子 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・96 4.3 SET ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・98 ANSI_DEFAULTS オプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・99 DATEFORMAT オプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・99 NOEXEC オプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・100 SHOWPLAN_ALL オプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・100 STATISTICS IO オプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・103 4.4 SQL ステートメントのバッチ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・103 バッチファイルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・103 マルチバッチファイル ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・103 USE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・104 4.5 EXECUTE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・105 ストアドプロシージャの実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・105 文字列の実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・106 4.6 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・106 13 目次 第 5 章 データ定義言語 5.1 SQL Server のデータ型 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・109 バイナリデータ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・110 文字データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・110 日付時刻データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・110 整数データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・111 真数データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・111 概数データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・112 通貨データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・112 テキストデータとイメージデータ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・113 特殊データ型 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・113 Unicode 型 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・114 SQL データ型と C++データ型の比較 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・115 5.2 データベースの作成と削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・115 物理ファイルの指定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・115 ログファイルの指定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・116 DROP DATABASE ステートメントによるデータベースの削除 ・・・・・・・・・・・・117 データベースの接続と切断 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・118 5.3 ALTER DATABASE による既存データベースの変更 ・・・・・・・・・・・・・・・・・118 ファイルグループとログファイルの追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・119 ファイルとファイルグループの追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・119 5.4 CREATE TABLE によるテーブルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・120 制約の指定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・120 IDENTITY と ROWGUIDCOL ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・121 計算列の指定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・121 データ整合性 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・122 5.5 制約 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・123 CHECK 制約 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・123 DEFAULT 制約 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・123 UNIQUE 制約 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・124 PRIMARY KEY 制約 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・124 FOREIGN KEY 制約 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・125 5.6 ルールオブジェクトとデフォルトオブジェクト ・・・・・・・・・・・・・・・・・・・・・・・・・・125 ルールの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・125 デフォルトの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・126 14 109 目次 ルールとデフォルトの削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・126 5.7 NULL データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・127 ANSI_NULLS オプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・127 NULL 値のテスト ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・127 5.8 既存のテーブルの変更 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・128 制約の追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・128 NOCHECK オプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・129 列の追加と変更 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・129 DROP TABLE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・129 5.9 インデックスの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・130 インデックスの種類 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・130 CREATE INDEX ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・131 5.10 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・132 第 6 章 データ操作言語 133 6.1 INSERT ステートメントによるデータ挿入 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・134 列名を指定する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・134 SELECT ステートメントの戻り値を挿入する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・135 EXECUTE キーワード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・135 6.2 SELECT ステートメントを使用した基本的なクエリ ・・・・・・・・・・・・・・・・・・136 WHERE 句の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・136 列リストの使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・136 式の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・137 別名の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・139 ORDER BY による結果のソート ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・140 列リスト内での式と制約の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・140 BETWEEN による範囲検索 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・141 IN の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・142 LIKE キーワード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・143 TOP による行選択 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・146 SELECT INTO によるテーブルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・148 DISTINCT キーワード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・149 分散クエリ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・150 6.3 UPDATE ステートメントによる既存データ更新 ・・・・・・・・・・・・・・・・・・・・・・・・152 ほかのテーブルから選択した値の更新 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・152 15 目次 6.4 DELETE ステートメントによるデータ削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・153 TRUNCATE TABLE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・154 6.5 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・154 第 7 章 Transact-SQL の関数 7.1 データ変換関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・158 Style 引数の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・158 7.2 ドメイン集計関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・160 AVG( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・160 COUNT( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・161 SUM( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・162 MAX( )関数と MIN( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・163 7.3 文字列関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・163 LEN( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・163 UPPER( )関数と LOWER( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・164 LTRIM( )関数と RTRIM( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・164 RIGHT( )関数と LEFT( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・164 SUBSTRING( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・165 CHARINDEX( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・166 STR( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・166 STUFF( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・167 REPLACE( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・167 7.4 数学関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・168 ABS( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・168 POWER( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・168 SQUARE( )関数と SQRT( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・168 ROUND( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・169 RAND( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・169 7.5 日付時刻関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・170 GETDATE( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・170 DATEADD( )関数と DATEDIFF( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・171 DATENAME( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・173 DATEPART( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・174 ISDATE( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・174 DAY( )関数、MONTH( )関数、YEAR( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・175 16 157 目次 7.6 システム関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・175 ISNUMERIC( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・175 COALESCE( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・176 DATALENGTH( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・177 IDENTITY 列に関する情報の取得 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・177 オブジェクトに関する情報の取得 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・178 ユーザー識別関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・179 7.7 text/image 関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・180 TEXTPTR( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・180 PATINDEX( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・182 SUBSTRING( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・182 7.8 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・182 第 8 章 グループ化と集計 185 8.1 GROUP BY 句 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・185 非集計列の選択 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・187 WHERE 句による行の制限 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・188 ALL キーワード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・189 8.2 グループ結果の制限 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・190 WHERE 句と HAVING 句の併用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・190 集計処理をせずにグループを制限する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・191 グループ内の項目数の表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・192 8.3 COMPUTE 句と COMPUTE BY 句 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・193 複数の COMPUTE BY 句の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・195 複数の集計値の表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・196 総計の表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・197 8.4 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・198 第 9 章 結合、サブクエリ、ユニオン 199 9.1 テーブルの結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・199 クロス結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・200 内部結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・201 左外部結合、右外部結合、完全外部結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・203 自己結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・205 2 つ以上のテーブルの結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・206 17 目次 9.2 サブクエリ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・207 サブクエリと IN および NOT IN の併用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・208 相関サブクエリ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・209 EXISTS および NOT EXISTS とサブクエリの併用 ・・・・・・・・・・・・・・・・・・・・・・・・・・211 ANY キーワードと ALL キーワード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・213 9.3 ユニオンと UNION 演算子 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・216 9.4 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・218 第 10 章 ビューの作成と使用 219 10.1 ビューを使用する理由 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・219 一貫したデータ表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・220 複雑さの隠蔽 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・220 10.2 ビューの作成と使用方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・220 ビューを使用したデータ選択 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・222 ビューを使用したデータ修正 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・223 ビューの修正と削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・225 10.3 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・227 第 11 章 テキストとイメージ 229 11.1 テキストとイメージを扱うステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・229 SET TEXTSIZE ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・230 READTEXT でテキスト列を読み取る方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・230 テキスト列の一部を UPDATETEXT で変更する方法 ・・・・・・・・・・・・・・・・・・・・・・・・232 WRITETEXT でテキスト列を書き込む方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・234 11.2 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・235 第 12 章 CUBE オペレータと ROLLUP オペレータ 12.1 CUBE オペレータ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・237 行数の計算 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・239 GROUPING 関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・239 12.2 ROLLUP オペレータ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・241 結果の分析 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・242 集計行の抽出 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・242 12.3 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・243 18 237 目次 第 13 章 カーソル 245 13.1 カーソルとは ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・246 カーソルタイプ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・246 カーソルの所在 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・248 カーソルの使用方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・249 13.2 DECLARE CURSOR ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・250 FOR UPDATE OF 句 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・251 ロック方針の選択 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・251 カーソルの有効範囲の指定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・252 SQL-92 構文でのカーソル宣言 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・253 13.3 OPEN ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・253 カーソルを非同期に作成する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・254 13.4 FETCH ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・254 絶対フェッチと相対フェッチ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・255 変数へのフェッチ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・256 カーソルの境界の検出 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・256 13.5 CLOSE ステートメントと DEALLOCATE ステートメント ・・・・・・・257 13.6 カーソル変数の使用方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・258 13.7 カーソルを介した更新 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・259 @@error グローバル変数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・260 13.8 CURSOR_STATUS( )関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・261 13.9 カーソルのレポートを表示するストアドプロシージャ ・・・・・・・・・・・・・・・262 13.10 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・263 第 14 章 管理者用の Transact-SQL 265 14.1 サーバーの設定とデータベースオプション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・266 サーバーオプションの変更 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・266 データベースオプションの変更 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・267 14.2 DBCC ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・267 DBCC USEROPTIONS ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・267 DBCC CHECKDB ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・269 DBCC DBREINDEX ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・270 DBCC (FREE) ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・271 DBCC SQLPERF (LOGSPACE) ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・271 DBCC PERFMON ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・272 19 目次 DBCC SHOW _STATISTICS ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・273 DBCC SHOWCONTIG ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・274 14.3 ジョブのセットアップ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・274 ジョブの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・275 ジョブにジョブステップを追加する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・276 ジョブの手動実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・277 ジョブのスケジュールの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・278 14.4 バックアップと復元 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・280 FundAccts データベースのバックアップ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・280 FundAccts データベースの復元 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・281 14.5 その他の管理作業 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・282 UPDATE STATISTICS ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・283 SQL Server の起動 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・284 SQL Server エージェントの開始 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・285 SQL Server のシャットダウンと一時停止 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・285 プロセスの終了 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・286 14.6 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・287 第 15 章 ストアドプロシージャとトリガ 15.1 グローバル変数とローカル変数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・290 DECLARE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・290 変数値の設定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・291 変数値の取得 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・291 15.2 フロー制御ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・291 IF...ELSE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・292 BEGIN...END ブロック ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・293 PRINT ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・294 CASE 式 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・295 WHILE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・296 CONTINUE と BREAK ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・297 GOTO ステートメントと RETURN ステートメントによる分岐 ・・・・・・・・・・・・298 WAITFOR ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・299 RAISERROR ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・300 一時テーブルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・302 20 289 目次 15.3 独自のストアドプロシージャの記述 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・302 CREATE PROCEDURE によるプロシージャの作成 ・・・・・・・・・・・・・・・・・・・・・・・・303 パラメータと戻り値 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・304 プロシージャを使用する権限の付与 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・306 ストアドプロシージャの呼び出し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・306 やや高度なプロシージャの例 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・308 15.4 プロシージャの修正と削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・310 ALTER PROCEDURE ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・310 DROP PROCEDURE によるプロシージャの削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・311 15.5 トリガ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・311 CREATE TRIGGER ステートメントによるトリガの作成 ・・・・・・・・・・・・・・・・・・・312 トリガの修正と削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・315 15.6 拡張ストアドプロシージャの概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・315 SQL Server 拡張ストアドプロシージャの使用方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・316 独自の拡張プロシージャの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・317 15.7 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・318 第 16 章 トランザクション 319 16.1 Transact-SQL のトランザクション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・321 BEGIN TRANSACTION ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・322 SET IMPLICIT _TRANSACTIONS ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・322 COMMIT による変更の保存 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・323 ROLLBACK による変更の取り消し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・323 SAVE TRANSACTION ステートメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・324 16.2 分散トランザクション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・324 Microsoft 分散トランザクションコーディネータ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・324 BEGIN DISTRIBUTED TRANSACTION ステートメント ・・・・・・・・・・・・・・・・・325 暗黙的な分散トランザクション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・326 16.3 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・326 第 17 章 SQL Server イベントの監視 329 17.1 SQL Server プロファイラ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・329 プロファイラの用語 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・330 トレースの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・333 トレースの開始と停止 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・335 21 目次 トレース結果の表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・336 17.2 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・336 第 3 部 SQL Server プログラミング 第 18 章 DB-Library 341 18.1 サンプルプログラムのアーキテクチャ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・342 DBObject クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・342 ストアドプロシージャの結果が表示されたビューの使い方 ・・・・・・・・・・・・・・・・・・343 18.2 DB-Library の使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・344 ストアドプロシージャとパラメータの使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・345 カーソル内の特定位置での更新 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・346 18.3 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・347 第 19 章 ODBC 349 19.1 ODBC API の使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・350 19.2 ストアドプロシージャの使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・351 19.3 カーソルの使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・352 19.4 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・354 第 20 章 ADO 357 20.1 ADO オブジェクトモデル ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・357 20.2 ADO オブジェクトの使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・359 20.3 ストアドプロシージャの使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・361 20.4 カーソルの使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・361 20.5 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・363 第 21 章 ODS 21.1 ODS API の使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・366 21.2 メッセージを記録するプロシージャ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・367 21.3 メッセージを読み取るプロシージャ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・369 21.4 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・370 22 365 目次 第 4 部 付録 付録 A CD-ROM の内容 373 付録 B FundAccts サンプルデータベース 381 付録 C SQL Server の SET ステートメント 387 付録 D 関数 391 付録 E 予約キーワード 403 付録 F システムストアドプロシージャ 405 付録 G システムデータベースとテーブル 421 付録 H 演算子リファレンス 425 付録 I データ型リファレンス 427 付録 J SQL Server 7.0 の技術仕様 431 付録 K sp_confgure と sp_dboption のオプション 433 付録 L ファイルとディレクトリの構成 437 付録 M データ変換サービスウィザードの使用方法 439 索 引 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・445 23 第 1 章 SQL Server プログラミング環境の概要 この章で学習すること ◆ SQL Server を構成するコンポーネント ◆ データベースに含まれるオブジェクト ◆ SQL Server 7.0 に付属するユーティリティ ◆ 文字セットと並べ替え順 ◆ アプリケーションを SQL Server データベースに接続するためのデータベースイ ンターフェイス SQL Server というデータベースアプリケーションは、システムアナリスト、データベース管 理者、システム管理者、プログラマ、プロジェクトマネージャといった人々の努力の結晶とし て生み出されたものである。こうした人々は、ビジネス上の問題を技術的なソリューションに 転換する責任を負っている。 技術的なソリューションを開発するには、次のような作業が必要になる。 ● データベースの設計( テーブルや列の定義) ● サーバーでのアプリケーションの処理部分に関するストアドプロシージャ群の定義 ● テーブル制約やテーブル間のリレーションの設定 ● ユーザー、ロール、権限の設定 ● 保守計画の設定( バックアップ、復元の手順も含む) ● クライアントアプリケーション用のデータベースインターフェイスの選択 ● データベースを使用するクライアントアプリケーションソフトウェアの開発 実際のリストはもっと長くなるが、このリストを見れば、いかに多大な努力が必要かという ことがわかるだろう。データベースインターフェイスは、クライアントアプリケーションがデー タベースにアクセスするための入り口であり、おもに 2 つのコンポーネントから構成される。 その 1 つは呼び出しレベルインターフェイス( CLI )で、もう 1 つはこのインターフェイス上で 使用される言語である。 データベースアプリケーションは、CLI を使用することで、データベースから一連の行( 行 27 第1章 SQL Server プログラミング環境の概要 セット)を取り出し、それらの行に含まれるデータを処理する。アプリケーションによっては、 取り出した行セットに何度もアクセスしたり、何らかのアクションを実行する前に行セットを 前方や後方にスクロールして各行を検査することもある。 注 ここで使用している「呼び出しレベルインターフェイス」という用語は、アプリケーションがデータベース にアクセスし、そこに含まれるデータやその他のオブジェクトを操作するために使用するあらゆる方法ま たは技術のことを指す。多くの場合(特に本書の第 3 部で紹介するサンプルの場合)、このデータベースア クセス技術は DB-Library などのアプリケーションプログラミングインターフェイス( API )を使用する。 SQL 標準定義における呼び出しレベルインターフェイスの代表例は ODBC である。 さらに、データベースアプリケーションは、データベース内のデータを変更したり、新しい 行を追加したり、不要になった行を削除したりするときにも CLI を使用する。 データベースアプリケーションでどのような処理を実行するときでも、データベースとのやり とりは CLI が行うことになる。CLI は、プログラムのデータベースサービス要求を SQL Server に渡し、その処理結果をプログラムに返すための導管と考えることができる。 プログラムから SQL Server に渡すデータベースサービス要求は、SQL Server の理解できる 言語で書かなければならない。この言語がデータベースインターフェイスの 2 番目のコンポー ネントであり、SQL Server に実行させる処理はすべてこの言語で記述する必要がある。つまり この言語を使用して、行セットの取り出し、行の追加や削除といったデータベース処理を記述 することになる。 SQL Server 環境で使用される言語は Transact-SQL というものであり、これが本書のおもな テーマである。第 3 部では、使用可能ないくつかの CLI オプションとその使用方法について学 習する。 以降の節では、データベースアプリケーションを機能させる SQL Server プログラミング環境 とコンポーネントの概要について見ていくことにする。 1.1 SQL Server 環境のコンポーネント アプリケーションを実装する SQL Server 環境は、データベースサーバーとして使用されるマ シン上にインストールされたいくつかのオペレーティングシステムサービスから構成される。 これらのサービスは、SQL Server の管理と、クライアントからのさまざまなデータ要求の処理 を担当する。 図 1-1 に、SQL Server 環境の簡単な概念図を示す。このうちいくつかのオブジェクトは実際 にプログラミングプロジェクトの中で扱うことになる。 SQL Server がデータベース内で管理するオブジェクトは、データが格納されるテーブルだけ ではない。データの整合性を維持するには、データ入力のルールを確立し、ユーザーがデータ 入力時にデータ項目を指定しなかった場合に使うデフォルト値を定義する必要がある。さらに、 データベース内のテーブル間に確立されたリレーションを常に有効に保たなければならない。 28 1.1 SQL Server 環境のコンポーネント 図 1-1 SQL Server 環境を構成するコンポーネントの概念図 こうしたデータ関連の情報に加えて、データの処理と取得に関連するオブジェクト( ビュー やストアドプロシージャなど)とトリガと呼ばれるイベント機構も格納する必要がある。 SQL Server データサービス要求とその要求の結果は、クライアントマシンとデータベースサーバーマシ ン上の SQL Server を結ぶネットワーク接続を介して送信される。データに対する要求は、クラ イアント上にインストールされた SQL Server クライアントツールから出されることも、本書の 第 3 部で学習するような任意の SQL Server アプリケーションから出されることもある。別の SQL Server 上で実行されているプロシージャからデータ要求が出されることもある。 SQL Server は Windows NT サービスの集まりであると考えられ、マルチユーザー環境でデー タを管理するために使用される DLL 、データベースオブジェクト、ストアドプロシージャをサ ポートしている。 29 第1章 SQL Server プログラミング環境の概要 注 SQL Server 7.0 は、Windows NT のほかに Windows 9x の環境でも実行できる。本書では、SQL Server 7.0 を Windows NT Server 4.0 上で稼動する状況だけを想定している。オペレーティングシス テムのアーキテクチャ上の違いや、SQL Server をサポートするしくみの違いなどはあるが、本書で扱う Transact-SQL の動作は、基本的にどのプラットフォームでも同じである。 SQL Server のおもなコンポーネントの 1 つは SQL Server クエリプロセッサである。このプ ロセッサは、Transact-SQL ステートメントに基づいて、目的の結果を効率的な方法で得るため の具体的な実行プランを立てる。 この処理の例として、投資信託アカウントデータベース内のアカウント( Accounts )テーブルか ら口座番号( acct_no )、口座名( acct_lastname )、郵便番号( zip )、自宅の電話番号( home_phone ) を取得するクエリについて考えてみよう。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 参照 このデータベースの構造については付録 B を参照 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ これらの列をテーブル内のすべての行から取り出すのではなく、state=“ CT ”の条件を満たし、 郵便番号が 06100 から 06300 までの範囲に含まれる行だけを取り出すことにする。 この Accounts テーブルには 3 つのインデックスが定義されている。1 番目のインデックスは zip 列の値にインデックス付けをして、2 番目のインデックスは state 列、3 番目のインデックス は state 列と zip 列の両方にインデックス付けをするものとする。 このクエリを SQL Server に発行したときに、SQL Server はどのような処理をして結果セッ トを作成するか、また、クエリプロセッサにはどのような選択肢があるか、という点について 考えてみよう。具体的には、次のような選択肢がある。 1 テーブル内の各行をスキャンして、zip 列と state 列の値が選択基準を満たすかどうかを テストする。使用可能なインデックスがまったくない場合にはこの方法が採用される。 2 state インデックスを選択し、このインデックスに含まれるすべての“ CT ”行を取り出し た後で、その 1 つ 1 つの行について zip 列の値を選択基準と比較する。 3 zip インデックスを選択し、zip の値が 06100 から 06300 の範囲に含まれる行を取り出し た後で、その 1 つ 1 つの行について state 列の値が“ CT ”に等しいかどうかをテストする。 4 state インデックスを選択して“ CT ”の項目をスキャンし、zip インデックスを選択して 06100 から 06300 までの値を持つ項目をスキャンした後で、インデックスデータアドレ スが一致するデータ行を取り出す。 5 state 値と zip 値の両方を含むインデックスを選択し、それらの項目が選択基準を満たす かどうかをテストする。これはクエリプロセッサが最も選択しやすい方法である。本書 で示す例を見れば、クエリプロセッサが期待に違わぬ働きをしてくれていることがわか るだろう。 30 1.1 SQL Server 環境のコンポーネント このシナリオからわかるように、クエリプロセッサの仕事は決して単純なものではない。ク エリが発行されたときには、その結果を得るためにいくつもの方法が考えられる。クエリプロ セッサは、クエリオプティマイザの内部アルゴリズムとクエリがコンパイルされたときのデー タ統計に基づいて、いくつも方法の中から最も効率的なものを選択する。 クエリプロセッサが各クエリを処理するときには 2 つのフェーズがある。Transact-SQL ス テートメントを正規化された形式へと解析するプロセスは解決と呼ばれ、実行プランを立てる プロセスはコンパイルと呼ばれる。 たとえばストアドプロシージャを作成するときは、SQL Server はそのプロシージャ内の Transact-SQL ステートメントの構文が正しいかどうかを検証し、そのプロシージャを正規化さ れた形式に変換する( これはさらに sysprocedures システムテーブルに格納される) 。 ストアドプロシージャを実行するときは、SQL Server が sysprocedures テーブルから正規化さ れた形式を読み取って、それを解決フェーズで処理する。解決フェーズの間に、このプロシー ジャから参照されるオブジェクトが存在しているかどうかと、参照される列の型とプロシージャ 変数の間でデータ型の互換性があるかどうかがテストされる。 解決フェーズが正常に完了した後は、現在のデータベース統計に基づいて、プロシージャ内 のクエリ( またはクエリ群)をどのように実行するかが検討される。このプロセスの結果が実 行プランであり、これは現在の( および後続の)実行要求に備えてプロシージャキャッシュ内に キャッシュされる。 SQL Server が実行プランを立てるときには、どのような統計情報を参考にするのだろうか。 オプティマイザが考慮する要因の 1 つは、参照されるテーブル内の行数である。もう 1 つの要 因は、使用可能なインデックスがあるかどうかと、そのインデックスにおけるキーの分布であ る。インデックスを効率的に使用するには、クエリの実行方法に影響を与える部分、つまり Transact-SQL ステートメントの WHERE 条件や GROUP BY 句、ORDER BY 句などをオプティ マイザが評価しなければならない。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 参照 オプティマイザが処理を正しく行うためには、データベース統計を常に最新の状態に保つことが重要で ある。第 14 章では、インデックスにおけるキー分布の統計情報を更新する UPDATE STATISTICS ステートメントについて学習する。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ データベースとデータベースオブジェクト SQL Server データベースは、2 つ以上のオペレーティングシステムファイルから構成される。 少なくとも、データベースオブジェクトを格納するファイルと、データベースアクティビティの ログを記録するファイルが存在する。オブジェクトはメインのプライマリファイルに格納され るが、入りきらない場合には 1 つまたは複数のセカンダリファイルに格納される。SQL Server は、これらのファイルをページと呼ばれる 8KB のブロック単位で読み書きする。 ファイルを構成するページ群には、ファイルの最初のページを 0 として、順に番号が割り当 31 第1章 SQL Server プログラミング環境の概要 てられる。SQL Server がデータベース内のページの場所を指すときには、そのページを格納し ているファイルを示すファイル ID と、ファイル内でページを特定するページ番号を使用する。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 参照 データベースファイルのサイズは、データベース内に格納するオブジェクトに応じて変化する。これら のファイルがどのように割り当てられているかについては、第 5 章の CREATE DATABASE ステー トメントに関する部分で学習する。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ データベース内に格納されるオブジェクトとしては、テーブル、インデックス、ストアドプ ロシージャ、トリガ、ルール、権限、ビュー、デフォルト、ユーザー定義データ型がある。 表 1-1 に、SQL Server データベースに格納されるオブジェクトの概要を示す。 表 1-1 SQL Server データベースオブジェクト データベースオブジェクト テーブル 説明 データベースアプリケーションで扱う対象になる 「もの」 ( エンティティ) に関 するデータを格納するために使われる。各エンティティは、テーブル内の行 (またはレコード) として表現される。エンティティの共通属性はテーブルの列 ( またはフィールド) として表現される。 インデックス テーブルの行へのアクセス効率を高めるために使われる。各インデックス項目 は、1 つまたは複数のキー値と、これらの値を含むテーブル内の行を指すポイ ンタから構成される。SQL Server のインデックスには、クラスタ化されたも のとそうでないものがある。 ストアドプロシージャ Transact-SQL ステートメントの集まりに名前を付けて、1 つの単位として実 行できるようにしたもの。 トリガ テーブル内の指定のデータが修正されたときに呼び出される特殊なストアド プロシージャ。 ルール 特定のテーブル列に入力される値についての詳細記述またはステートメント。 権限 あるステートメントを実行したり、あるオブジェクトに対してアクセスしたり する許可をユーザーまたはグループに与えるときに使われる。 ビュー 1 つまたは複数のベーステーブル (あるいは別のビュー) から取り出された列に よって構成される仮想テーブル。 デフォルト ある列の値が指定されていない行をテーブルに挿入するときに、SQL Server がその列に割り当てる特定の値。 ユーザー定義データ型 基本の SQL Server データ型のほかにユーザーが独自に定義するデータ型。こ のようなデータ型を一度 SQL Server に定義しておけば、ほかのデータ型と同 じように使用することができる。 テーブル テーブルは、データベースアプリケーションが扱う対象のもの( エンティティ)を表すオブ ジェクトである。たとえば第 4 章で学習する信託アカウント管理アプリケーションの場合は、 顧客口座、顧客の信託アカウント、信託アカウントに対する取引、定期的に顧客向けに発行す る報告書などのエンティティを扱うことになる。 信託アカウント管理の分野で表現できるエンティティはほかにもあるが、このアプリケーショ 32 1.1 SQL Server 環境のコンポーネント ンで必要とされるのは、このアプリケーションの意図する目的を支えるエンティティだけであ る。信託アカウントデータベース内には、これらのエンティティに関するデータを格納するた めに、1 つまたは複数のテーブルオブジェクト( テーブル)を用意する。 テーブルは、特定のエンティティのデータを格納するために使われる。テーブルはいくつか の行(またはレコード)から構成され、最大で 8,050 バイトのデータを格納することができる(テ キスト列やイメージ列は含まれない) 。 テーブルの行はいくつかの列から構成される。各列にはデータ型が定義されている。各列に は、データ型のほかにも名前や制約といった属性がある( 制約とは、使用可能な値およびほかの テーブルとの関係を定義する決まりのこと) 。列の詳細については、第 5 章の CREATE TABLE ステートメントに関する部分で学習する。 インデックス テーブルからデータを取り出すプロセスを効率化するために、データベースではいくつかの インデックスを作成する場合がある。インデックスには、テーブルの 1 つまたは複数の列に基 づくキー値と、そのキー値を含むデータ行を指すポインタが含まれる。 インデックス内の特定のキーが参照する行の数は、そのインデックスが一意か一意でないか によって異なる。 一意なインデックスには、テーブル内の 1 つのデータ行だけを指すキーが含まれる。一意な インデックスを使用する場合は、そのインデックス付きの列にはテーブル内の各行でそれぞれ 異なる値が格納されていることになる。つまり、テーブル内の 2 つの行がそのインデックス付 きの列に同じ値を格納することはありえない。 一意なインデックスは、テーブルの主キー( PRIMARY KEY )として設計された列に作成され る。主キーとは、テーブル内の行を一意に識別するために使われる 1 つまたは複数の列から構 成されたキーのことである。たとえば、顧客が個人の場合には、顧客の電話番号を顧客テーブ ルの主キーとして使用することがある。 一意でないインデックスには、1 つまたは複数の行を指すキーが含まれる。一意でないイン デックスは、行を識別する目的には使われない。このインデックスは、一般的には、テーブル に含まれる一部の行に迅速にアクセスするために使われる。顧客テーブルで使用される一意で ないキーの代表例は、顧客の住所に含まれる郵便番号である。テーブル内での郵便番号の分布 によっては、同じ郵便番号がいくつもの行( 場合によっては数百行)に現れることがある。 どの列をインデックスにするかは、アプリケーションから SQL Server に発行するクエリの内 容によって決まってくる。インデックス列を決めるときは、クエリ処理とテーブル更新処理の バランスを考えなければならない。 インデックスを使用するとクエリの実行速度が速くなるが、インデックス列の値が変更され たり、行が追加または削除されたりするたびに、インデックスを更新しなければならない。イ ンデックスの更新処理の負荷が大きくなると、更新操作のパフォーマンスに悪影響が出るおそ れがある。そこで、クエリ速度と更新速度のどちらがアプリケーションにとって重要なのかを 考える必要が出てくる。 33 第1章 SQL Server プログラミング環境の概要 どちらを優先すべきかは、アプリケーションによって異なる。この点は、データベースの設 計方法や、アプリケーションからデータベースを使用する方法にも影響を与える。インデック スを使用するときは、Transact-SQL プログラミングのあらゆる側面において慎重に検討する必 要がある。 インデックスは、B ツリーと呼ばれるデータ構造を使用して実装されている。インデックス ツリーのルートレベルには、さまざまなインデックス値の範囲が格納される。このページのそ れぞれの範囲項目は、ツリーの下層にあるほかのページを指している。下層のページになるほ ど狭い範囲の値を格納することになり、ツリーの最下層はリーフレベルと呼ばれる。 リーフレベルのページには、キー値とそれらの値を含むテーブル内の行を指すポインタが格 納される( クラスタ化インデックスの場合は、行そのものが格納される) 。リーフページのアー キテクチャは、インデックスの種類( クラスタ化インデックスか非クラスタ化インデックスか) によって異なる。 ● 非クラスタ化インデックス ― インデックス項目の並べ替え順に基づいて、テーブルの行の 論理的順序を決定する。テーブル内の物理的な行の順序は、非クラスタ化インデックスの 影響を受けない。 ● クラスタ化インデックス ― テーブルの行の物理的な順序を決定する。クラスタ化インデッ クスのリーフページは、ディスクのどこかに格納されているデータページへのポインタで はなく、テーブルの実際のデータページを格納している。 行の物理的な順序はクラスタ化インデックスによって決定されるので、1 つのテーブルには クラスタ化インデックスを 1 つしか定義できない。テーブルに PRIMARY KEY 制約を定義す るときに、そのキーのインデックスの種類が指定されず、かつクラスタ化インデックスがまだ そのテーブルに存在しない場合は、その主キーに関してクラスタ化インデックスが作成される。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 参照 PRIMARY KEY 制約については第 5 章で学習する。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ クラスタ化インデックスが存在しない場合は、非クラスタ化インデックス内のポインタ項目 は対応するテーブル行の場所を指す。クラスタ化インデックスがテーブル内に存在する場合は、 非クラスタ化インデックス項目はクラスタ化インデックス内のクラスタキーを指す。ここでデー タ行ではなくクラスタ化インデックスを指す理由は、インデックスページが分割されたときの システムのパフォーマンスを改善するためである。 このしくみにより、以前のバージョンの SQL Server よりもパフォーマンスの向上が見られる ようになった。以前のバージョンでは、インデックスページに行のキーが挿入されてページが いっぱいになったときは、そのページを 2 つに分割しなければならなかった。元のページから 新しいページへとキーが移されるために、どちらのページもかなりの項目を扱うことになった。 クラスタ化インデックスでこのような分割が発生した場合には、実際のデータ行がページか らページに移されていた。非クラスタ化インデックスはこれらのディスク上で移動する行を参 34 1.1 SQL Server 環境のコンポーネント 照していたので、データ行の新しい場所を反映するように非クラスタ化インデックスも更新す る必要があった。したがって、非クラスタ化インデックスが存在する場合には、ページ分割時 にかなり大きなインデックス保守のオーバーヘッドが発生していた。 しかし、SQL Server 7.0 では、クラスタ化インデックスが存在する場合でも、非クラスタ化 インデックス項目はデータページを参照しない。その代わりに、クラスタ化インデックス内の クラスタキーを参照する。このアーキテクチャのおかげで、インデックスページの分割が起き ても、非クラスタ化インデックスを保守する必要はなくなった。なぜなら、非クラスタ化イン デックスは場所に関係なくクラスタキーを参照し続けるからである。非クラスタ化インデック スは、このクラスタキーを使用することで、クラスタ化インデックスのリーフページに格納さ れているデータ行を探し当てる。 したがって、SQL Server 7.0 では、クラスタ化インデックスページが分割されたときでも、 非クラスタ化インデックスの保守を行わずに済む。ただし、新しい行に関する新しいクラスタ キーを挿入する場合は例外である。ページに新しいキーを追加する余裕がないときは、非クラ スタ化インデックス自体のページが分割される可能性がある。 ストアドプロシージャ アプリケーション内でよく使用されるもう 1 つのデータベースオブジェクトはストアドプロ シージャである。 ストアドプロシージャとは、1 つまたは複数の Transact-SQL ステートメントを 1 つの単位と してコンパイルしたものである。ストアドプロシージャには、サーバー側で実行されるアプリ ケーションロジックを実装するためのデータベース操作、変数宣言、さらにフロー制御ステー トメントを組み入れることができる。 ストアドプロシージャは、プロシージャ内の SELECT ステートメントに基づいて複数の結果 セットを返すだけでなく、複数の引数を受け取って出力値と戻り値を返すように定義すること ができる。 ストアドプロシージャは作成時にコンパイルされて sysprocedures システムテーブル内に保存 され、プロシージャのテキストは syscomments テーブルに保存される。このプロシージャが初 めて実行されるときは、プロシージャがテーブルから取り出され、オブジェクトの参照が解決 されて、今回または次回の実行に備えて実行プランがプロシージャキャッシュ内にキャッシュさ れる。 ストアドプロシージャ内で参照されたオブジェクトは実行時まで解決されないので、プロシー ジャの作成時にはまだ存在していないが実行時には存在するはずのオブジェクトをプロシージャ から参照することができる。 SQL Server には、便利なストアドプロシージャがいくつも用意されている。これらのストア ドプロシージャは次のカテゴリに分けられている。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 参照 詳細は付録 F を参照 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 35 第1章 SQL Server プログラミング環境の概要 ● カタログストアドプロシージャ ― データベースと SQL Server についての情報を提供する。 これらのプロシージャは ODBC アプリケーションでも使用される。 ● 拡張ストアドプロシージャ ― ストアドプロシージャ呼び出しと同じ方法で DLL 関数を呼 び出せるようにすることで、SQL Server の機能を拡張する。これらのプロシージャを利用 すると、SQL Server 内からの E メール機能を実装することもできる。 ● レプリケーションストアドプロシージャ ― レプリケーション操作を実現する。 ● SQL Server エージェントストアドプロシージャ ― アクティビティのスケジュールを管理 するために使われる。 ● システムストアドプロシージャ ― データベース内のさまざまなデータ管理作業に使われる。 アプリケーションの一部をサーバー側プロシージャとして実装すると、アプリケーション全 体のパフォーマンスを向上させ、ネットワークトラフィックを軽減させて、アプリケーション の保守を容易にすることができる。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 参照 第 15 章では、独自のストアドプロシージャの書き方について学習する。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ネットワークコンポーネント クライアントマシンから SQL Server に向けて発行した Transact-SQL ステートメントを SQL Server に処理させるには、そのステートメントをクライアントマシンとサーバーマシンの両方 のネットワークコンポーネントを介して転送しなければならない。 これらのネットワークコンポーネントは、図 1-1 に示したとおり、Net-Library 、プロセス間 通信機構( IPC )、ネットワークプロトコル、ネットワークインターフェイスカード( NIC )、物 理ネットワークから構成される。 アプリケーションの SQL 要求は、まずクライアント API( DB-Library や ODBC など)を介し て渡される。その後で、Net-Library を介して IPC 機構に渡される。この IPC 機能が、何らかの ネットワークプロトコルを使用してネットワーク上で要求をやりとりする。 SQL Server への接続では、どの Net-Library をロードするかをクライアント API がクライア ント構成に基づいて決定する。ロードされた Net-Library は、API 要求を処理して、それらを下 層レベルのプロセスである IPC 機構に渡す。 ここで使用される IPC 機構は、ロードされた Net-Library とネットワークプロトコルによっ て異なる。代表的な Net-Library と IPC を表 1-2 に示す。 図 1-1 を見てもわかるように、サーバー側にも同じネットワークコンポーネントがある。SQL Server は名前付きパイプをデフォルトの Net-Library/IPC としてインストールするが、ほかの Net-Library も同様にインストールすることができる。SQL Server がクライアントマシンとやり とりするときには、インストールされているプロトコルをすべて同時に使用することができる。 SQL Server に送信される SQL ステートメントと SQL Server からクライアントに返される結 果は、表形式のデータストリーム( TDS )と呼ばれるデータストリームへとパッケージ化された 36 1.1 SQL Server 環境のコンポーネント 表 1-2 SQL Server とのやりとりに使用される Net-Library と IPC Net-Library IPC 機構 説明 名前付きパイプ NetBEUI または TCP/IP SQL Server は、既定ではYY.YpipeYsqlYquery というパイ プ上の名前付きパイプ接続で待ち合わせます。 TCP/IP ソケット Windows ソケット 既定ポートは 1433。 NWLink IPX/SPX SQL Server は、Novell Bindery サービス名を介して Novell ネットワークに登録される。サーバーコンピュータの名前 が既定のサービス名として使われる。 マルチプロトコル TCP/IP 、IPX/SPX 、 名前付きパイプ 統合されたセキュリティを使用することができ、暗号化が サポートされる。 Banyan VINES Sequenced Packet ( SPP ) Protocol StreetTalk サービス名の項目を必要とする。 AppleTalk ADSP Apple Macintosh ベースのクライアントからの接続を可能 にする。Apple Talk サービスオブジェクト名の項目を必要 とする。 うえに、ネットワーク転送のために IPC プロトコルによってラップされる。 幸い、こうしたネットワークレベルで行われる一連の処理をアプリケーションプログラマが 気にかける必要はない。クライアント API のおかげで、アプリケーションとネットワークの間 に緩衝帯が設けられるので、プログラマはネットワーク上の複雑なやりとりを無視してアプリ ケーションの処理だけに意識を集中させることができる。 クライアント側ライブラリ SQL Server とやりとりをするプログラムをサポートするには、ODBC や DB-Library といっ たクライアント側ライブラリをインストールしておき、プログラムが SQL Server とのやりとり を始める前に、これらのライブラリの設定を済ませなければならない。これらの API ライブラ リはプログラムからデータベースへのリンクであり、以前は呼び出しレベルインターフェイス ( CLI )と呼ばれていたものである。 本書の第 3 部では、さまざまな API ライブラリを使用して SQL Server サーバーにアクセス するプログラムについて学習する。これらのライブラリの言語はプログラム側ではよく知られ ているが、また別の側面として、特定の Net-Library とのやりとりを行う役割がある。 たとえば ODBC は、アプリケーションに必要なデータベース処理を実行するために使用でき る一連の API 関数を公開している。具体的には、SQL Server との接続の確立、Transact-SQL ス テートメントの発行、結果の処理などを実行するものがある。その一方で、ローカルプログラ ムや API の後処理を扱う API 関数や、ネットワークに送信されない API 関数もある。 どのクライアント側ライブラリを選択するかはプログラマの自由である。選択を左右する要 因としては、さまざまな API 関数についての知識、使用しているアプリケーションプログラミ ング言語の種類、API の将来性についての見通し、インストール基準、パフォーマンス要件な どがある。 ODBC の登場以前は、DB-Library と C が最も一般的な選択肢とされていた。ODBC が登場 37 第1章 SQL Server プログラミング環境の概要 したときに、この新しい技術にすぐに切り替えた人もいたが、当時はパフォーマンスの面で多 くの問題があった。ほとんどすべてのプログラミング雑誌に、DB-Library と ODBC のパフォー マンスを比較する記事が掲載されていた。 しかし ODBC が発展し、理解が広まるにつれて、DB-Library と C の人気はしだいに衰退し ていった。この傾向を大きく後押ししたのは、ODBC とのやりとりを支援するデータアクセス オブジェクト( DAO )というオブジェクト指向技術である。現在でも DB-Library の支持者は少 なくないが、こうした人々は DB-Library のパフォーマンスを強く信奉しているのである。 この分野に新たに登場したのが OLE DB という技術である。COM と OLE の到来により、現 在ではアプリケーションアーキテクチャ( オペレーティングシステムも含む)のコンポーネン ト化が流行している。この流行は、遅かれ早かれデータベースアクセス API を淘汰することに なるだろう。詳しくは第 3 部で学習するが、それに取って代わるのは OLE DB であると予想さ れる。 クライアントアプリケーション クライアントデータベースアプリケーションとは、ある問題を解決するために設計されたプ ログラムの集まりである。こうしたプログラムは、C や C++ 、Visual Basic 、Java などの言語で 記述され、いずれかのクライアントライブラリを介して SQL Server にアクセスする。 クライアントアプリケーションで使用される Transact-SQL は、SQL ステートメントを含む 文字列の形式になっているか、ストアドプロシージャとして参照されるか、その両方の組み合 わせになる。アプリケーションのパフォーマンスは、データベースをそのアプリケーションで 使用する SQL ステートメント向けにどこまで調整できるかによって大きく左右される。そのた め、SQL Server に対するすべての処理を注意深く検討して、SQL Server とアプリケーションを 最適な状態に調整する手順が必要になる。 Transact-SQL 言語 Transact-SQL( T-SQL )は、SQL Server がリレーショナルデータを管理するために使用する 拡張版の SQL 言語である。T-SQL は米国規格協会( ANSI )の SQL-92 標準に基づいており、そ れを拡張して SQL Server オブジェクトを操作できるようにしたものである。T-SQL の言語仕 様は SQL Server 7.0 になって大きく変更されている。 T-SQL ステートメントは、データ定義言語、データ操作言語、データ制御言語という 3 つの カテゴリに分けることができる。 データ定義言語( DDL )ステートメントは、SQL Server オブジェクトを定義(および作成、変 更)するときに使われる。DDL については第 5 章で学習する。第 5 章では、DDL を使用して、 アプリケーションに必要なテーブルやインデックス、ストアドプロシージャ、トリガ、ビュー を作成する。 SQL Server 7.0 では、それまでのバージョンとは異なり、プロシージャおよびトリガ、ビュー を変更するときにいったん破棄してから再定義する必要はなくなった。しかも、その際にこれ らのオブジェクトの権限が保持されるので、オブジェクトを変更するときに権限を再定義しな 38 1.2 ライセンスモードと接続 くて済むようになっている。 データ操作言語( DML )ステートメントについては第 6 章で学習する。このカテゴリには、 データベースのテーブル内に格納されたデータを取得または保守するときに使われるステート メントが含まれる。1 つまたは複数のテーブルから行セットを取り出すには SELECT ステート メントを使用し、行を修正するには UPDATE ステートメント、テーブルから行を削除するには DELETE ステートメント、テーブルに新しい行を追加するには INSERT ステートメントをそれ ぞれ使用する。これらはいずれもデータ操作言語ステートメントである。 最後のデータ制御言語( DCL )ステートメントについては、第 15 章でストアドプロシージャ の学習をするときに触れる。制御ステートメントは、SQL クエリプロセッサが実行するロジッ クまたはアルゴリズムを表現するために使われる。このカテゴリのステートメントは、通常 のプログラミング言語のステートメントによく似ており、IF...ELSE 、BEGIN...END、WHILE 、 GOTO 、RETURN 、PRINT などがある。 T-SQL には、自作プロシージャの機能を大きく拡張してくれる関数が豊富に用意されてい る。SQL Server 7.0 では、SUBSTRING、LEN 、REPLACE といった新しい文字列関数が追加さ れているほかに、セキュリティやオブジェクト情報に関する関数がいくつか用意されている。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 参照 関数については第 7 章でカテゴリ別に学習する。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 1.2 ライセンスモードと接続 SQL Server には、SQL Server を実行するライセンスと、そのサーバーにアクセスするクライ アントごとのライセンスが必要である。SQL Server をインストールするときに、管理者は同時 使用ユーザー数と接続クライアント数という 2 種類のクライアントライセンスモードのどちら かを選択するよう求められる。どちらを選択するかによって、アプリケーションでの接続の管 理方法が変わってくる。 接続クライアント数 このモードでは、SQL Server に接続するコンピュータごとに個別のクライアントアクセスラ イセンスが必要になる。このライセンス契約では、クライアントアプリケーションから、ある いはその任意のクライアントアクセス( Microsoft クライアントユーティリティアクセスを含む) から、任意の SQL Server に接続することができる。 クライアントが複数の SQL Server にアクセスする環境の場合には、接続クライアント数ライ センスが適している。 同時使用ユーザー数 このモードでは、特定の SQL Server にクライアントアクセスライセンスを割り当てる。この サーバーには、割り当てられたライセンスの数だけクライアントが同時接続することができる。 39 第1章 SQL Server プログラミング環境の概要 このモードで稼動するアプリケーションの場合は、接続を慎重に管理しなければならない。 使用しないときには接続をできるだけ閉じるか、閉じるように強制する必要がある。このライ センスモードでの最も一般的なシナリオは、接続を開き、必要な処理を行い( 具体的な方法に ついては後述)、処理が終わったら接続を閉じることである。こうすれば、サーバー側での接続 カウントに空席ができ、ほかのユーザーが使用できる状態になる。 接続をあまり長い間保持しておくと、ほかのユーザーによるアクセスが拒否されてしまい、 需要を満たすためにクライアントライセンスを追加購入しなければならなくなる。これが、ア プリケーションでデータベースに対して何を実行するのかということを管理者が知りたがる理 由の 1 つである。 ノードベースのクライアントアクセス SQL Server 6.0 と同様に、どちらのクライアントライセンスモードでも、ノードベースのア クセスを使用することができる。 ノードベースのアクセスを使用すると、SQL Server は 1 つのマシンから複数の接続が要求さ れたことを検出し、それらの接続を 1 つのクライアントライセンスのものとカウントする。 この機能によってアプリケーション側での接続管理の負担は軽くなるが、1 接続あたり 40KB のメモリが消費されることを頭に入れておく必要がある。 1.3 文字セットと並べ替え順 文字セットは別名コードページとも呼ばれ、記号の集まりを表している。これらの記号には、 英字(大文字と小文字) 、数字、特殊文字が含まる。1 つの文字セットには 256 個の記号が含まれ ている。最初の 128 個の記号はどの文字セットでも同じだが、残る 128 個の記号は文字セット によって異なる。デフォルトでは、SQL Server は ISO 8859-1( コードページ 1252 )の文字セッ トをインストールする。ただし、SQL Server 6.5 からアップグレードした場合は、前のバージョ ンで使われていた文字セットがインストールされる。 どの文字セットを使用するかは重要な問題である。なぜなら、SQL Server が Transact-SQL 式内の文字を比較する方法や、SQL Server が有効なデータとして認識する文字は、文字セット によって決まるからである。 SQL Server のデフォルト(既定)の並べ替え順は、大文字と小文字を区別しないアルファベッ ト順である。したがって、state =“CT”という WHERE 句を含む SELECT クエリの場合は、state 列の値が“ CT ”に等しい行と“ ct ”に等しい行の両方が返される。 “ ct ” この SELECT クエリに ORDER BY 句が含まれている場合でも、既定の並べ替え順では、 の行が“ CT ”の行より必ず前に来る( あるいはその逆になる)とは限らない。 サーバーとクライアントの両方で同じ文字セットと並べ替え順を使用するようにセットアッ プしておく必要がある。 40 1.4 SQL Server のツール 1.4 SQL Server のツール SQL Server に付属しているツール群は、SQL Server に対するクライアント接続をテストした り、Transact-SQL ステートメントをテストしたり、SQL Server オブジェクトを管理したりする ときに役立つ。 SQL Server のセットアッププログラムは、ユーティリティをインストールするだけでなく、 アプリケーション開発を支援するさまざまなファイルをインストールする。これらのファイル の中には、DB-Library や ODBC 、ODS 、OLE DB を使用したアプリケーションを開発するのに 不可欠な.h ファイルおよび.lib ファイルが含まれている。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 参照 表 1-3 に示す 32 ビットのクライアントユーティリティオプションについては、以降の節で簡単に触れ るとともに、第 2 章で詳しく学習する。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 表 1-3 クライアントツールオプション ユーティリティ 説明 BCP SQL Server データベースからフラットなオペレーティングシステムファ イルへとデータをコピーする一括コピーユーティリティ。 SQL Server Enterprise Manager SQL Server とそのオブジェクト (デバイス、データベース、テーブルな ど) を管理するために使われる。 SQL Server プロファイラ データベースアクティビティを監視するために使われる。 SQL Server クライアント ネットワークユーティリティ クライアントを DB-Library 接続用に設定する。 SQL Server クエリアナライザ Transact-SQL コマンドおよびプロシージャを実行するために使われる。 このユーティリティを使用してクエリープランと SQL Server 統計を見 ることもできる。 makepipe と readpipe SQL Server に対する名前付きパイプ接続をテストする。 BCP 一括コピープログラム( BCP )を使用すると、データベーステーブルから外部ファイルにデー タをコピーしたり、外部ファイルからテーブルにデータをロードすることができる。 このユーティリティはコマンドラインユーティリティであり、データの処理方法を指定する 文字列引数を受け取る。 外部ソースから入手した( または別の SQL Server からエクスポートした)オペレーティング システムファイルにデータが含まれている場合は、テスト用または製品用のテーブルをロード するときに BCP が役に立つ。 SQL Server Enterprise Manager このユーティリティは、企業内の複数の SQL Server を管理するために使われるグラフィカル ユーザーインターフェイスツールである。 41 第1章 SQL Server プログラミング環境の概要 Enterprise Manager を使用すると、データベースとそのオブジェクト、ユーザーとユーザー権 限、スケジュール計画( バックアップ作業など)を作成したり、その他のユーティリティ( クエ リアナライザなど)を呼び出すことができる。 このユーティリティ1 つですべての管理機能を実行できるので、データベース管理者が SQL Server を管理するときにはこのユーティリティを使用するのが一般的である。 SQL Server プロファイラ SQL Server プロファイラは、アプリケーション(またはストアドプロシージャ)から生成され る SQL Server データベースアクティビティや別のユーティリティから実行されるスクリプトを 分析するときに非常に役立つ。 このユーティリティはデータベースアクティビティをリアルタイムで監視し、そのログを外 部ファイルに記録することができる。このログやリアルタイム追跡は、エンドユーザーへのリ リース前にアプリケーションのパフォーマンスを調整するために利用できる。 SQL Server クエリアナライザ クエリアナライザは、Transact-SQL ステートメントおよびプロシージャが正しく機能するか どうかをテストするために使われる。このアナライザを使用すると、SQL Server がデータ要求 を処理する方法を示す SQL Server クエリオプティマイザのプランを見ることができる。この情 報は、アプリケーションをどのように調整すべきかを考えるときの参考になる。 1.5 データベースアプリケーションインターフェイスの詳細 SQL 標準には、アプリケーションが SQL データベースを操作するために使用する呼び出し レベルインターフェイス( CLI )が定められている。 CLI は一連の関数から構成されており、それらをアプリケーション内から呼び出すことで、 SQL リレーショナルデータベースに接続してデータベースを操作する。 ODBC 3.5 は、このところ業界で幅広く普及しつつある CLI である。 ヒント SQL Server へのインターフェイスになる ODBC 3.5 の関数の使用方法をしっかり理解しておく ことを強くお勧めする。このライブラリは、CLI の選択肢としては DB-Library より明らかに優 れており、その効率的な使用方法を知っている人にとっては非常に便利なものになっている。 我々がデータベースアクセスのために COM オブジェクト技術を使用するようになったとして も、ODBC は SQL Server に対する下位レベルのインターフェイスを提供し続けると思われる。 その他のライブラリについては、本書の第 3 部で、SQL Server へのアクセスに使用できる技 術として簡単に学習する。第 3 部のサンプルアプリケーションは、この技術で実現できる機能 のほんの表面的な部分しか触れていないが、この技術を自分でさらに研究していくための基盤 にはなるはずである。 42 1.5 データベースアプリケーションインターフェイスの詳細 DB-Library DB-Library は 32 ビットのデータベース API であり、アプリケーションプログラムがデータ ベースとの接続を確立したり、Transact-SQL ステートメントを実行したり、結果セットを処理 したりするために使う一連の関数を提供する。 DB-Library は、第 2 章で学習するいくつかの SQL Server ユーティリティのインターフェイ スとして今でも使用されているが、インターフェイスの選択肢という意味では、DB-Library は ODBC と OLE DB に急速に取って代わられようとしている。DB-Library では SQL Server 7.0 用に拡張されていないうえに、いくつかの機能( 特に Unicode データを扱う機能)がサポート されていない。それにも関わらず、DB-Library は今でも多くのアプリケーションで強力なイン ターフェイスとして採用されている。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 参照 第 18 章では、サンプルの DB-Library アプリケーションを C++で作成する。Visual Basic プログラ マ用の DB-Library もあるが、本書では C++を一貫したテーマとして扱うので、それについては触れな いことにする。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ODBC Open Database Connectivity( ODBC )とは、アプリケーションから一連の共通の API 関数を使 用して異種データソースにアクセスできるようにするインターフェイスを定義した仕様である。 図 1-2 に ODBC アーキテクチャの概念図を示す。このアーキテクチャには、ドライバマネー ジャ、いくつかのドライバ( それぞれ特定のデータベースに固有) 、さらにいくつかのユーザー 定義データソースが含まれている。 このアーキテクチャのドライバマネージャというコンポーネントは、アプリケーションから のデータベース要求を受け取って、アプリケーションがデータソース名に指定した情報に対応 する適切なドライバをロードする。ドライバマネージャはいくつかの ODBC 関数呼び出しを自 身で処理する一方で、ほかの呼び出しをドライバに渡して処理させる。 SQL Server は、クライアントマシン上にインストールできて SQL Server とのやりとりに使 われるドライバを提供する。このドライバは、アプリケーションからの Transact-SQL をデー タソース内で指定された SQL Server データベースに渡す役割を果たす(このドライバは ODBC 3.5 の仕様に合わせて拡張されている)。SQL Server からの結果は SQL Server ドライバによっ て処理され、要求があったときにアプリケーションに転送される。 ユーザー定義データソースは、接続先の SQL Server とデータベースを指定する。ここに特 定のネットワーク情報を指定することもある。Windows のコントロールパネルに含まれている ODBC データソースアドミニストレータを使用すれば、データソースを簡単に作成および修正 することができる。アプリケーションからデータソース情報を内部的に提供することもできる。 その場合は、外部データソースを定義する必要はない。 SQL Server 7.0 には ODBC 3.5 ドライバが付属しているが、このドライバは一括コピーやその 43 第1章 SQL Server プログラミング環境の概要 図 1-2 ODBC アーキテクチャ 他のいくつかの新機能をサポートしている。各機能の詳細については Microsoft ODBC 3.5 SDK を参照のこと。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 参照 第 19 章では、ODBC データソースアドミニストレータを使用してデータソースを作成する方法と、デー タソースを ODBC アプリケーションで使用する方法について学習する。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ OLE DB と ActiveX Data Objects アプリケーション内で COM オブジェクトを開発しているときに、データベースアクセスが 必要な場合は、最新のデータベースインターフェイス技術である OLE DB を使用することをお 勧めする。 OLE DB の世界には、プロバイダとコンシューマという概念がある。プロバイダとは、ある 種のサービス( たとえば、特殊なデータ構造や一連の複雑なプロシージャにアクセスするなど) を提供するプログラムのことである。一方のコンシューマとは、こうしたサービスを要求して 44 1.5 データベースアプリケーションインターフェイスの詳細 使用するプログラムのことである。 OLE DB は、プロバイダがコンシューマに対してサービスを公開する方法とコンシューマが その結果を扱う方法を定義した仕様である。 SQL Server データベースアクセスの例で言えば、SQL Server に付属している OLE DB プロ バイダ( プロバイダ)が、SQL Server データベースにアクセスするためのインターフェイスを クライアントアプリケーション( コンシューマ)に提供している。 OLE DB 仕様をきちんと理解していれば、企業全体で使用できる独自のカスタムプロバイダ を開発することも可能である。このようなプロバイダでは、OLE DB プロバイダが必要とする 標準の OLE DB インターフェイスの上に企業のビジネスルールを実装することになる。 ActiveX Data Objects( ADO )は、アプリケーションと OLE DB プロバイダの間にある COM オブジェクトの集まりである。これらのオブジェクトは、アプリケーションが SQL Server とや りとりをするときに、OLE DB プロバイダへの呼び出しをじかに扱う代わりの手段として使わ れる。 ADO は SQL Server データベースを単純なモデルとして表現したものであり、Connection 、 Recordset 、Field 、Command 、Parameter 、Error といった COM オブジェクトがアプリケーショ ン向けに公開されている( 図 1-3 を参照) 。 図 1-3 ADO オブジェクト ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 参照 第 20 章では、ADO と OLE DB の仕様についてもっと詳しく学習するとともに、ADO を使用してデー タベースアクセスを行うプログラムの例を示す。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 45 第1章 SQL Server プログラミング環境の概要 Open Data Services による SQL Server の拡張 Open Data Services( ODS )は、サーバー側に位置する API である。この API を使用すると、 クライアントアプリケーションが SQL Server を呼び出すのと同じ方法で呼び出せるサーバー側 プログラムを書くことができる。さらに、SQL Server からじかに呼び出されるサーバー側プロ グラムを作成して、SQL Server の機能を実際に拡張することもできる。 サーバー上で稼動する ODS プログラムに対しては、SQL Server に対するときとまったく同 じ方法で接続したりクエリを発行することができる。このようなプログラムは ODS サーバー と呼ばれ、SQL Server データベース(またはほかのサーバー側サービス)に対するサーバーベー スのアクセスを可能にする。 拡張ストアドプロシージャは、SQL Server プロシージャ内から呼び出されたり、SQL Server の拡張ストアドプロシージャを呼び出すのと同様の方法でクライアントからじかに呼び出され たりする ODS プログラムである。 ODS を使用すると、データが共有されている( またはイベントが処理されている)企業内の 別のアプリケーションへのゲートウェイを用意することができる。たとえば、投資信託アカウ ント管理システムにトランザクションを追加して、顧客管理システムに対するイベントを発生 させることも可能である。この顧客管理システムは、どんなファイルシステムに基づくもので もよい。なぜなら、ODS 拡張ストアドプロシージャが投資信託 SQL Server アプリケーション と顧客管理アプリケーションを結ぶ独自のインターフェイスを提供するからである。 ODS は、クライアントとのすべてのネットワーク通信をサポートし、リモートプロシージャ 呼び出しを使用してほかのサーバーと通信することができる。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 参照 ODS 拡張ストアドプロシージャのサンプルについては第 21 章を参照。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 1.6 サンプルプログラム 第 3 部のサンプルアプリケーションは、Visual C++ 5.0 で書かれ、Microsoft Developer Studio Enterprise Edition で完成させたものである。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ CD参照 第 3 部で紹介するコードはすべて本書の付属 CD-ROM に収録されている。サンプルを簡単に探し 出せるように、付属 CD-ROM のディレクトリ構造は各章の構造に従っている。 付属 CD-ROM には、サンプルプログラムのほかに、本書の第 2 部で学習する Transact-SQL ス クリプトも収録されている。 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 46 1.7 まとめ 1.7 まとめ この章では、SQL Server 環境とそれを構成するコンポーネント群の概要を学んだ。さらに、 SQL Server データベースの構造と、データベースオブジェクトを作成、操作するために使われ る Transact-SQL ステートメントのカテゴリについて学習した。 SQL Server にはいくつかのユーティリティが付属しているが、これらのユーティリティはデー タベース管理者の仕事を軽減するだけでなく、プログラマにとっても便利なものである。特に アプリケーションのテストや調整を行うときにはこれらのユーティリティが役に立つ。 プログラマにはあまり重要でないと思われがちだが、文字セットや並べ替え順、ライセンス モードなどが SQL Server データベースアプリケーションの操作に影響を与える可能性もある。 この章では、これらのトピックの概要となぜこれらが重要であるかについても学習した。 最後に、アプリケーションで使用できる何種類かのデータベースインターフェイスについて 知るとともに、その構造を学習した。第 3 部では、まずこれらのインターフェイスライブラリ を試してみることにする。 47