(2005.11 更新)
(SQLServerを直接利用する実習は今回で最後の予定です。しかし念のため次回以降もパスワードは忘れないようにしてください。)
トランザクションとは、データベースでデータを処理する為の一連の処理手続きのことです。
例えば、これまでSQLサーバ上で実行したSQL文、
insert into SHIILE values ( '2003/12', 'ABC', 10)
update ZAIKO set KAZU=KAZU+10 where NAME = 'ABC'
select * from ZAIKO
などもトランザクションといえます
ただし、これまでの演習では、実は、
1つのSQL文 = 1つの処理 = 1つのトランザクション
として処理されていました。
つまり、上記のSQLの例では、 insert と update と select の各処理は、
 一つの命令の処理が完了 → データベースが更新される → 次の命令を処理
というように動作します。
 しかし、これでは問題が生じる場合があります。例えば、insert で品物の入庫数を記録後にデータベースや通信回線に異常が生じて
update が実行時エラーになったとします。
 すると、入庫数は記録されているのに、在庫数の値が増えていないという矛盾が生じてしまいます。
そこで、上記の処理の様に、複数のSQL文を、
複数のSQL文 = 1連の処理 = 1つのトランザクション
としてデータベースで一括して処理する方法が必要になります。
要点:
■トランザクションの実行中にエラーが生じると、トランザクションの処理全体が失敗したことになり、データベースはトランザクションの実行前の状態の元に戻ります。
■トランザクションの実行中は、他のトランザクションが割り込んで処理されることはありません。
■トランザクションの実行中に、エラー処理をしてデータベースを処理前の状態に戻す(ロールバック)ことができます。
マルチユーザ環境でのデータベースの問題点とその対処法について説明する。
SQLServerでトランザクション処理を行う為のコマンド
例)
BEGIN TRANSACTION
SQL文
SQL文
SQL文
COMMIT
例)
BEGIN TRANSACTION
SQL文
SQL文
SQL文
エラーが発生したら、ROLLBACK
SQL文
SQL文
COMMIT
SQLサーバに接続し、以下を行う。
演習室PCとは別の場所にあるSQLサーバにネットワークで接続し、サーバー上のデータベースで作業を行う。
osql -S cyteen -U アカウント
    use db???????go
    CLIENT表を作成し、IDフィールドを主キーに設定する。
    SQLServerでは、constraintキーワードで制約名(CLIENT_ID、他の制約名と重複しない名前)を指定する必要がある。
    (注意:下線の部分、char()ではカッコとrの間に空白を入れてはならない)
    
    create table CLIENT (ID integer not null constraint CLIENT_ID primary key, NAME char(12) not null, TEL char(11))
    go| ID | NAME | TEL | 
| 登録番号 主キー  | 
          名前 12文字までの'文字'データ 入力必須  | 
          電話番号 11文字までの'文字'データ  | 
        
名前の部分は12文字以内、電話番号の部分は11文字以内で各自で適当にデータを考えて指定すること. IDの値は変更しないように。
    insert into CLIENT values ( 1, 'Test1', '0901231111')go
    select * from CLIENTgo
    わざと、主キーを衝突させてエラーを起こしてみる。insert into CLIENT values ( 2, 'Test2', '0901232222')
    insert into CLIENT values ( 1, 'Test3', '0901231234')insert into CLIENT values ( 3, 'Test3', '0901233333')go
    2つ目のデータの追加でエラーが起きたので、CLIENT表はどうなったかを確認
    select * from CLIENTgobegin transaction
    insert into CLIENT values ( 4, 'Test4', '0901234444')
    rollback (トランザクション開始前の状態に復帰させる)
    insert into CLIENT values ( 5, 'Test5', '0901235555')
    go
    rollbackにより、11行目のデータ(ID番号4)は登録されていないことを確認(一方のID番号5は登録されている)
    select * from CLIENTgo
    insert into CLIENT values ( 4, 'Test4', '0901234444')
    insert into CLIENT values ( 5, 'Test5', '0901235555')
    データベースのユーザに、データベースの利用権限を設定するコマンドを紹介する。
 権限に指定可能なキーワード:
   ALL(全て)・SELECT・INSERT・UPDATE・DELETE・REFERENCESなど
 ユーザー:
   データベースを利用する際のユーザー名で権限を設定するユーザを指定する。
   PUBLIC というキーワードでユーザを指定すると、全データベースユーザに対して権限を設定できる。
SQLサーバに接続し、以下を行う。
以下の演習は、2名以上が組み(チーム)になって行うこと。組かたは各自に任せる。
相手が見つけられない人は、こちらで指示するので申し出るように。
コンマとドット(ピリオド)が見わけにくいのでFONTを拡大してよく確認すること。
ここまでで、今回の演習は終了です。