課題一覧

  1. トランザクションの開始を宣言した後、生産表から製品番号S1 のデータを削除し、SELECT 文によって削除が成功していることを確認しなさい。更にトランザクションをロールバックし、生産表の製品
    番号S1 のデータがどうなったか確認しなさい。

  2. トランザクションの開始を宣言した後、生産表から製品番号S1 のデータを削除し、SELECT 文によって削除が成功していることを確認しなさい。更にトランザクションをコミットし、生産表の製品番号S1 のデータがどうなったか確認しなさい。
  3. データを前実習で作ったreset.sql により初期化し、SSMSE でクエリウィンドウを新たに1 つ開く(最初に開いてあったクエリウィンドウQuery1、新たに開いたものをQuery2 と呼ぶことにする。)。両クエリで表2 のデッドロック操作を行え(Query1 でTRANSACTION 1 を行い、Query2 でTRANSACTION2 を行うこと)。ロールバックさせられるのはTRANSACTION 1 か、2 のどちらか。
    確認の後、両トランザクションをロールバックしなさい。

  4. 表2 のデッドロック操作において、TRANSACTION 2 をBEGIN した直後に、生産表の全データを表示させる、クエリを実行しなさい。
    その後、TRANSACTION 1 をコミットしなさい。どのようになるか答えなさい。

  5. データを前実習で作ったreset.sql により初期化し、製品表の全カラム、全データを単価の高い順に持つカーソルcur_seihin を定義しなさい。
  6. cur_seihin からデータを1 つずつ、計3 個取り出せ。その後、そこから3 つ後のデータを取り出せ。さらに前方に向かって(PRIOR)cur_seihin からデータを1 つずつ、計3 個取り出しなさい。
  7. cur_seihin を閉じ、削除しなさい。
  8. 生産表の工場番号と工場住所を重複なく(工場番号を重複なく表示すれば工場住所は重複ないものとする)、工場番号順に持つカーソルを2 つ定義しなさい(同じもの)。
  9. cur_seisan1、cur_seisan2 を定義後、工場番号F1 のデータをF9 に変更した場合(cur_seisan1 についてはOPEN 後、cur_seisan2 についてはOPEN 前に変更)、FETCH によって取り出されるデータの違いについて(実際に全データを順に取り出し、なぜそうなるか) 答えなさい。また、cur_seisan1、cur_seisan2 を閉じ、削除しなさい。
  10. 名古屋で在庫している製品の製品番号とそれを生産している工場番号からなるカーソルcur_nagoya を定義し、データを1 つずつ最後まで自動的に取り出すFETCH 文を実行しなさい。また、cur_nagoyaを閉じ、削除しなさい。
  11. 全てのコマンドを実行した後、reset.sql を使用してデータを元の状態に戻しておく

解答一覧

1.トランザクションの開始の宣言をした後、生産表から製品番号S1のデータを削除し、SELECT文によって削除が成功しているか確認しなさい。更にトランザクションをロールバックし、生産表の製品番号S1のデータがどうなったか確認しなさい。

構文例:USE nagano_DB
/* 削除後に使用 */
--SELECT * FROM seisan

BEGIN TRAN
DELETE FROM seisan WHERE prod_id='S1'
構文例:USE nagano_DB
/* ロールバック後に使用 */
--SELECT * FROM seisan
BEGIN TRAN

ROLLBACK TRAN

2.トランザクションの開始の宣言をした後、生産表から製品番号S1のデータを削除し、SELECT文によって削除が成功してるか確認しなさい。更にトランザクションをコミットし、生産表の製品番号S1のデータがどうなったか確認しなさい。

構文例:--削除時のコマンド--
USE nagano_DB
/* 削除後に使用 */
--SELECT * FROM seisan

BEGIN TRAN
 DELETE FROM seisan WHERE prod_id='S1'
構文例:--コミット時のコマンド--
USE nagano_DB

BEGIN TRAN
/* 使用しない削除のコマンド */
 --DELETE FROM seisan WHERE prod_id='S1'
COMMIT TRAN

3.データを前実習で作ったreset.sqlにより初期化し、SSMSWでクエリウィンドウを新たに1つ開く(最初に開いていたクエリウィンドウQuery1でTRANSACTION1を行い、新たに開いたものをQuery2と呼ぶ)。
両クエリで表2のデッドロック操作を行え(Query1でTRANSACTION1を行い、Query2でTRANSACTION2を行うこと)。
ロールバックさせられるのはTRANSACTION1か、2のどちらか。確認の後、両トランザクションを ロールバックしなさい。

構文例:--TRANSACTION1--
USE nagano_DB

BEGIN TRANSACTION
 UPDATE seisan SET fact_address='Tokyo1'
	WHERE fact_address='Tokyo'


UPDATE seisan SET fact_address='Kanagawa1'
 WHERE fact_address='Kanagawa'
構文例:--TRANSACTION2--

USE nagano_DB

BEGIN TRANSACTION
 UPDATE seisan SET prod_qty=50
  WHERE fact_id='F2' AND prod_id='S1'

UPDATE seisan SET prod_qty=30
  WHERE fact_id='F1'
  AND prod_id='S1'

4.表2のデッドロック操作において、TRANSACTION2をBEGINした直後に、生産表の全データを表示させる、クエリを実行しなさい。
その後、TRANSACTION1をコミットしなさい。

構文例:USE nagano_DB

--TRANSACTION1--

BEGIN TRANSACTION

 UPDATE seisan SET fact_address='Tokyo1'
	WHERE fact_address='Tokyo'

	--コミット時に使う--
	--COMMIT TRANSACTION
