내가 만든 Prepared Statement를 실행할 수있는 방법을 찾을 수 있다면 다음 코드를 사용하여 Insert Before 트리거를 만들려고합니다. 방아쇠.Prepared Statement with Trigger with MySQL with
트리거 내에서 준비된 명령문을 실행할 수있는 다른 방법이 있습니까? 감사합니다
BEGIN
SET @CrntRcrd = (SELECT AUTO_INCREMENT FROM information_schema.TABLES
WHERE TABLE_SCHEMA=DATABASE()
AND TABLE_NAME='core_Test');
SET @PrevRcrd = @CrntRcrd-1;
IF (NEW.ID IS NULL) THEN
SET NEW.ID = @CrntRcrd;
END IF;
SET @PrevHash = (SELECT Hash FROM core_Test WHERE [email protected]);
SET @ClmNms = (SELECT CONCAT('NEW.',GROUP_CONCAT(column_name
ORDER BY ORDINAL_POSITION SEPARATOR ',NEW.'),'')
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'core_Test');
SET @Query = CONCAT("SET @Query2 = CONCAT_WS(',','",@PrevHash,"','", @CrntRcrd, "',", @ClmNms, ");");
PREPARE stmt1 FROM @Query;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
SET NEW.Hash = @Query2;
END
UPDATE/설명 : 데이터는 아래 테이블에 저장됩니다. 각 인서트
+------------+-----+------+----------------+
| Record (AI)| ID | Data | HASH |
+------------+-----+------+----------------+
| 1 | 1 | ASDF | =DHFBGKJSDFHBG | (Hash Col 1)
| 2 | 2 | NULL | =UEGFRYJKSDFHB | (Hash Col 1 + Col 2)
| 3 | 1 | VBNM | =VKJSZDFVHBFJH | (Hash Col 2 + Col 3)
| 4 | 4 | TYUI | =KDJFGNJBHMNVB | (Hash Col 3 + Col 4)
| 5 | 5 | ZXCV | =SDKVBCVJHBJHB | (Hash Col 4 + Col 5)
+------------+-----+------+----------------+
테이블 전체 새로운 행의 CONCAT()에 대한 투과성 행의 해시 값을 appeding하여 그 행에 대한 해시 값을 생성 명령 후 다시 해싱 전체 문자열. 그러면 응용 프로그램의 다른 부분에서 감사 용도로 사용하기 위해 해시 값에 대한 실행 기록이 생성됩니다.
내 제한 조건은 INSERT 행을 나중에 업데이트 할 수 있기 전에 수행해야한다는 것입니다.
UPDATE : 나는 동적으로 CONCAT하려면 열 이름을 전달하는 방법을 찾을 수있을 때까지 나는 현재 다음과 같은 코드를 사용하고는 :
BEGIN
SET @Record = (
SELECT AUTO_INCREMENT FROM information_schema.TABLES
WHERE TABLE_SCHEMA=DATABASE()
AND TABLE_NAME='core_Test' #<--- UPDATE TABLE_NAME HERE
);
SET @PrevRecrd = @Record-1;
IF (new.ID IS NULL) THEN
SET new.ID = @Record;
END IF;
SET @PrevHash = (
SELECT Hash FROM core_Test #<--- UPDATE TABLE_NAME HERE
WHERE [email protected]
);
SET new.Hash = SHA1(CONCAT_WS(',',@PrevHash, @Record,
/* --- UPDATE TABLE COLUMN NAMES HERE (EXCLUDE "new.Record" AND "new.Hash") --- */
new.ID, new.Name, new.Data
));
END