2016-06-16 20 views
2

Iは第3のテーブルにすべての相対情報(複数行)をトリガし、コピーすることができ、テーブルの単一の行を削除しようとしています。単一のSQL Triggerを使用して、単一の削除から複数の行をコピーしますか?


表:学生

NAME  AGE 
----- ------ 
Mark  19 
Jim  21 
Scott 22 

表:グレード

NAME  GRADE 
----- ------ 
Mark  95 
Mark  98 
Jim  60 
Scott 100 
Scott 79 
Scott 77 

表:バックアップ(私が何をトリガ私は下に簡単な例を構築してきました達成するため)

SQL> DELETE FROM STUDENTS WHERE NAME='MARK'; 
SQL> SELECT * FROM BACKUP; 

NAME  AGE  GRADE 
----- ------ ------ 
Mark  19  95 
Mark  19  98 

上記の例では、行 "Mark ... 30"を削除すると、 "Mark"を名前として2番目のテーブルの2行が削除されます。私はこれを行う方法がわかりません。私はトリガコードをコンパイルすることができますが、 "DELETE FROM STUDENTS WHERE NAME = 'MARK'"を呼び出すと、多列エラーが返されます。以下は、1行の結果だけを受け入れるを選択しその中に作るので、あなたはあまりにも多くの行を取得する私のコード

マイコード

CREATE OR REPLACE TRIGGER save_the_grades 
BEFORE DELETE 
ON grades 
FOR EACH ROW 

DECLARE 
    v_grade number(3); 
BEGIN 

SELECT grade INTO v_grade FROM Grades WHERE Names=:old.name; 

INSERT INTO backup 
(name, age, grade) 
VALUES 
(:old.name, :old.age, v_grade); 
END; 
+0

削除されたレコードを残しておきたい場合は、より良いシステムではテーブル行にフラグを付けることはできませんし、削除されたとしてフラグが立てられます。 –

+0

StackOverflowの怒りが私にもたらされる危険性がありますが、これはトリガーが必要な宿題に関連しています。しかし、この問題はこれよりはるかに大きいです。私はそれをどうやって行うのかを感じてみようとしています。 – Noah

+1

これは、MySQL、SQL Server、およびOracleのためにこれをタグ付けしました。それらは3つの異なる手続き型言語拡張とトリガーを定義する3つの非常に異なる構文のセットを持つ3つの異なるデータベースです。残りの質問から推測するには、Oracleを使用しているので、MySQLとSQL Serverのタグを削除する必要があります。 –

答えて

0

です。選択と挿入を組み合わせてみてください

INSERT INTO backup 
(name, age, grade) 
SELECT :old.name, :old.age, grade FROM Grades WHERE Names=:old.name; 
関連する問題