構文例:--TRANSACTION2--

BEGIN TRAN

 UPDATE seisan SET
  prod_qty=50
  WHERE fact_id='F2'
  AND prod_id='S1'
UPDATE seisan SET
  prod_qty=30
  WHERE fact_id='F1'
  AND prod_id='S1'

5.データを前実習で作ったreset.sqlにより初期化、製品表の全カラム、全データを単価の高い順にもつカーソルcur_seihinを定義しなさい。

構文例:--初期化完了
USE nagano_DB

DECLARE cur_seihin INSENSITIVE SCROLL CURSOR FOR SELECT * FROM seihin ORDER BY price DESC

6.cur_seihinからデータを一つずつ、計三個取り出せ。そのあと、そこから三つ後ろのデータを取り出せ。さらに前方に向かって(PRIOR)cur_seihinからデータを一つずつ、計三個取り出せ。

構文例:--最初の1回目--
FETCH FIRST FROM cur_seihin

--2、3回目 最後のデータから1つ順に進む--
FETCH next FROM cur_seihin

--4回目最後から+3個進んだデータ--
FETCH RELATIVE 3 FROM cur_seihin

--5,6,7回目 最後から一個前戻って進む--
FETCH RELATIVE -1 FROM cur_seihin


結果
--1回目--
prod_id name           type price       condition
------- -------------- ---- ----------- ---------
S3      Stereo         M    400         0

(1 行処理されました)

--2回目--
prod_id name           type price       condition
------- -------------- ---- ----------- ---------
S1      TV             A    200         0

(1 行処理されました)

--3回目--
prod_id name           type price       condition
------- -------------- ---- ----------- ---------
S4      Stereo         P    150         1

(1 行処理されました)

--4回目--
prod_id name           type price       condition
------- -------------- ---- ----------- ---------
S6      RadioCassetto  P    20          2

(1 行処理されました)

--5回目--
prod_id name           type price       condition
------- -------------- ---- ----------- ---------
S5      RadioCassetto  E    30          0

(1 行処理されました)

--6回目--
prod_id name           type price       condition
------- -------------- ---- ----------- ---------
S2      Radio          Y    50          0

(1 行処理されました)

--7回目(最後)--
prod_id name           type price       condition
------- -------------- ---- ----------- ---------
S4      Stereo         P    150         1

(1 行処理されました)

7.cur_seihinを閉じ、削除する

構文例:--カーソルを閉じる--
CLOSE cur_seihin

--カーソルを削除--
DEALLOCATE cur_seihin

8.生産表の工場番号と工場住所を重複なく(工場番号を重複なく表示すれば工場住所は重複ないものとする)、工場番号順にもつカーソルを2つ定義しなさい(同じもの)

構文例:--cur_seisan1--
DECLARE cur_seisan1 INSENSITIVE SCROLL CURSOR FOR SELECT DISTINCT fact_id,fact_address FROM seisan ORDER BY fact_id

--cur_seisan2--
DECLARE cur_seisan2 INSENSITIVE SCROLL CURSOR FOR SELECT DISTINCT fact_id,fact_address FROM seisan ORDER BY fact_id

9.cur_seisan1,cur_seisan2を定義後、工場番号F1のデータをF9に変更した場合
(cur_seisan1についてはOPEN後、cur_seisan2についてはOPEN前に変更)、FETCHによって取り出されるデータの違いについて(実際にデータを順に取り出し、なぜそうなるか)答えなさい。また、cur_seisan1、cur_seisan2を閉じ、削除しなさい

構文例:--データベースの移動
USE arita_DB

OPEN cur_seisan1--cur_seisan1をOPEN

--データの更新
UPDATE seisan SET fact_id='F9' WHERE fact_id='F1'

OPEN cur_seisan2--cur_seisan1をOPEN

--データの取り出し
FETCH NEXT FROM cur_seisan1
	WHILE @@FETCH_STATUS=0
	BEGIN FETCH NEXT FROM cur_seisan1
	end

FETCH NEXT FROM cur_seisan2
	WHILE @@FETCH_STATUS=0
	BEGIN FETCH NEXT FROM cur_seisan2
	end

	/*FETCH NEXT FROM <カーソル名>
	WHILE @@FETCH_STATUS=0
	BEGIN FETCH NEXT FROM <カーソル名>
	こう記述することでデータを順番に取り出せる*/

--カーソルを閉じる
CLOSE cur_seisan1
CLOSE cur_seisan2

--カーソルの削除
DEALLOCATE cur_seisan1
DEALLOCATE cur_seisan2

10. 名古屋で在庫している製品の製品番号とそれを生産している工場番号からなるカーソルcur nagoya を定義し、データを1 つずつ最後まで自動的に取り出すFETCH 文を実行しなさい。また、curnagoyaを閉じ、削除しなさい。

構文例:--データベースの移動
USE arita_DB

--カーソルの作成
DECLARE cur_nagoya INSENSITIVE SCROLL CURSOR FOR
	SELECT zaiko.prod_id,fact_id FROM zaiko JOIN seisan
	ON zaiko.prod_id=seisan.prod_id
	WHERE stor_address='nagoya'

--カーソルのオープン
OPEN cur_nagoya

----データの取り出し
FETCH NEXT FROM cur_nagoya
	WHILE @@FETCH_STATUS=0
	BEGIN FETCH NEXT FROM cur_nagoya
	end

--カーソルを閉じる・削除する
CLOSE cur_nagoya
DEALLOCATE cur_nagoya