chata MCP (Microsoft Certified Professional)
GO TO TOP PAGE
練習問題
(70-229J Designing and Implementing databases with Microsoft(R) SQL Server 2000 Enterprise Edition)
index

※ ここではMCP試験の予想問題や出題された問題を公開しているわけではありません。
製品勉強にお役立ていただくことを目的としております。

きちんとした問題や解説を作っている余裕がありませんので、
試験直前に自分のために暗記したり確認したりするために作成した問題をそのまま掲載します。
そのため理解できない内容も一部あると思いますがお許しください。


■Edition
		   CPU  RAM
Enterprise Edition  32  64GB
Standard Edition     4   2GB
Personal Edition
Developer Edition
Desktop Edition     * MSDE2000 開発したアプリケーションと共に配布可能
                      (SQL Server 7.0 の Desktop Editon と異なる)


■テーブル
列		: 最大1024カラム
行		: 最大8060バイト
ページ		: 8KB
エクステント	: 64KB = 8KB x 8
1エクステントに複数のオブジェクトが格納される


■サービス
・MSSQLSERVER (MSSQL$インスタンス名)
・SQLServerAgent (SQLAgent$インスタンス名)
	- ジョブ (T-SQL、スクリプト、EXEファイル、OSコマンドの実行) の実行
	- レプリケーション管理
	- 通知
	- 警告の管理
・MSDTCサービス (分散トランザクションコーディネーター)
	分散トランザクションが正しく行われた場合にコミットされる


■システムDB
master	     ユーザーアカウント、環境設定、システムエラーメッセージ
msdb	     SQL Server Agentサービス
distribution レプリケーション用トランザクションデータ、レプリケーション履歴
tempdb	     一時記憶領域、ユーザーも利用可能


■オブジェクト
テーブル(制約 : NOT NULL, Primary key, Unique, Check, Forein key)
│
├デフォルト/ルール
│	テーブルの列、ユーザー定義型にバインドする
│	* ANSI準拠ではない
│
├ビュー
│	分散パーティションビューをサポート(SQL2000)
│
├トリガ
│	ビューに対して設定可能(SQL2000)
│
├インデックス
│	ビューに対して設定可能(SQL2000)
│	クラスタ化インデックス
│	非クラスタ化インデックス
│	※クラスタ化インデックスを再構築すると、
│	  - データが物理的に再構築される(オプションによる)
│	  - 自動的に非クラスタ化インデックスも再構築される
│
├ストアドプロシージャ
│
└ユーザー定義型データ


■コマンドプロンプトユーティリティ
・sqlservr	netコマンドを使ってサービスの開始/停止
・osql		ODBCを使ってクエリを送信
・BCP		インポート/エクスポート
・dtsrun	データ転送用パッケージの動作
・Rebuildm	SQL Serverの再構築


■SQL Server 2000からの新機能
・table データ型
  後の処理に備えて結果セットを格納しておくための特別なデータ型。
  table 型を使用できるのは、table 型のローカル変数またはユーザー定義関数の戻り値を定義するときだけ。

・INSTEAD OFF
  テーブルにもビューにも指定できます
  個々のトリガ動作 (INSERT、UPDATE または DELETE) に対して 1 つの INSTEAD OF トリガのみを指定できます
  INSERT ステートメントおよび UPDATE ステートメントから渡されるデータ値に対して拡張整合性チェックを実行することができます

・AFTER トリガ
  テーブルに対してのみ指定できる。ビューに対しては指定できない。
  個々のトリガ動作 (INSERT、UPDATE または DELETE) に対して複数の AFTER トリガを指定できる。
  1 つのテーブルに対して複数の AFTER トリガが指定されている場合は、sp_settriggerorder を使用して
  最初と最後に起動される AFTER トリガを定義できる。
  最初と最後に起動される AFTER トリガ以外の順序は定義できない。

・リファレンスキーの連鎖更新/削除
・text、ntext、imageを行内へ格納可能
・ログ配布
・インデックス付きのビュー

・参照整合性制約の連鎖
  ON DELETE 句および ON UPDATE 
  NO ACTION を指定すると、削除(更新)が失敗し、エラーが発生します。
  CASCADE を指定すると、削除(更新)された行を指している外部キーを持つすべての行も削除(更新)されます。 


