(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 CLIENT
go
わざと、主キーを衝突させてエラーを起こしてみる。
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 CLIENT
go
begin 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 CLIENT
go
insert into CLIENT values ( 4, 'Test4', '0901234444')
insert into CLIENT values ( 5, 'Test5', '0901235555')
データベースのユーザに、データベースの利用権限を設定するコマンドを紹介する。
権限に指定可能なキーワード:
ALL(全て)・SELECT・INSERT・UPDATE・DELETE・REFERENCESなど
ユーザー:
データベースを利用する際のユーザー名で権限を設定するユーザを指定する。
PUBLIC というキーワードでユーザを指定すると、全データベースユーザに対して権限を設定できる。
SQLサーバに接続し、以下を行う。
以下の演習は、2名以上が組み(チーム)になって行うこと。組かたは各自に任せる。
相手が見つけられない人は、こちらで指示するので申し出るように。
コンマとドット(ピリオド)が見わけにくいのでFONTを拡大してよく確認すること。
ここまでで、今回の演習は終了です。