- 1 1. ã¯ããã«
- 2 2. MySQL ããªã¬ãŒã®åºæ¬
- 3 3. ããªã¬ãŒã®äœææ¹æ³
- 4 4. MySQL ããªã¬ãŒã®æŽ»çšäºäŸ
- 4.1 1. ããŒã¿ã®èªååæïŒããã¯ã¢ããïŒ
- 4.2 2. ããŒã¿ã®èªåæ€èšŒïŒäžæ£ããŒã¿ã®ãããã¯ïŒ
- 4.3 3. ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ã®ãã°ç®¡ç
- 4.4 4. ããŒã¿å€æŽæã®éç¥ïŒã¡ãŒã«éç¥ãWebhook飿ºïŒ
- 4.5 5. ä»ã®ããŒãã«ãšã®ããŒã¿é£æº
- 4.6 ãŸãšã
- 5 5. ããªã¬ãŒäœ¿çšæã®æ³šæç¹
- 6 6. FAQïŒãããã質åïŒ
- 6.1 Q1. ããªã¬ãŒãšã¹ãã¢ãããã·ãŒãžã£ã®éãã¯ïŒ
- 6.2 Q2. MySQLã§1ã€ã®ããŒãã«ã«è€æ°ã®ããªã¬ãŒãèšå®ã§ããŸããïŒ
- 6.3 Q3. MySQLã®ããªã¬ãŒããããã°ããæ¹æ³ã¯ïŒ
- 6.4 Q4. ããªã¬ãŒã¯ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããŸããïŒ
- 6.5 ãŸãšã
- 7 7. ãŸãšã
1. ã¯ããã«
MySQL ããªã¬ãŒãšã¯ïŒ
MySQL ããªã¬ãŒãšã¯ãç¹å®ã®ããŒã¿æäœïŒINSERTãUPDATEãDELETEïŒãçºçãããšãã« èªåçã«å®è¡ãããåŠç ã®ããšã§ãã
éåžžã®SQLã¯ãšãªã¯æåã§å®è¡ããå¿
èŠããããŸãããããªã¬ãŒãèšå®ãããšãããŒã¿ããŒã¹ãèªåçã«ç¹å®ã®ã¢ã¯ã·ã§ã³ãå®è¡ããŠãããŸãã
äŸãã°ãé¡§å®¢ã®æ å ±ãæŽæ°ããããããã®å€æŽå±¥æŽããã°ããŒãã«ã«èšé²ãããæ³šæããŒã¿ã远å ããããåšåº«ãèªåçã«èª¿æŽããããšãã£ãåŠçã ããªã¬ãŒ ãçšããããšã§å®çŸã§ããŸãã
ããªã¬ãŒã®çšéãšã¡ãªãã
MySQLã®ããªã¬ãŒã¯ãããŒã¿ããŒã¹ã®éçšã«ãããŠä»¥äžã®ãããªã¡ãªãããæäŸããŸãã
ããŒã¿ã®æŽåæ§ãèªåçã«ä¿ã€
ããªã¬ãŒã掻çšããããšã§ãé¢é£ããããŒã¿ã®æŽåæ§ãæåã§ç®¡çããå¿
èŠããªããªããŸãã
äŸãã°ãåé€ãããããŒã¿ã®ããã¯ã¢ãããèªåã§äœæãããããªä»çµã¿ãå°å
¥ã§ããŸãã
ãã°ã®èªåèšé²
ããŒã¿ã®å€æŽå±¥æŽãèšé²ãããã°ããŒãã«ãäœæããããªã¬ãŒã䜿ã£ãŠå€æŽå
容ãèªåçã«ä¿åããããšãã§ããŸãã
ããã«ããã誰ããã€ããŒã¿ã倿Žããã®ãã远跡ã§ããããã«ãªããŸãã
ããŒã¿åŠçã®èªåå
ç¹å®ã®ã€ãã³ããçºçããéã«ãäºåã«æ±ºããããåŠçãèªåã§å®è¡ã§ããŸãã
äŸãã°ãæ°ããæ³šæã远å ããããšãã«ãåšåº«æ°ãæžããåŠçãå®è¡ãããªã©ãããŒã¿ããŒã¹ã®ã¡ã³ããã³ã¹ãç°¡ç¥åã§ããŸãã
äžè²«æ§ã®ããããžãã¹ã«ãŒã«ã®é©çš
ããªã¬ãŒã䜿ãã°ãããŒã¿æäœã®éã«å¿
ãç¹å®ã®åŠçãå®è¡ããããããããžãã¹ã«ãŒã«ãäžè²«ããŠé©çšã§ããŸãã
äŸãã°ãè² ã®å€ãå
¥åãããã®ãé²ããããªããªããŒã·ã§ã³ãããŒã¿ããŒã¹åŽã§å®è£
ã§ããŸãã
ããªã¬ãŒãåŠã¶ã¹ãçç±
ããªã¬ãŒã¯ ã¢ããªã±ãŒã·ã§ã³éçº ã ããŒã¿ç®¡ç ã«ãããŠãéåžžã«åŒ·åãªããŒã«ã§ãã
ç¹ã«ã以äžã®ãããªå Žé¢ã§ã¯ããªã¬ãŒã®æŽ»çšãæšå¥šãããŸãã
- ããŒã¿æŽåæ§ã®åŒ·åïŒããŒã¿ã®å€æŽãçºçãããšãã«ãä»ã®é¢é£ããŒã¿ãèªåæŽæ°ããããšã§ãããŒã¿ã®äžè²«æ§ãä¿ã€ããšãã§ããŸãã
- ãã°ç®¡çã®ç°¡ç¥åïŒããŒã¿ã®å€æŽå±¥æŽãæåã§èšé²ããã®ã§ã¯ãªããããªã¬ãŒã掻çšããŠèªåçã«èšé²ããããšã§ã管çå·¥æ°ãåæžã§ããŸãã
- ããŒã¿ã®äžæŽåã鲿¢ïŒäžæ£ãªããŒã¿ãå ¥åãããã®ãé²ãããã«ãããªã¬ãŒã掻çšããŠå ¥åããŒã¿ãæ€èšŒã§ããŸãã
ãã®ããã«ãããªã¬ãŒã掻çšããããšã§ ããŒã¿ããŒã¹ã®ç®¡çãããå¹ççã«ãªããã·ã¹ãã ã®ä¿¡é Œæ§ãåäžãããããšãã§ããŸãã
2. MySQL ããªã¬ãŒã®åºæ¬
ããªã¬ãŒã®æ§æèŠçŽ
MySQLã®ããªã¬ãŒã¯ãç¹å®ã®ããŒã¿æäœïŒINSERTãUPDATEãDELETEïŒãããªã¬ãŒã«ããŠèªåçã«SQLãå®è¡ããä»çµã¿ã§ãã
åºæ¬çã«ãããªã¬ãŒã¯ 以äžã®3ã€ã®èŠçŽ ããæ§æãããŸãã
1. ã€ãã³ãïŒããªã¬ãŒã®çºçã¿ã€ãã³ã°ïŒ
ããªã¬ãŒã¯ã以äžã® ããŒã¿æäœã€ãã³ã ã«ãã£ãŠçºçããŸãã
- INSERTïŒæ°ããããŒã¿ã远å ããããšã
- UPDATEïŒæ¢åã®ããŒã¿ã倿Žããããšã
- DELETEïŒããŒã¿ãåé€ããããšã
2. ã¿ã€ãã³ã°ïŒBEFORE / AFTERïŒ
ããªã¬ãŒã¯ã察象ã®ããŒã¿æäœãå®è¡ããã å (BEFORE) ãŸãã¯ åŸ (AFTER) ã«åŠçãå®è¡ã§ããŸãã
- BEFORE ããªã¬ãŒ
- INSERTãUPDATEãDELETE ã®åã«å®è¡ããã
- ããŒã¿ã®æ€èšŒã倿Žã®çŠæ¢ ãªã©ã«é©çšããã
- äŸ: äžæ£ãªããŒã¿å ¥åãé²ãïŒäŸïŒè² ã®å€ãçŠæ¢ïŒ
- AFTER ããªã¬ãŒ
- INSERTãUPDATEãDELETE ã®åŸã«å®è¡ããã
- ãã°ã®èšé²ãé¢é£ããŒãã«ã®æŽæ° ã«äœ¿çšããã
- äŸ: 倿Žå±¥æŽããã°ããŒãã«ã«ä¿åãã
3. é©çšç¯å²ïŒè¡ã¬ãã« / ã¹ããŒãã¡ã³ãã¬ãã«ïŒ
- è¡ã¬ãã«ããªã¬ãŒïŒFOR EACH ROWïŒ
- æäœãããåè¡ããšã«ããªã¬ãŒãå®è¡ãããïŒMySQLã§ã¯è¡ã¬ãã«ã®ã¿å¯Ÿå¿ïŒ
- äŸ:
UPDATE
ã§è€æ°è¡ãæŽæ°ãããå Žåãããããã®è¡ããšã«ããªã¬ãŒãå®è¡ããã - ã¹ããŒãã¡ã³ãã¬ãã«ããªã¬ãŒïŒMySQLã§ã¯æªå¯Ÿå¿ïŒ
- 1åã®
INSERT
ãUPDATE
ãå®è¡ãããéã« 1åã ã ããªã¬ãŒãçºåããïŒMySQLã¯é察å¿ïŒ
ããªã¬ãŒã®çš®é¡ãšäœ¿ãåã
ããªã¬ãŒã® çµã¿åãã ã«ãã£ãŠã6çš®é¡ã®ããªã¬ãŒãå®çŸ©ã§ããŸãã
ããªã¬ãŒã®çš®é¡ | ã€ãã³ã | ã¿ã€ãã³ã° | äž»ãªçšé |
---|---|---|---|
BEFORE INSERT | INSERT | å | ããŒã¿æ€èšŒïŒäžæ£å€ã®é²æ¢ïŒ |
AFTER INSERT | INSERT | åŸ | ãã°ã®èšé²ãããã¯ã¢ããã®äœæ |
BEFORE UPDATE | UPDATE | å | æŽæ°ããŒã¿ã®ãã§ãã¯ãå¶éé©çš |
AFTER UPDATE | UPDATE | åŸ | 倿Žå±¥æŽã®èšé²ãä»ã®ããŒãã«ã®åæ |
BEFORE DELETE | DELETE | å | åé€åã®ããŒã¿ããã¯ã¢ãã |
AFTER DELETE | DELETE | åŸ | åé€å±¥æŽã®èšé² |
å ·äœçãªæŽ»çšäŸ
1. BEFORE INSERT ããªã¬ãŒã䜿çšããäžæ£ãªããŒã¿ãé²ã
CREATE TRIGGER prevent_negative_salary
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
IF NEW.salary < 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '絊äžã¯è² ã®å€ã«ã¯ã§ããŸãã';
END IF;
END;
â ãã®ããªã¬ãŒã®åäœ
- è² ã®å€ãå ¥åãããã®ãé²ãïŒãšã©ãŒãã³ããªã³ã°ïŒ
2. AFTER INSERT ããªã¬ãŒã䜿çšãããã°ãèšé²ãã
CREATE TRIGGER log_new_user
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (user_id, action, timestamp)
VALUES (NEW.id, 'ç»é²', NOW());
END;
â ãã®ããªã¬ãŒã®åäœ
users
ããŒãã«ã«æ°ãããŠãŒã¶ãŒã远å ããããã³ã«ãuser_logs
ããŒãã«ã« ç»é²å±¥æŽ ãèšé²ã
ããªã¬ãŒãšã¹ãã¢ãããã·ãŒãžã£ã®éã
é ç® | ããªã¬ãŒ | ã¹ãã¢ãããã·ãŒãžã£ |
---|---|---|
å®è¡æ¹æ³ | èªåçã«å®è¡ | æç€ºçã« CALL ã§å®è¡ |
äž»ãªçšé | ããŒã¿å€æŽæã®èªååŠç | ç¹°ãè¿ã䜿ãè€éãªSQLåŠç |
è¿ãå€ | ãªã | è¿ãå€ãã |
ãã©ã³ã¶ã¯ã·ã§ã³å¶åŸ¡ | ã§ããªã | å¯èœ |
ãŸãšã
- MySQLã®ããªã¬ãŒã¯ãããŒã¿æäœæã«èªåçã«SQLãå®è¡ããä»çµã¿
- BEFORE / AFTER ã®2çš®é¡ã®ããªã¬ãŒããããå®è¡ã¿ã€ãã³ã°ã«ãã£ãŠçšéãç°ãªã
- è¡ã¬ãã«ããªã¬ãŒïŒFOR EACH ROWïŒã®ã¿å¯Ÿå¿
- ã¹ãã¢ãããã·ãŒãžã£ãšéããããªã¬ãŒã¯èªåå®è¡ããã
3. ããªã¬ãŒã®äœææ¹æ³
ããªã¬ãŒäœæã®åææ¡ä»¶
MySQLã§ããªã¬ãŒãäœæããåã«ã以äžã®ç¹ã確èªããå¿ èŠããããŸãã
1. æš©éã®ç¢ºèª
ããªã¬ãŒãäœæããã«ã¯ãMySQLã® SUPER æš©éãŸã㯠TRIGGER æš©é ãå¿
èŠã§ãã
æš©éããªãå Žåã¯ã以äžã®ã³ãã³ãã§ä»äžããŸãïŒç®¡çè
æš©éãå¿
èŠïŒã
GRANT SUPER, TRIGGER ON *.* TO 'username'@'host';
FLUSH PRIVILEGES;
â» å ±æãµãŒããŒãã¬ã³ã¿ã«ãµãŒããŒã§ã¯ãSUPERæš©éãå¶éãããŠããå Žåãããããæ³šæã
2. ããŒãã«ã®ååš
ããªã¬ãŒã¯ æ¢åã®ããŒãã«ã«å¯ŸããŠã®ã¿äœæ ã§ããŸãã
察象ããŒãã«ããªãå Žåã¯ãäºåã«äœæããŠãããŸãããã
3. MySQLã®ããŒãžã§ã³
MySQL 5.0.2 以é ã§ããªã¬ãŒãå©çšå¯èœã§ãã
ããŒãžã§ã³ã確èªããã«ã¯ã以äžã®SQLãå®è¡ããŠãã ããã
SELECT VERSION();
åºæ¬ç㪠CREATE TRIGGER æ§æ
MySQLã§ããªã¬ãŒãäœæããã«ã¯ãCREATE TRIGGER
æã䜿çšããŸãã
æ§æ
CREATE TRIGGER ããªã¬ãŒå
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON ããŒãã«å
FOR EACH ROW
BEGIN
-- å®è¡ããåŠçïŒSQLïŒ
END;
{BEFORE | AFTER}
â ããªã¬ãŒã®å®è¡ã¿ã€ãã³ã°{INSERT | UPDATE | DELETE}
â ã©ã®ã€ãã³ãã§å®è¡ãããON ããŒãã«å
â ããªã¬ãŒãé©çšããããŒãã«FOR EACH ROW
â è¡ã¬ãã«ããªã¬ãŒïŒMySQLã§ã¯å¿ é ïŒ
ããªã¬ãŒäœæã®å®è·µäŸ
1. BEFORE INSERT ããªã¬ãŒïŒäžæ£ããŒã¿ã®é²æ¢ïŒ
CREATE TRIGGER prevent_negative_salary
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
IF NEW.salary < 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '絊äžã¯è² ã®å€ã«ã¯ã§ããŸãã';
END IF;
END;
â ãã®ããªã¬ãŒã®åäœ
salary
ã«ã©ã ã«è² ã®å€ãå ¥åããããšããšã©ãŒãçºçãããŠç»é²ãé²ãã
2. AFTER INSERT ããªã¬ãŒïŒãã°ã®èªåèšé²ïŒ
CREATE TRIGGER log_new_user
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (user_id, action, timestamp)
VALUES (NEW.id, 'ç»é²', NOW());
END;
â ãã®ããªã¬ãŒã®åäœ
users
ããŒãã«ã«æ°ãããŠãŒã¶ãŒã远å ããããã³ã«ãuser_logs
ããŒãã«ã« ç»é²å±¥æŽ ãèšé²ã
3. AFTER UPDATE ããªã¬ãŒïŒå€æŽå±¥æŽã®ä¿åïŒ
CREATE TRIGGER track_salary_changes
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
INSERT INTO salary_history (employee_id, old_salary, new_salary, changed_at)
VALUES (OLD.id, OLD.salary, NEW.salary, NOW());
END;
â ãã®ããªã¬ãŒã®åäœ
employees
ããŒãã«ã®salary
ïŒçµŠäžïŒã倿Žãããéã«ã倿ŽååŸã®æ å ±ãå±¥æŽããŒãã«ã«èšé² ããã
ããªã¬ãŒã®ç®¡ç
ç»é²ãããŠããããªã¬ãŒã®äžèЧãååŸ
SHOW TRIGGERS FROM database_name;
database_name
ã«ã¯ã察象ã®ããŒã¿ããŒã¹åãæå®ã
ç¹å®ã®ããŒãã«ã«é¢é£ããããªã¬ãŒãæ€çŽ¢
SELECT * FROM information_schema.TRIGGERS
WHERE EVENT_OBJECT_TABLE = 'employees';
ããªã¬ãŒã®åé€
ããªã¬ãŒã®å逿¹æ³
DROP TRIGGER IF EXISTS trigger_name;
äŸãšããŠãlog_new_user
ããªã¬ãŒãåé€ããå Žå:
DROP TRIGGER IF EXISTS log_new_user;
ãŸãšã
- ããªã¬ãŒãäœæããã«ã¯ãSUPERæš©éãŸãã¯TRIGGERæš©éãå¿ èŠ
CREATE TRIGGER
ã䜿ããç¹å®ã®ããŒã¿æäœæã«èªåçã«åŠçãå®è¡ã§ãã- BEFORE ããªã¬ãŒã¯ããŒã¿ã®æ€èšŒã倿Žã®é²æ¢ã«äœ¿çš
- AFTER ããªã¬ãŒã¯ãã°èšé²ã倿Žå±¥æŽã®ä¿åã«æŽ»çš
SHOW TRIGGERS
ãDROP TRIGGER
ã§ããªã¬ãŒã®ç®¡çãå¯èœ