■制約 (PRIMARY KEY)

・列制約
・テーブル制約
CREATE TABLE factory_process
	:
CONSTRAINT event_key PRIMARY KEY (event_type, event_time) )


■データベースの圧縮
DBCC SHRINKDATABASE
*DBCC SHRINKDB はSQL 2000ではサポートされない


■データベースの領域情報
・データベースサイズ
	sp_helpdb
	sp_helpfile

・データベースのファイルの使用状況
	sp_spaceused
	database_size =			--現在のDBサイズ
		  unallocated space	--DB用に割り当てられていない領域
		+ reserved		--予約領域の合計
		+ data			--データの使用領域の合計
		+ index_size		--インデックスの使用領域
		+ unused		--未使用領域の大きさ

・テーブルのサイズ、行数
	sp_spaceused @objname = 

・ログサファイルの使用状況
	DBCC SQLPERF (LOGSPACE)


■バックアップ
・復旧モデル
  - フル(完全復旧モデル)
    alter database pubs RECOVERY FULL
    ログのバックアップを行う場合に設定する。

  - 一括ログ記録(一括ログ復旧モデル)
    alter database pubs RECOVERY BULK_LOGGED
    特定の大量操作や一括コピー操作に対して、最高のパフォーマンス。
    SELECT INTO、一括ロード操作 (bcp および BULK INSERT)、CREATE INDEXは操作のみログに記録される。

  - シンプル(単純復旧モデル)
    alter database pubs RECOVERY SIMPLE

・WITH RESTART オプション
  バックアップ中に電源断等が発生した場合、回復後、「WITH RESTART」オプションを使用すると中断されたポイントからバックアップ操作が再開される


■トランザクションログファイルについて
復旧モデルが「フル」の場合
-> 1)データの追加変更が全てトランザクションログファイルに記録される
-> 2)トランザクションログファイルのサイズが増大し続ける
   ・BACKUP DATABASE dbname		→ そのまま
   ・BACKUP LOG dbname			→ 小さくなる
   ・BACKUP LOG dbname WITH NO_LOG	→ 小さくなる

* 結論:ログバックアップを行わない場合は、
   ・復旧モデルを「シンプル」にする
   ・フルバックアップ後に「BACKUP LOG dbname WITH NO_LOG」を実行する


■masterデータベースの復元 (rebuildm.exe)
1. SQL Serverのサービスを全て停止する
2. rebuildm.exe を実行する
   master、msdb が初期化される
   (C:\Program Files\Microsoft SQL Server\80\Tools\Binn\rebuildm.exe)
3. SQL Serverのサービスを開始する
4. master を復元する
5. msdb を復元する
6. (ユーザーデータベースが破損している場合は、)
   ユーザーデータベースを復元する


■BACKUP DATABASE xxx ON xxx with
RETAINDAYS,
	--このバックアップ メディア セットに上書きできるようになるまでの経過日数を指定します。
	  *EXPIREDATE または RETAINDAYS を指定しない場合、失効日は sp_configure の media retention (メディア保有時間) の設定で決まります。
FORMAT
	--このバックアップ操作に使用されるすべてのボリュームにメディア ヘッダーを書き込む必要があることを指定します。既存のすべてのメディア ヘッダーが上書きされます。
INIT
	--すべてのバックアップ セットを上書きすることを指定します。ただし、メディア ヘッダーは保存されます。
REWIND
	--SQL Server がテープを解放して巻き戻すことを指定します。
SKIP
	--バックアップ セットの上書きを防止するために BACKUP ステートメントが通常実行する、バックアップ セットの有効期限と名前の確認を無効にします。
UNLOAD
	--バックアップ完了後にテープの巻き戻しおよびアンロードを自動的に行うことを指定します。
NO_LOG | TRUNCATE_ONLY
	--ログのアクティブではない部分をバックアップ コピーをとらずに削除し、ログを切り捨てます。このオプションを使って領域を解放できます。


■RESTORE DATABASE xxx FROM xxx with
RESTRICTED_USER,
	--リストア後dbをdb_owner、dbcreator、sysadmin専用にする。
	  DBO_ONLY は、旧バージョンとの互換性を保つ目的にのみ使用可能。
PASSWORD,
	--バックアップ セットのパスワードを指定します。
