1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | create table refriger (foodname char (16), foodtype char (4), expirationdate integer , thenumber char (16), foodcondition char (4), foodnumber int not null primary key , modType char (4) ); delimiter // create trigger alarm_trigger after update on refriger for each row begin insert into refriger values (old.foodname, old.foodtype, old.expirationdate, old.thenumber, old.foodcondition,old.foodnumber, '수정' ); end // delimiter ; insert into refriger(foodname, foodtype, expirationdate, thenumber, foodcondition, foodnumber) values ( "닭다리" , "육류" , 7, "300g" , "냉장" , 1); insert into refriger(foodname, foodtype, expirationdate, thenumber, foodcondition, foodnumber) values ( "돼지목살" , "육류" , 7, "300g" , "냉장" , 2); insert into refriger(foodname, foodtype, expirationdate, thenumber, foodcondition, foodnumber) values ( "브로콜리" , "야채" , 21, "1개" , "냉장" , 3); insert into refriger(foodname, foodtype, expirationdate, thenumber, foodcondition, foodnumber) values ( "피망" , "야채" , 7, "300g" , "냉장" , 4); insert into refriger(foodname, foodtype, expirationdate, thenumber, foodcondition, foodnumber) values ( "채끝살" , "육류" , 7, "300g" , "냉장" , 5); insert into refriger(foodname, foodtype, expirationdate, thenumber, foodcondition, foodnumber) values ( "대패삼겹살" , "육류" , 60, "500g" , "냉동" , 6); update refriger set expirationdate = 5 where foodname = "닭다리" ; select * from refriger; 이렇게 만들었는데 이걸 하면 can't update table in stored function / trigger because it is already used by statement 라는 오류가 발생합니다. |
인터넷에서 검색해보니까
"발생의 내용은 결국 트리거 사용함에있어서 재귀용법은 사용이 안됩니다. trgtlbltmp 트리거가 걸려있는 tnltmp 테이블에 trgtnltmp 트리거는 insert, update, delete 는 할수없습니다.
에러문구는 그에 따른 문법오류를 말합니다."
라고는 하는데 제 생각에는 책에서 한거처럼하면 서로 데드락 안걸리고 사용할수있게 한게 new와 old를 사용해서 하면 가능한거처럼 되있는데
old를 사용해도 왜 재가 만든건 안되는지 이해가 안되네요 ㅠㅠ 책에서는 가능한데 왜 제가만든건 안되는지 이해가 안갑니다.
책에서는
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | use sqlDB; drop table buyTbl; create table backup_userTbl ( userID CHAR (8) NOT NULL PRIMARY KEY , name VARCHAR (10) NOT NULL , birthYear INT NOT NULL , addr CHAR (2) NOT NULL , mobile1 CHAR (3), mobile2 CHAR (8), height SMALLINT , mDate DATE , modTyoe char (2), modDate date , modUser varchar (256) ); delimiter // create trigger backUserTbl_UpdateTrg after update on userTbl for each row begin insert into backup_userTbl values ( old.userID, old. name , old.birthYear, old.addr, old.mobile1, old.mobile2, old.height, old.mdate, '수정' , curdate(), current_user ()); end // delimiter ; |
이렇게 되있는데 다른게 없는게 같은데 안되서 너무 답답합니다 ㅜㅜ 5시간 넘게 아무리 머리를 굴려도 해결이 안되네요 고수님들 부탁드립니다 ㅠㅠ