4. MySQL ããªã¬ãŒã®æŽ»çšäºäŸ
MySQLã®ããªã¬ãŒã¯ãããŒã¿ã®èªååŠçãå®è£
ããã®ã«éåžžã«åœ¹ç«ã¡ãŸãã
ããã§ã¯ãå®éã®ã·ã¹ãã éçºãããŒã¿ç®¡çã§åœ¹ç«ã€ å
·äœçãªæŽ»çšäºäŸ ã玹ä»ããŸãã
1. ããŒã¿ã®èªååæïŒããã¯ã¢ããïŒ
ããŒã¿ã®æŽåæ§ãä¿ã€ããã«ãããããŒãã«ã®å€æŽãå¥ã®ããŒãã«ã«èªååæããããšãå¯èœã§ãã
äŸãã°ãorders
ããŒãã«ã«æ°ããæ³šæã远å ãããããorder_backup
ã«ããã¯ã¢ãããäœæ ããããªã¬ãŒãäœæããŸãã
â äŸïŒAFTER INSERT ã§ããŒã¿ãããã¯ã¢ãã
CREATE TRIGGER sync_orders
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_backup (order_id, user_id, total_price, created_at)
VALUES (NEW.id, NEW.user_id, NEW.total, NOW());
END;
â ãã®ããªã¬ãŒã®åäœ
orders
ããŒãã«ã«æ°ããæ³šæã远å ããããšãorder_backup
ã«èªåçã«ããŒã¿ãä¿å ãããã
2. ããŒã¿ã®èªåæ€èšŒïŒäžæ£ããŒã¿ã®ãããã¯ïŒ
ããŒã¿ã®æŽåæ§ãä¿ã€ããã«ãããªã¬ãŒã䜿ã£ãŠ äžæ£ãªå€ã®å
¥åãé²ã ããšãã§ããŸãã
äŸãã°ãinventory
ïŒåšåº«ç®¡çïŒããŒãã«ã§åšåº«ãè² ã®å€ã«ãªããªãããã«å¶åŸ¡ ããŸãã
â äŸïŒBEFORE INSERT ã§äžæ£ããŒã¿ãé²ã
CREATE TRIGGER prevent_negative_stock
BEFORE INSERT ON inventory
FOR EACH ROW
BEGIN
IF NEW.stock < 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'åšåº«æ°ããã€ãã¹ã§ããæ£ããå€ãå
¥åããŠãã ããã';
END IF;
END;
â ãã®ããªã¬ãŒã®åäœ
inventory
ããŒãã«ã« è² ã®å€ãå ¥åãããå Žåããšã©ãŒãçºçãããŠç»é²ãé²ãã
3. ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ã®ãã°ç®¡ç
ããªã¬ãŒã掻çšãããšããŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ãèªåçã«èšé² ã§ããŸãã
äŸãã°ããŠãŒã¶ãŒãæ°ããç»é²ãããéã«ãã°ãèšé²ãã ããã«èšå®ã§ããŸãã
â äŸïŒAFTER INSERT ã§ãã°ãèªåèšé²
CREATE TRIGGER log_user_activity
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (user_id, action, timestamp)
VALUES (NEW.id, 'ç»é²', NOW());
END;
â ãã®ããªã¬ãŒã®åäœ
users
ããŒãã«ã«æ°ãããŠãŒã¶ãŒã远å ããããããã°ããŒãã«ã«èšé²ãæ®ãã
4. ããŒã¿å€æŽæã®éç¥ïŒã¡ãŒã«éç¥ãWebhook飿ºïŒ
MySQLåäœã§ã¯çŽæ¥ã¡ãŒã«éç¥ãéä¿¡ããããšã¯ã§ããŸãããã
ããªã¬ãŒãå©çšã㊠ããŒã¿å€æŽãæ€ç¥ããã¹ãã¢ãããã·ãŒãžã£ãå®è¡ããããšã§éç¥ãå®çŸ ã§ããŸãã
â äŸïŒAFTER UPDATE ã§ã¹ãã¢ãããã·ãŒãžã£ãåŒã³åºã
CREATE TRIGGER notify_stock_update
AFTER UPDATE ON inventory
FOR EACH ROW
BEGIN
CALL send_stock_alert(NEW.product_id, NEW.stock);
END;
â ãã®ããªã¬ãŒã®åäœ
inventory
ã®stock
ïŒåšåº«æ°ïŒãæŽæ°ãããéã«ãsend_stock_alert
ã¹ãã¢ãããã·ãŒãžã£ ãåŒã³åºãã
5. ä»ã®ããŒãã«ãšã®ããŒã¿é£æº
ããŒã¿ããŒã¹å ã® è€æ°ã®ããŒãã«ãèªåã§é£æºããã ããã«ãããªã¬ãŒã䜿çšããããšãã§ããŸãã
â äŸïŒAFTER UPDATE ã§åŸæ¥å¡ã®çµŠäžå±¥æŽãä¿å
CREATE TRIGGER track_salary_changes
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
INSERT INTO salary_history (employee_id, old_salary, new_salary, changed_at)
VALUES (OLD.id, OLD.salary, NEW.salary, NOW());
END;
â ãã®ããªã¬ãŒã®åäœ
employees
ããŒãã«ã®salary
ïŒçµŠäžïŒãæŽæ°ããããã倿Žåã®çµŠäžãšå€æŽåŸã®çµŠäžãsalary_history
ããŒãã«ã«èšé² ããã
ãŸãšã
- ããªã¬ãŒã¯ããŒã¿ã®èªååŠçã«æé© ã§ãããããã¯ã¢ãããããŒã¿æ€èšŒããã°ç®¡çãªã©å¹ åºã掻çšã§ããã
- AFTER ããªã¬ãŒãå©çšããã°ã倿Žå±¥æŽã®èšé²ãå€éšã·ã¹ãã ãšã®é£æºãå¯èœã
- BEFORE ããªã¬ãŒã掻çšãããšãäžæ£ãªããŒã¿ã®ç»é²ãé²ãããšãã§ããã
- ã¹ãã¢ãããã·ãŒãžã£ãšçµã¿åãããããšã§ãããã«é«åºŠãªããŒã¿åŠçãéç¥æ©èœãå®è£ å¯èœã
5. ããªã¬ãŒäœ¿çšæã®æ³šæç¹
MySQL ã®ããªã¬ãŒã¯ãããŒã¿ã®æŽåæ§ãç¶æããèªååŠçãè¡ãäžã§éåžžã«äŸ¿å©ãªæ©èœã§ããã
é©åã«èšèšã»ç®¡çããªããšãããã©ãŒãã³ã¹ã®äœäžããããã°ã®é£ããã«ã€ãªãã ããšããããŸãã
ããã§ã¯ãããªã¬ãŒã䜿çšããéã® éèŠãªæ³šæç¹ ã«ã€ããŠè©³ãã解説ããŸãã
1. ããã©ãŒãã³ã¹ãžã®åœ±é¿
ããªã¬ãŒã¯ ããŒã¿ããŒã¹ã®æäœããšã«èªåå®è¡ ããããããé©åã«ç®¡çããªããš ããã©ãŒãã³ã¹ã®äœäž ãæãå¯èœæ§ããããŸãã
â åé¡ç¹
- ããªã¬ãŒãå€ããããšãããŒã¿æäœã®åŠçé床ãäœäž
- ãã¹ãããããªã¬ãŒïŒããªã¬ãŒå ã§å¥ã®ããªã¬ãŒãåŒã³åºãïŒ ã䜿çšãããšãæå³ãã¬è² è·ãçºç
- 倧éã®ããŒã¿ãæŽæ°ããå Žåãããªã¬ãŒãäœåºŠãçºç«ããåŠçãé å»¶ããå¯èœæ§ ãã
â æ¹åç
- äžèŠãªããªã¬ãŒãäœæããªã
- ã·ã³ãã«ãªåŠçãå¿ãããïŒè€éãªããžãã¯ã¯ã¹ãã¢ãããã·ãŒãžã£ã§ç®¡çïŒ
- ããŒãã«ã«ã€ã³ããã¯ã¹ãé©çšããã¯ãšãªã®åŠçé床ãæé©åãã
2. ãããããã¯ã®ãªã¹ã¯
ããªã¬ãŒã䜿çšãããšããããããã¯ïŒè€æ°ã®ãã©ã³ã¶ã¯ã·ã§ã³ãäºãã«ããã¯ãä¿æããåŠçã忢ããç¶æ ïŒ ãçºçããå¯èœæ§ããããŸãã
â äŸ: ããªã¬ãŒã«ãããããããã¯çºç
CREATE TRIGGER update_stock
AFTER UPDATE ON orders
FOR EACH ROW
BEGIN
UPDATE inventory SET stock = stock - NEW.quantity WHERE product_id = NEW.product_id;
END;
ãã®ããªã¬ãŒãå®è¡ããããšãorders
ããŒãã«ã®æŽæ°ãš inventory
ã®æŽæ°ãç«¶åãããããããã¯ãçºçããå¯èœæ§ããããŸãã
â æ¹åç
BEFORE
ããªã¬ãŒã䜿ãã倿Žãæé©åããïŒAFTER
ãããããã¯ã®åœ±é¿ãå°ãªãïŒ- ããªã¬ãŒå ã®ã¯ãšãªãæå°éã«ããè€éãªåŠçã¯ã¹ãã¢ãããã·ãŒãžã£ã§ç®¡ç
- ãã©ã³ã¶ã¯ã·ã§ã³ã®é åºãçµ±äžããããã¯ã®ç«¶åãåé¿ãã
- æŽæ°å¯Ÿè±¡ã®ã¬ã³ãŒãæ°ãã§ããã ãæžãã
3. ããªã¬ãŒã®å¶çŽãšå¶é
MySQL ã®ããªã¬ãŒã«ã¯ãããã€ãã®å¶çŽãå¶é ãååšããŸãã
â ãã©ã³ã¶ã¯ã·ã§ã³å¶åŸ¡ïŒCOMMITã»ROLLBACKïŒãã§ããªã
- ããªã¬ãŒå
ã§ã¯
COMMIT
ãROLLBACK
ã䜿çšã§ããªã
â ããªã¬ãŒå ã§ãšã©ãŒãçºçãããšãããªã¬ãŒãå«ãå šäœã®åŠçãããŒã«ããã¯ãããã
â 1ã€ã®ããŒãã«ã«å¯ŸããŠãåãçš®é¡ã®ããªã¬ãŒãè€æ°äœæã§ããªã
- MySQL ã§ã¯ åãã€ãã³ãïŒAFTER INSERT ãªã©ïŒãæã€è€æ°ã®ããªã¬ãŒã1ã€ã®ããŒãã«ã«å®çŸ©ã§ããªã
â äŸãã°ãAFTER INSERT
ããªã¬ãŒã2ã€äœæããããšãããšãšã©ãŒã«ãªãã
ðš æ¹åç:
- ããªã¬ãŒã®åŠçã1ã€ã«çµ±åããåå²åŠçãå®è£ ãã
4. ããªã¬ãŒã®ãããã°ãé£ãã
ããªã¬ãŒã¯ ããŒã¿ããŒã¹ã®ããã¯ã°ã©ãŠã³ãã§åäœãã ããããšã©ãŒãçºçããŠãçŽæ¥ã¡ãã»ãŒãžã衚瀺ãããªã ããšããããŸãã
â ãããã°æ¹æ³
- ãã°ããŒãã«ãäœæããããªã¬ãŒã®å®è¡å±¥æŽãä¿åãã
CREATE TABLE trigger_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
event_type VARCHAR(50),
message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
- ããªã¬ãŒå
ã§
INSERT
ã䜿ããåŠçã®æµããèšé²
CREATE TRIGGER debug_trigger
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO trigger_logs (event_type, message)
VALUES ('INSERT', CONCAT('New user added: ', NEW.username));
END;
â
ãã®æ¹æ³ã䜿ããšãããªã¬ãŒã®å®è¡çµæã確èªã§ãã
â SELECT * FROM trigger_logs;
ãå®è¡ãããšããã°ã確èªå¯èœã
5. ããªã¬ãŒã䜿çšãã¹ãã±ãŒã¹ãšäœ¿çšãã¹ãã§ãªãã±ãŒã¹
ããªã¬ãŒã¯äŸ¿å©ã§ããããã¹ãŠã®å Žé¢ã§é©çšããã¹ãã§ã¯ãããŸããã
â ããªã¬ãŒã䜿çšãã¹ãã±ãŒã¹
- ããŒã¿ã®æŽåæ§ã確ä¿ããããã®åŠç
- 倿Žå±¥æŽããã°ã®èªåèšé²
- ããŒã¿ã®æ€èšŒïŒäžæ£ããŒã¿ã®é²æ¢ïŒ
ð« ããªã¬ãŒã䜿çšãã¹ãã§ãªãã±ãŒã¹
- è€éãªèšç®ãããžãã¯ãå¿ èŠãªå ŽåïŒã¹ãã¢ãããã·ãŒãžã£ã®ã»ããé©ããŠããïŒ
- ããªã¬ãŒã倿°ã®ããŒãã«ãæŽæ°ããå ŽåïŒããã©ãŒãã³ã¹ãäœäžïŒ
- ãã©ã³ã¶ã¯ã·ã§ã³å¶åŸ¡ãå¿
èŠãªå ŽåïŒããªã¬ãŒå
ã§ã¯
COMMIT
/ROLLBACK
ã䜿çšã§ããªãïŒ
ãŸãšã
- ããªã¬ãŒã¯é©åã«äœ¿çšããªããšãããã©ãŒãã³ã¹ã®äœäžãæãå¯èœæ§ããã
- ãããããã¯ãé²ãããã«ã
BEFORE
ããªã¬ãŒã®äœ¿çšããã©ã³ã¶ã¯ã·ã§ã³ç®¡çãèæ ®ãã - MySQLã®å¶çŽïŒãã©ã³ã¶ã¯ã·ã§ã³å¶åŸ¡äžå¯ãåãçš®é¡ã®ããªã¬ãŒãè€æ°äœæã§ããªãïŒãçè§£ããŠãã
- ãããã°ãé£ããããããã°ããŒãã«ã掻çšããŠåŠçã®æµããèšé²ãã
- ããªã¬ãŒãé©ããŠããã±ãŒã¹ãšé©ããŠããªãã±ãŒã¹ãèŠæ¥µããããšãéèŠ
6. FAQïŒãããã質åïŒ
MySQLã®ããªã¬ãŒã«ã€ããŠããããã質åããŸãšããŸããã
åºæ¬çãªäœ¿ãæ¹ãããã©ãã«ã·ã¥ãŒãã£ã³ã°ãŸã§ãå®è·µçãªæ
å ±ã解説ããŸãã
Q1. ããªã¬ãŒãšã¹ãã¢ãããã·ãŒãžã£ã®éãã¯ïŒ
A.
é ç® | ããªã¬ãŒ | ã¹ãã¢ãããã·ãŒãžã£ |
---|---|---|
å®è¡æ¹æ³ | èªåå®è¡ïŒããŒã¿å€æŽæïŒ | æåå®è¡ (CALL procedure_name ) |
äž»ãªçšé | ããŒã¿å€æŽæã®èªååŠç | ç¹°ãè¿ã䜿ãSQLã®èªåå |
è¿ãå€ | ãªã | è¿ãå€ãã |
ãã©ã³ã¶ã¯ã·ã§ã³å¶åŸ¡ | ã§ããªã | å¯èœ |
â 䜿ãåãã®ãã€ã³ã
- ããªã¬ãŒã¯ãããŒã¿å€æŽæã«å¿ ãå®è¡ãããåŠçãã«é©ããŠãã
- äŸ: ãã°èšé²ãããŒã¿æŽåæ§ã®ç¢ºä¿ã倿Žå±¥æŽã®ä¿å
- ã¹ãã¢ãããã·ãŒãžã£ã¯ãç¹å®ã®æäœãæåã§å®è¡ãããå Žåãã«é©ããŠãã
- äŸ: ãããåŠçãéèšåŠçã倧éããŒã¿ã®æŽæ°
Q2. MySQLã§1ã€ã®ããŒãã«ã«è€æ°ã®ããªã¬ãŒãèšå®ã§ããŸããïŒ
A. ã¯ããå¯èœã§ããå¶éããããŸãã
â å¶é:
- åãã€ãã³ããšã¿ã€ãã³ã°ïŒAFTER INSERT ãªã©ïŒãæã€è€æ°ã®ããªã¬ãŒã¯äœæã§ããªã
- äŸãã°ã以äžã®2ã€ã®
AFTER INSERT
ããªã¬ãŒãusers
ããŒãã«ã«èšå®ããããšãããšãšã©ãŒã«ãªãã
CREATE TRIGGER trigger1 AFTER INSERT ON users FOR EACH ROW BEGIN ... END;
CREATE TRIGGER trigger2 AFTER INSERT ON users FOR EACH ROW BEGIN ... END;
- MySQLã¯1ã€ã®
AFTER INSERT
ããªã¬ãŒããèš±å¯ããªãã
â 解決ç:
- ããªã¬ãŒã1ã€ã«ãŸãšããŠãæ¡ä»¶åå²ïŒIFïŒã§è€æ°ã®åŠçãå®è£ ãã
CREATE TRIGGER manage_user_insert
AFTER INSERT ON users
FOR EACH ROW
BEGIN
-- ãã°ãèšé²
INSERT INTO user_logs (user_id, action, timestamp)
VALUES (NEW.id, 'ç»é²', NOW());
-- ååãã°ã€ã³ããŒãã¹ãä»äž
IF NEW.is_new = 1 THEN
INSERT INTO bonuses (user_id, amount) VALUES (NEW.id, 1000);
END IF;
END;
Q3. MySQLã®ããªã¬ãŒããããã°ããæ¹æ³ã¯ïŒ
A. ããªã¬ãŒã¯éåžžã®SQLã®ããã« SELECT
ã§çµæã確èªã§ããªãããããããã°ãé£ããã§ãã
ãã°ããŒãã«ã掻çšããŠãããã°ããã®ãäžè¬çãªæ¹æ³ã§ãã
â ãããã°çšã®ãã°ããŒãã«ãäœæ
CREATE TABLE trigger_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
â
ããªã¬ãŒã®äžã§ INSERT
ã䜿ã£ãŠãã°ãèšé²
CREATE TRIGGER debug_trigger
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO trigger_logs (message)
VALUES (CONCAT('New user added: ', NEW.username));
END;
â ãã°ã確èª
SELECT * FROM trigger_logs;
ð ããã«ãããããªã¬ãŒãæ£ããåäœãããã確èªã§ããŸãã
Q4. ããªã¬ãŒã¯ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããŸããïŒ
A. ã¯ããç¹ã«å€§èŠæš¡ãªããŒã¿ããŒã¹ã§ã¯æ³šæãå¿ èŠã§ãã
â 圱é¿ãäžããäž»ãªåå
- ããªã¬ãŒãé »ç¹ã«å®è¡ããããšãããŒã¿æäœïŒINSERT / UPDATE / DELETEïŒãé ããªã
- ããªã¬ãŒå ã§è€éãªåŠçïŒä»ã®ããŒãã«ã®æŽæ°ãèšç®ãªã©ïŒãè¡ããšãã¯ãšãªã®è² è·ãå¢å€§ãã
- ããªã¬ãŒã®ãã¹ãïŒããªã¬ãŒå ã§å¥ã®ããªã¬ãŒãçºç«ããïŒã«ãããæå³ãã¬é å»¶ãçºçãã
â ããã©ãŒãã³ã¹æé©åã®å¯Ÿç
- äžèŠãªããªã¬ãŒã¯äœæããªãïŒå¯èœãªãã¢ããªã±ãŒã·ã§ã³åŽã§åŠçããïŒ
- ã·ã³ãã«ãªåŠçã«ããïŒè€éãªèšç®ãæ¡ä»¶åå²ã¯ã¹ãã¢ãããã·ãŒãžã£ã«åé¢ïŒ
- é©åãªã€ã³ããã¯ã¹ãèšå®ããããªã¬ãŒå ã®ã¯ãšãªã®å®è¡é床ãåäžããã
BEFORE
ããªã¬ãŒã掻çšãã倿Žåã«ããŒã¿ã®æ€èšŒãè¡ãããšã§ç¡é§ãªåŠçãæžãã
ãŸãšã
- ããªã¬ãŒã¯ããŒã¿ã®èªååŠçã«äŸ¿å©ã ããã¹ãã¢ãããã·ãŒãžã£ããã¥ãŒãšäœ¿ãåããéèŠ
- MySQLã§ã¯ã1ã€ã®ããŒãã«ã«åãçš®é¡ã®ããªã¬ãŒãè€æ°äœæã§ããªã
- ãããã°ã¯ãã°ããŒãã«ã掻çšããããšã§å®¹æã«ã§ãã
- ããã©ãŒãã³ã¹äœäžãé²ãããã«ãããªã¬ãŒã¯ã·ã³ãã«ã«èšèšããããšãæšå¥š
- ããªã¬ãŒã®å€æŽã¯ã§ããªããããåé€ããŠåäœæãå¿ èŠ
7. ãŸãšã
MySQLã®ããªã¬ãŒã¯ãããŒã¿ããŒã¹ã®èªååŠçãå¯èœã«ããããŒã¿ã®æŽåæ§ãç¶æããäžã§éåžžã«åŒ·åãªããŒã«ã§ãã
æ¬èšäºã§ã¯ãããªã¬ãŒã®åºæ¬ããäœææ¹æ³ã掻çšäºäŸã泚æç¹ãFAQãŸã§è©³ãã解説ããŸããã
以äžã«ãMySQL ããªã¬ãŒã®éèŠãªãã€ã³ããæ¯ãè¿ããŸãã
1. MySQL ããªã¬ãŒã®æŠèŠ
- ããªã¬ãŒãšã¯ïŒ
- ç¹å®ã®ããŒã¿æäœïŒINSERTãUPDATEãDELETEïŒæã«ãèªåã§SQLãå®è¡ããä»çµã¿
- ããªã¬ãŒã®çšé
- ããŒã¿ã®æŽåæ§ç¶æããã°ç®¡çãããŒã¿å€æŽæã®èªååŠçãªã©
- ããªã¬ãŒã®çš®é¡
- BEFORE ããªã¬ãŒïŒããŒã¿å€æŽåã«å®è¡ïŒ
- AFTER ããªã¬ãŒïŒããŒã¿å€æŽåŸã«å®è¡ïŒ
2. ããªã¬ãŒã®äœææ¹æ³
CREATE TRIGGER
ã䜿çšãã察象ããŒãã«ã®ããŒã¿æäœã«å¿ããŠããªã¬ãŒãèšå®- äŸïŒAFTER INSERT ã§ãã°ãèšé²
CREATE TRIGGER log_new_user
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (user_id, action, timestamp)
VALUES (NEW.id, 'ç»é²', NOW());
END;
SHOW TRIGGERS
ã§äœæããããªã¬ãŒã確èªããDROP TRIGGER
ã§åé€ãå¯èœ
3. ããªã¬ãŒã®æŽ»çšäºäŸ
- ããŒã¿ã®èªååæïŒããã¯ã¢ããïŒ
orders
ããŒãã«ã®ããŒã¿ãorder_backup
ã«èªåä¿å- ããŒã¿ã®èªåæ€èšŒ
BEFORE INSERT
ã䜿ããè² ã®å€ã®å ¥åã鲿¢- ãã°ç®¡ç
AFTER INSERT
ã§ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ãuser_logs
ã«èšé²- éç¥ã»å€éšã·ã¹ãã 飿º
AFTER UPDATE
ã§ã¹ãã¢ãããã·ãŒãžã£ãåŒã³åºããã¡ãŒã«éç¥ãå®è£- 倿Žå±¥æŽã®ä¿å
AFTER UPDATE
ã§salary_history
ã«å€æŽååŸã®ããŒã¿ãèšé²
4. ããªã¬ãŒäœ¿çšæã®æ³šæç¹
- ããã©ãŒãã³ã¹ãžã®åœ±é¿
- ããªã¬ãŒãå€ããããšããŒã¿æäœã®åŠçé床ãäœäž
- ãã¹ãããããªã¬ãŒïŒããªã¬ãŒå ã§å¥ã®ããªã¬ãŒãçºç«ïŒã«æ³šæ
- ãããããã¯ã®ãªã¹ã¯
BEFORE
ããªã¬ãŒã掻çšããŠããã¯ç«¶åãåé¿- ããªã¬ãŒã®å¶çŽ
- ãã©ã³ã¶ã¯ã·ã§ã³å¶åŸ¡ïŒCOMMIT / ROLLBACKïŒãã§ããªã
- 1ã€ã®ããŒãã«ã«åãçš®é¡ã®ããªã¬ãŒãè€æ°èšå®ã§ããªã
- ãããã°æ¹æ³
- ãã°ããŒãã«ãäœæããããªã¬ãŒã®å®è¡å±¥æŽãèšé²
SHOW TRIGGERS
ãinformation_schema.TRIGGERS
ã§èšå®ã確èª
5. FAQïŒãããã質åïŒ
â
Q. MySQLã§ã¹ãã¢ãããã·ãŒãžã£ãšããªã¬ãŒã¯ã©ãéãïŒ
â¡ ããªã¬ãŒ 㯠ããŒã¿æäœæã«èªåå®è¡ ãããã¹ãã¢ãããã·ãŒãžã£ 㯠æåã§å®è¡ ãããã®ã
â
Q. MySQLã®ããªã¬ãŒã¯ããã©ãŒãã³ã¹ã«åœ±é¿ããïŒ
⡠圱é¿ãããæé©åã®ããã«ã¯ãäžèŠãªããªã¬ãŒãäœæããªããã·ã³ãã«ãªåŠçãå¿ããããã€ã³ããã¯ã¹ãé©çšããããšãéèŠã
â
Q. ããªã¬ãŒã®ãããã°æ¹æ³ã¯ïŒ
â¡ ãã°ããŒãã«ãäœæããããªã¬ãŒå®è¡æã®åŠçãèšé²ããã®ãäžè¬çã
INSERT INTO trigger_logs (message) VALUES ('Trigger executed');
â
Q. ããªã¬ãŒã®å€æŽã¯ã§ããŸããïŒ
â¡ çŽæ¥å€æŽã¯ã§ããªããããäžåºŠ DROP TRIGGER
ã§åé€ããæ°ããäœæããå¿
èŠãããã
ãŸãšã
â MySQL ããªã¬ãŒã®ã¡ãªãã
â
ããŒã¿ã®æŽåæ§ãèªåçã«ç¶æ
â
æååŠçãæžãããããŒã¿ããŒã¹ã®ç®¡çãå¹çå
â
ããŒã¿å€æŽå±¥æŽã®ç®¡çã容æ
â
ã¹ãã¢ãããã·ãŒãžã£ãšçµã¿åãããããšã§ãããé«åºŠãªåŠçãå¯èœ
â MySQL ããªã¬ãŒã®æ³šæç¹
â ããªã¬ãŒãå€ããããšããã©ãŒãã³ã¹ã«åœ±é¿ãã
â ãããã°ãé£ããããããã°ããŒãã«ã掻çšããå¿
èŠããã
â ãã©ã³ã¶ã¯ã·ã§ã³ã®åœ±é¿ãèæ
®ãããããããã¯ãåé¿ããèšèšãå¿
èŠ
MySQL ããªã¬ãŒã¯ãé©åã«æŽ»çšããããšã§ããŒã¿ç®¡çã倧å¹
ã«æ¹åã§ããŸãã
æ¬èšäºãåèã«ã广çãªããªã¬ãŒèšèšãè¡ããããæé©ãªããŒã¿ããŒã¹éçšãç®æããŠãã ããïŒ