MEDIAPASSWORD,
	--メディア セットのパスワードを指定します。
KEEP_REPLICATION,
	--パブリッシュされたデータベースを、そのデータベースが作成されたサーバーと異なるサーバーに
	  復元する場合、復元操作にレプリケーションの設定を保持するように指示します。
	  *ログ配布と共に動作するようにレプリケーションを設定する場合に使用します。
STOPAT,
	  DBを指定された日付と時刻の状態に復元することを指定します。
STOPATMARK,
	--指定されたマークまでの復元を指定します。マークを含むトランザクションも対象となります。
STOPBEFOREMARK
	--指定されたマークまでの復元を指定します。ただし、マークを含むトランザクションは対象外となります。


■データベースのアタッチ/デタッチ
・sp_attach_db
  明示的な sp_detach_db 操作を使用してデータベース サーバーからデタッチされたデータベースに対してだけ実行します。
  16 個より多くのファイルを指定する必要がある場合は、FOR ATTACH 句を指定した CREATE DATABASE を使用します。
  デタッチしたデータベースを元のサーバー以外のサーバーにアタッチするとき、デタッチしたデータベースのレプリケーションが有効になっている場合は、データベースからレプリケーションを削除するために sp_removedbreplication を実行する必要があります。

・sp_detach_db

・sp_attach_single_file_db
  データベースをサーバーにアタッチすると、新しいログ ファイルが作成されます。さらに、クリーンアップが実行されて、新たにアタッチされたデータベースからレプリケーションが削除されます。

・sp_attach_single_file_db
  明示的な sp_detach_db 操作を使用してサーバーからデタッチされたデータベースに対してだけ実行します。


■tempdb の利用
#テーブル名、##テーブル名を使うとtempdbにテーブルが作成される。

select total=sum(qty) into #sumtable from sales
	ローカル (他のセッションでは利用不可)
	select * from #sumtable

select total=sum(qty) into ##sumtable from sales
	グローバル (他のセッションからも利用可能)
	select * from ##sumtable


■ジョブステップ (種類)
・ActiveXスクリプト (言語: Visual Basicスクリプト、JScript、その他)
・オペレーティングシステムコマンド (CmdExec)
・Transact-SQLスクリプト (TSQL)
・レプリケーション ジョブ ステップ
    レプリケーション ディストリビュータ
    レプリケーション トランザクションログリーダー
    レプリケーション マージ
    レプリケーション キューリーダー
    レプリケーション スナップショット


■警告


■DBCC SHOWCONTIG ()
インデックスの断片化を解消する方法
a. インデックスを削除し、作成しなおす。
b. DBCC INDEXDEFRAG 
   作業中でもインデックスが利用可能。
   プロセスのどの時点でも中断させることができ、中断時に完了していた作業は保持される。
c. DBCC REINDEX
   作業中はインデックスが利用できない。


■
マスターサーバー MSX
ターゲットサーバー TSX


■アカウントの管理
SQL Server	-> sp_addlogin 'osanai'
Database	-> sp_grantdbaccess 'osanai'
		   sp_revokedbaccess 'guest'

■テーブルの変更
(列を追加して、同時にDEFAULTを設定する)
ALTER TABLE hiroshi WITH NOCHECK
  ADD AddDate datetime NULL
  CONSTRAINT AddDateDflt
  DEFAULT getdate() WITH VALUES

============================================================================

■既存のDBにファイルグループを作成し、データファイルを追加するSQLステートメントは?

ALTER DATABASE dbname ADD FILEGROUP flgroup
ALTER DATABASE dbname ADD FILE (NAME=xxx, FILENAME='d:\...') TO FILEGROUP flgroup


■データファイルを削除して、データベースを縮小するSQLステートメントは?

EXEC SHRINKDATABASE (dbname, EMPTYFILE)
ALTER DATABASE dbname REMOVE FILE xxx


■bcpを高速に行うにはどうしたらよいか。

・トランザクションログが記録されないようにする。
  (既存のレコードがなければログは記録されない)
・レコードを挿入するテーブルのインデックスを削除する。
・TABLOCKヒントを指定する。


■hanbaiデータベースをsalesデータベースとして復元するSQLステートメントは?

RECOVERY DATABASE sales FROM DISK='d:\backup\xxxx.bak'
WITH
MOVE 'hanbai'     TO 'd:\data\sales.mdf',
MOVE 'hanbai_log' TO 'd:\data\sales.ldf'


■レプリケーションにおいて、列に設定されているIDENTITYプロパティ、CHECK制約、トリガーを無効にするには。

・NOT FOR REPLICATION を設定にする。
  CREATE TABLE sales 
    (
     sale_id int
       IDENTITY(100001,1) NOT FOR REPLICATION
       CHECK NOT FOR REPLICATION (sale_id <= 200000)
    ) 
・[レプリケーションに対する制約を適用する] を off にする。


■sysadminロールのメンバーではないユーザーが所有しているジョブにOSのコマンドが含まれている。
  どのアカウントで実行されるか?

SQLAgentCMDExecアカウント


■sysadminロールのメンバーが所有しているジョブにOSのコマンドが含まれている。
  どのアカウントで実行されるか?

SQLServerAgentサービスに設定されているアカウント


■アプリケーションログにエラーメッセージを書き込むには?

・RAISERROR WITH LOG
・xp_logevent
※RAISERROR WITH NOWAIT : クライアントにメッセージを表示する。


■sysmessagesテーブルにユーザー定義のメッセージを追加するには?

sp_addmessageを使う


■正規化とは?

第一正規化:繰り返し項目の削除
第二正規化:主キーに従属する項目を別のエンティティにする
第三正規化:非キーに従属する項目を別のエンティティにする


■どのような場合にUNIQUE 制約を使用するか。

・NULLを許容する列に対して使用可能。
・1つのテーブルに複数設定可能。


■制約の種類

・PRIMARY KEY
・FOREIGN KEY
・UNIQUE
・CHECK


■RULEとCHECKの違いは?

・両者とも他のテーブルを参照できない。
・CHECKは他の列を参照できる。


■ユーザー定義データ型を作成するT-SQL文と、定義できないデータ型について。

・sp_addtype
・timestampは設定不可
※削除する:sp_droptype


■制約を追加するT-SQL文は?

  Alter table テーブル名 ADD CONSTRAINT 制約名
	FOREIGN KEY (列名)
	REFERENCES テーブル名(列名)
	ON │UPDATE { CASCADE | NO ACTION } -- CASCADE:連鎖更新 / NO ACTION:エラーになる
	   │DELETE { CASCADE | NO ACTION } 


■制約違反の検査を行わないようにして制約を追加したい。T-SQL文は?

  WITH NOCHECKオプションをつける。
  * CHECK、FOREIGN KEY制約で使用可能。


■整数のデータ型の種類とそれぞれの記憶領域のサイズは?

tinyint		1バイト
smallint	2バイト(約3万)
int		4バイト
bigint		8バイト


■ANSI null default と ANSI nulls の違いと設定方法は?

・ANSI null default
  NULLを規定にする。SET ANSI_NULL_DFLT ON

・ANSI nulls
  NULLの比較の取り扱いを決める。on:UNKNOWN。SET ANSI_NULLS ON


■既存のテーブルにDEFAULTを定義した列を追加した場合の動作は?

(T-SQL文1)
ALTER TABLE TEST1
ADD C3 DATETIME NOT NULL DEFAULT GETDATE()
・既存のレコードの[C3]列にステートメント実行日時が入力される。


(T-SQL文2)
ALTER TABLE TEST1
ADD C3 DATETIME NULL DEFAULT GETDATE()
・[C3]列にNULLが入力される。この後に入力される行については日時が入力される。


■IDENTITYプロパティの設定

CREATE TABLE new_employees
(
 id_num int IDENTITY(1,1),
) 

・IDENTITY ( seed , increment )
・SELECT MAX(IDENTITYCOL) FROM tablename
・SELECT MIN(IDENTITYCOL) FROM tablename
・DBCC CHECKIDENT (tablename)


■列定義を確認するには。
・sp_help tablename
・select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'tablename'


■一時テーブルを定義する時に使えない制約は?

FOREIGN KEY


■クラスタ化インデックスと非クラスタ化インデックス選定ポイント

クラスタ化インデックス
・選択範囲に使われる列
・グループ化に使われる列
・結合に使われる列(外部キー列)
・順次アクセスによく使われる列

非クラスタ化インデックス
・完全一致クエリーによく使われる列

  * 頻繁に更新される列に、インデックスは付けないこと。
  * クラスタ化インデックスのある列に非クラスタ化インデックスを付けると。。。
    範囲検索した場合、アクセス速度が遅くなる場合がある。
  * クラスタ化インデックスが追加または削除されると非クラスタ化インデックスは再構築される。


■複合インデックス

CREATE INDEX emp_order_ind
   ON order_emp (orderID, employeeID)


■インデックスの再構築

・CREATE INDEX インデックス名 ON ・・・DROP_EXISTING
・DBCC DBREINDEX


■FILLFACTOR と PADINDEX の違いは?

FILLFACTOR : リーフレベル
PADINDEX : 非リーフレベル


■統計情報を作成するT-SQL文は?

統計情報とは、、
・テープルのレコードがキー値に対してどのように分布しているかの情報
・オプティマイザが利用する
※複合インデックスの2列目以降に統計情報をもたせると効果的

CREATE STATISTICS 統計情報名 ON テープル名(列名)
   WITH | Fullscan	--- 全ての行を読み込んで統計情報を作成する
        | Sample	--- サンプル行を読み込んで統計情報を作成する
        | Norecompute	--- 作成後は統計情報の自動更新を行わない

UPDATE STATISTICS テーブル名(列名)


■現在のデータベース内のすべてのユーザー テーブルの中で条件を満たすすべての列に対して、統計を 1 列ずつ作成するには?

sp_createstats
text型、ntext型、image型に統計情報を持たせることはできない。


■ビューに含められない句は

Order by
Compute
Compute by
into
一時テーブル


■CREATE VIEW の「WITH CHECK OPTION」とは?

ビューに対して実行されるすべてのデータ修正ステートメントに対してviewの条件順守を強制する。
条件を満たさない場合はエラーになる。

create view test1_v2
as
select * from test1 where c2<3
WITH CHECK OPTION
go


■CREATE VIEW の定義を参照されないようにするには?

「WITH ENCRYPTION」を指定する。


■UNION 

※UNIONで結合したビューをクエリーするとき、条件にCHECK制約の列が含まれると、クエリーオプティマイザは該当するテーブルしか検索の対象にしない。
select * from test1 union select * from  test2


■戻り値を得るためのSP

create procedure osa_proc
@N INT OUTPUT
as
select @N = count(*) from test1 where c2 >= @N
go

DECLARE @N INT
SET @N = 3
exec osa_proc @N OUTPUT
SELECT @N


■SPのコンパイルを行う方法は?

WITH RECOMPILE をつけてCREATE PROCを実行 --- 毎回コンパイルされる
WITH RECOMPILE をつけてSPを実行 --- SP実行時にコンパイルされる
SP_RECOMPILE 'テープル名' --- テープルを参照するSP実行時にコンパイルされる


■SPがリコンパイルされる時は?

・SQL Serverが再起動された。
・クエリーが参照するテーブルやビューの構造が変わった。
・プロシージャキャッシュがいっぱいで削除された。
・インデックスの統計情報が新しくなった。
・実行プランが使用していたインデックスが削除された。
・クエリーが参照するテーブルのほとんどのキー値が変更された。
・クエリーが参照するテーブルに大量のレコード追加/削除が行われた。
・トリガーをもつテーブルにレコード追加/更新/削除が行われた。


■SPが再コンパイルされない時は?

・テーブルに新しいインデックスが作成された。
・クエリーの条件が大きく変わり、最適なインデックスが変化した。


■SQL Server起動時に、SPを自動実行させるには?

・SPをmasterデータベースに登録させる
・複数のSPを順番に実行させるにはネストさせる
・sp_procoption 'SP名', 'startup',  'TRUE' 
・sp_configure 'scan for startup procs', 1
  *デフォルトは0(無効)


■SPの実行を終了させすステートメントは?

RETURN


■「OUTPUT」以外の方法でSPから戻り値を得るには?  (SP内のエラー値の取得)

Create proc dbo.test10
as
RETURN 40		<--「40」を返す
go

DECLARE @ATAI int
EXEC @ATAI = test10	<-- EXEC @変数 = SP名
SELECT @ATAI


■エラーメッセージをアプリケーションログに書き込むには?

・RAISERROR ___ WITH LOG
・exec master.dbo.XP_LOGEVENT エラー番号,  'メッセージ', 'セベリティ'
  エラー番号 : 50000より大きいこと
  セベリティ : INFORMATIONAL、WARNING、または ERROR 


■ユーザー定義のメッセージをクライアントに返すには?

PRINT 'メッセージ'


■トリガーで使われる2つの特別なテーブルとは?

insertedテーブル : INSERT/UPDATE の実行で影響を受けた行のコピーを格納
deletedデーブル : DELETE/UPDATE の実行で影響を受けた行のコピーを格納


■レコードの有無を確認するステートメントは?

EXISTS

(例) If NOT EXISTS (select * from test1 where c1 = 'HH')
     レコードがなかった場合に実行するステートメント


■トリガー内で、ある列が更新されたかどうか確認するには?

IF UPDATE(列名)	<--IF文で使う


■トリガー内で、直前のステートメントで影響を受けた行数を確認するには?

@@ROWCOUNT


■トリガーのネスト/再帰を有効にするには?

・sp_configureで、nested triggers を1にする
・sp_dboptionで、recursive triggers をTURUEにする


■フルテキストインデックスを構築するには?

sp_fulltext_database
sp_fulltext_catalog startfull		全部
                    startincremental	差分(timestampが必要)
sp_fulltext_table
sp_fulltext_column


■フルテキストインデックスの状態を調べるには?

DATABASEPROPERTY (DB名, 'IsFullTextEnabled')
	DBでフルテキストインデックスが有効か調べる。
OBJECTPROPERTY (テーブルID, 'TableHasActiveFullTextIndex')
	テーブルにアクティブなフルテキストインデックスがあるか調べる。
COLUMNPROPERTY (テーブルID, 列名, 'IsFulltextIndexed')
	列がフルテキストインデックスに登録されているか調べる。


■フルテキストインデックス:ノイズ語を登録するファイル

noise.jpn / noise.eng


■フルテキストインデックス:クエリ

where CONTAINS (列名, '検索条件')	<-- AND,OR,NEARが使える
where FREETEXT (列名, '検索文字列')

* CONTAINS
  近似語句検索が可能。大文字小文字を区別しない。
* FREETEXT
  CONTAINSよりも精度が低い


■フルテキストインデックス:「KEY」と「RANK」を得るには?

from CONTAINSTABLE (テーブル名(列名), '検索条件')
from FREETEXTTABLE (テーブル名(列名), '検索文字列')


■_____に入る単語は?
・IDENTITYプロパティが設定されている列は_____キーワードを使って参照できる。
・ROWGUID プロパティが設定されている列は_____キーワードを使って参照できる。

IDENTITYCOL
ROWGUIDCOL


■列追加のT-SQLは?

alter table test1
add c4 int not null identity(1,1)


■列別名の指定方法(2)

・列名+列名 AS 列別名
・列別名 = 列名+列名


■データ型の変換(3)

CAST (変換後のデータ型, 式, スタイル)
CONVERT (式 AS 変換後のデータ型)
STR (数値, )	<--数値データから変換された文字データを返します


■比較
等しくない		!=
より大きくない		!> (<=)
ワイルドカード(?)		_
A-EまたはL-Mで始まる文字	[A-EL-M]%
A-E以外で始まる文字		[^A-E]%

ワイルドカードを検索する場合	[_]
ESCAPEを使う		'PC\_' ESCAPE '\'

サブクエリーで使う		EXIT、IN、ANY、ALL


■内部結合/外部結合のステートメント

INNER JOIN
	一致するレコードだけを出力
LEFT OUTER JOIN
	左テーブルのレコード全てを出力。条件に合わない場合はNULLを出力

(例)
select a.c1, a.c2, a.c3, b.c3 from test1 a INNER JOIN      test2 b ON a.c2=b.c2
select a.c1, a.c2, a.c3, b.c3 from test1 a LEFT OUTER JOIN test2 b ON a.c2=b.c2


■CROSS JOINとは?

2つのテーブルの全てのレコードの組み合わせを出力


■UNIONを使う際の注意点

・対応する列のデータ型が互換性があること。
・列数が同じ。
・ORDER BY は最初のSELECT文中の列を指定
・ALL句で重複する行も表示

(例) select c1,c2 from test1 UNION [ALL] select c1,c2 from test2 ORDER BY c2


■列のデフォルト値をそのまま入力するT-SQL文は?

insert test2 DEFAULT VALUES
insert test2 (c1, c2) values ('hiroshi', DEFAULT)

次の場合のみ DEFAULT VALUES を使用可能
・DEFAULTプロパティが設定されている
・NULLが許可されている
・timestamp


■SELECT INTO使用時の注意点
・同名のテーブルがないこと
・select into/bulkcopyオプションが有効になっていること
  (一時テーブルを使う場合は無効でもよい)


■WHEREとHAVINGの違いは?

GROUP BYを使う
  前にレコードを絞り込む --- WHERE
  後にレコードを絞り込む --- HAVING


■TOP n の使い方

select TOP 1 WITH TIES * from test1 order by c2 desc
select TOP 1 PERCENT   * from test1 order by c2 desc


■ROLLUP、CUBE、COMPUTE BY

ROLLUP : 一方向に集計
CUBE : 両方向に集計
COMPUTE BY : 集計結果を出力


■カーソルの種類とそれぞれの特徴は?

・動的カーソル (センシティブカーソル)
  スクロールする度に変更が反映される。
  リソースを多く消費する。

・静的カーソル (インセンシティブカーソル)
  結果セットをtempdbに作成する。
  他のユーザーが更新/追加/削除したレコードは認識できない。

・キーセットドリブンカーソル
  結果セットのキー値(キーセット)をtempdbに作成する。
  他のユーザーが追加したレコードは認識できない。


■データの更新が可能なカーソルの属性を定義するには?

・DECLARE カーソル名 CURSOR 
・DECLARE カーソル名 CURSOR DYNAMIC


* DECLARE CURSOR は、
  - SQL-92 標準に基づく構文と、
  - Transact-SQL の拡張機能のセット
  を使用する構文の両方で指定できます。

・SQL-92 構文
  DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR 
  FOR select_statement 
  [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ] 

  INSENSITIVE
  このカーソルで修正を行うこともできません

  SCROLL
  すべてのフェッチ オプション (FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE) が利用できることを指定
  SCROLL を指定しない場合は、NEXT オプションだけがサポート

  UPDATE
  列リストを伴わずに UPDATE を指定した場合は、すべての列を更新できます。

・Transact-SQL 拡張構文
  DECLARE cursor_name CURSOR 
  [ LOCAL | GLOBAL ] 				< が指定されている XML 要素に変換
	XML_F52E2B61-18A1-11d1-B105-00805F49916B
	

・XMLDATA
  XML-Data スキーマが返されることを指定します。このスキーマは、ドキュメントの前にインライン スキーマとして付加されます。

・ELEMENTS
  ELEMENTS オプションを指定すると、列が副要素として返されます。指定していない場合は、XML 属性にマップされます。このオプションは、AUTO モードでのみサポートされます。


■ステートメント(select * from "hiroshi osanai")を有効にするには?

set QUOTED_IDENTIFIER on  (Default:off)


■クエリーの指定キャッシュ方法

・sp_execute
  exec sp_executesql N'select * from test1 where c1=@t', N'@t varchar(7)', @t='AAAAA'
  (Unicode 文字列であること)	
・sp_prepare / sp_execute

クエリーのキャッシュ方法
  自動キャッシュ -------	アドホックバッチキャッシュ
			自動パラメータ化
  指定キャッシュ -------	sp_executesql
			sp_prepare / sp_execute


■salesデータベースの変更を行った。SQL Serverが故障したときに備えてバックアップする必要があるデータベースは?
A. □ sales
B. □ master
C. □ msdb
D. □ model

Ans.) A, B


■過剰なログ動作を起こす状態(3つ)
・インデックスがあるテーブルへのデータのロード。
・大量の変更を行うトランザクションの実行。
・WITH LOGオプション付きのWRITETEXT、UPDATETEXTステートメントの実行。
  (デフォルトはログに記録しない)


■NEWID()関数を使う場合の注意点
・NEWID()列は、uniqueidentifierデータ型であること


■データ整合性
  ドメイン整合性	DEFAULT / CHECK
  エンティティ整合性	IDENTITY / PRIMARY KEY
  参照整合性		FOREIGN KEY / REFERENTIAL


■DEFAULTと一緒に使えないプロパティとデータ型は?
・IDENTITYプロパティ
・timestampデータ型

* システム提供の値↓も指定可能
  user
  current_user
  session_user
  system_user
  current_timestamp


■一時的に制約を無効にするステートメントは?

alter table テーブル名 NOCHECK CONSTRAINT 制約名
  * CHECK、FOREIGN KEY制約で使用可能。


■結果セットを返すのに使用されるI/Oを表示するには?

set STATISTICS IO on


■オプティマイザヒントの使用

select * from test1 WITH (INDEX(0 | 1 | インデックス名)) where ...


■ユーザー定義のトランザクションに対する制限

・一時テーブルを作成するSPを入れてはいけない。
・DATABASEに対する操作(sp_dboption、alter databaseなど)のステートメントは不可。


■View

・viewの作成によりセキュリティを確保できる場合がある。
・外部結合を避ける。


■オブジェクトの従属関係を確認するには?

sp_depends 'オブジェクト名'
* オブジェクトは、テーブル、ビュー、ストアド プロシージャ、トリガのいづれか。


■トリガの中に「BEGIN TRAN」ステートメントがなくても「ROLLBACK TRAN」を記述できるか?

できる。トリガは暗黙のトランザクションなので。明示的に「BEGIN TRAN」を記述しても良い。
トランザクション内でトリガがロールバックされると、トリガを含むトランザクションもロールバックされる。


■トリガの無効化ステートメント

alter table test1
ENABLE  | TRIGGER |トリガ名
DISABLE |         | ALL


■クエリーを
・SELECT * 〜での、「*」は避ける
・WHERE句の検索条件は、肯定形を使う。
	* 複数の検索条件がある場合、NOT、AND、ORの順で評価される


■ステートメントの例
IF
  begin
   :
  end
ELSE
  begin
   :
  end
WHILE
  begin
   :
  end


CASE
  WHEN....THEN....
  WHEN....THEN....
  ELSE
END


EXECUTE ('USE ' + @dbname + ' SELECT * FROM ' + @tblname)


■インデックスと PRIMARY KEY / UNIQUE 制約との関係について。

・デフォルトのインデックスの種類は、
PRIMARY KEY ---	CLUSTERED 
UNIQUE	    ---	NONCLUSTERED

CONSTRAINT constraint_name ]
    { [ { PRIMARY KEY | UNIQUE }
        [CLUSTERED | NONCLUSTERED]
        { ( column [ ,...n ] ) }
        [ WITH FILLFACTOR = fillfactor ]


■EXISTSが返す値は?
  SELECT * FROM test1 WHERE EXISTS (select * from test2 where test1.c4=test2.c2)

サブクエリを満たすレコードが存在すれば「TRUE」
サブクエリを満たすレコードがなければ「FALSE」
を返す。

* このクエリと同じ
  select DISTINCT test1.c2 from test1 join test2  on test1.c4=test2.c2


■SET IDENTITY_INSERT on とは?
テーブルの ID 列(IDENTITYプロパテイが設定された列)に明示的な値を追加することを許可します。
Default:off


■AFTERトリガとは?
AFTER トリガは、トリガの動作 (INSERT、UPDATE、または DELETE) の後および制約処理の後に起動されます。
AFTER キーワードまたは FOR キーワードのいずれかを指定して AFTER トリガを要求できます。FOR キーワードは、AFTER キーワードと同じ働きをするため、FOR キーワードを使用するトリガも AFTER トリガとして分類されています。

CREATE TRIGGER TableBDeleteTrig ON TableB
AFTER DELETE
AS ...


■INSTEAD OF トリガとは?
INSTEAD OF トリガは、トリガを起動する動作の代わりとして、制約が実行される前に起動されます。 
各テーブルまたはビューは、トリガの動作 (UPDATE、DELETE、および INSERT) ごとに 1 つの INSTEAD OF トリガを持つことができます。1 つのテーブルは、トリガの動作ごとに複数の AFTER トリガを持つことができます。

CREATE TRIGGER TableAInsertTrig ON TableA
INSTEAD OF INSERT
AS ...

! NOTICE !

since 1999/02/01
HomePage Address http://www.osanai.co.jp/hiroshi/

(C)Copyright 1998 Hiroshi Osanai. All rights reserved.