
ãã®èšäºã®æåã®ã»ã¯ã·ã§ã³ã§ã¯ãããŒã¿ããŒã¹æ§é ã«å€æŽãå ããéã«ããã°ã©ããŒã®ããŒã ã§çºçããäž»ãªåé¡ã«ã€ããŠèª¬æããŸãã 2çªç®ã®ã»ã¯ã·ã§ã³ã§ã¯ãéçºäžã«ããŒã¿ããŒã¹æ§é ã®å€æŽãä¿åããã³ç¶æã§ãããã©ãŒã ãžã®äž»ãªäžè¬çãªã¢ãããŒãã匷調ããŸããã
çšèª
ããŒã¿ããŒã¹ã¯ããã¹ãŠã®ããŒã¿ããŒã¹ãªããžã§ã¯ãïŒããŒãã«ãããã·ãŒãžã£ãããªã¬ãŒãªã©ïŒãéçããŒã¿ïŒã«ãã¯ã¢ããããŒãã«ã«æ ŒçŽãããäžå€ããŒã¿ïŒãããã³ãŠãŒã¶ãŒããŒã¿ïŒã¢ããªã±ãŒã·ã§ã³ã®åŠçäžã«å€æŽãããïŒã®ã³ã¬ã¯ã·ã§ã³ã§ããããŒã¿ããŒã¹æ§é -ãã¹ãŠã®ããŒã¿ããŒã¹ãªããžã§ã¯ããšéçããŒã¿ã®ã»ããã ãŠãŒã¶ãŒããŒã¿ã¯ãããŒã¿ããŒã¹æ§é ã®æŠå¿µã«ã¯å«ãŸããŸããã
ããŒã¿ããŒã¹ã®ããŒãžã§ã³ -ããŒã¿ããŒã¹æ§é ã®ç¹å®ã®ç¶æ ã éåžžãããŒãžã§ã³ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããŒãžã§ã³çªå·ã«é¢é£ä»ããããçªå·ããããŸãã
ãã®ã³ã³ããã¹ãã§ã®ç§»è¡ãšã¯ãããŒã¿ããŒã¹æ§é ãããããŒãžã§ã³ããå¥ã®ããŒãžã§ã³ïŒéåžžã¯æ°ããããŒãžã§ã³ïŒã«æŽæ°ããããšã§ãã
ãã®æå³ã§ã移è¡ãšããçšèªã¯å€ãã®ãœãŒã¹ã§äœ¿çšãããŠããããã§ãïŒç¹ã«ãRuby on Railsã®äžéšã§ããActive Record gemããã®ç§»è¡ãè²¢ç®ããŠããŸãïŒã ãã ãããã®çšèªã䜿çšãããšããããŸãããçºçããŸããã³ã³ããã¹ããç¥ããªã人ã¯ãããŒã¿ããŒã¹ãããDBMSããå¥ã®DBMSã«è»¢éããããšïŒMySQL => OracleïŒããŸãã¯ã¯ã©ã¹ã¿ãŒããŒãéã§ããã»ã¹/ããŒã¿ã移è¡ããããšã®åé¡ã§ãããšèããã§ãããã ãããã£ãŠãã³ã³ããã¹ããæ確ã§ãªãå Žåã¯ãããæ£ç¢ºãªçšèªã ããŒãžã§ã³ä»ãããŒã¿ããŒã¹ç§»è¡ã䜿çšããããšãææ¡ããŸãã
ãªããããå¿ èŠãªã®ã§ããïŒ
ããŒã¿ããŒã¹ãšã¢ããªã±ãŒã·ã§ã³ã®ããŒãžã§ã³ã®éåæã®åé¡ã«æ¢ã«ééããéçºè ã¯ããã®ã»ã¯ã·ã§ã³ãã¹ãããã§ããŸãã ããã§ãã¢ããªã±ãŒã·ã§ã³ãšããŒã¿ããŒã¹ã®ããŒãžã§ã³ã®ããªãã£ãç¶æããå¿ èŠãããçç±ãšãäžè¬çãªåé¡ãçºçããããšãæãåºããŸããããŒã¿ããŒã¹ã®ããŒãžã§ã³ã¯ã¢ããªã±ãŒã·ã§ã³ã®ããŒãžã§ã³ãšäžèŽããå¿ èŠããããŸã
ãããã£ãŠã次ã®ç¶æ³ãæ³åããŠãã ãããè€æ°ã®ããã°ã©ããŒã®ããŒã ããããŒã¿ããŒã¹ãç©æ¥µçã«äœ¿çšããã¢ããªã±ãŒã·ã§ã³ãéçºããŠããŸãã æã ãã¢ããªã±ãŒã·ã§ã³ã¯å®çšŒåç°å¢ã«é ä¿¡ãããŸããããšãã°ãããã¯WebãµãŒããŒã«ãããã€ãããWebãµã€ãã§ãã
ã¢ããªã±ãŒã·ã§ã³ã³ãŒããèšè¿°ããããã»ã¹ã§ã¯ãããã°ã©ããŒã¯ããŒã¿ããŒã¹ã®æ§é ãšããã«æ ŒçŽãããŠããããŒã¿ãå€æŽããå¿ èŠããããŸãã ç°¡åãªäŸãæããŸããããããŒãã«ã®1ã€ã«nulläžå¯ã®æååãã£ãŒã«ãããããšããŸãã ãã®ãã£ãŒã«ãã«ã¯åžžã«ããŒã¿ããããšã¯éããŸããããã®å Žåã空ã®æååãããã«ä¿åãããŸãã ããæç¹ã§ã空ã®æååãæ ŒçŽããããšã¯ãå Žåã«ãã£ãŠã¯æå³çã«æ£ãããªããšå€æãïŒ 1ã2ãåç §ïŒãæ£ããNULLãæ ŒçŽããŸãã ãããå®è£ ããã«ã¯ã次ã®æé ãå¿ èŠã§ãã
1.ãã£ãŒã«ãã¿ã€ãããã«å¯èœã«å€æŽããŸãã
ALTER myTable CHANGE COLUMN myField myField VARCHAR (255) NULL DEFAULT NULL
;
2.ãã®ããŒãã«ã®æ¬çªããŒã¿ããŒã¹ã«ã¯ãã§ã«ç©ºã®è¡ãååšããå¯èœæ§ããããããææ決å®ãè¡ããæ å ±ã®æ¬ åŠãšããŠæ±ããŸãã ãããã£ãŠãããããNULLã«çœ®ãæããå¿ èŠããããŸãã
UPDATE myTable SET myField = NULL WHERE myField = ''
;
3.ã¢ããªã±ãŒã·ã§ã³ã³ãŒããå€æŽããŠãããŒã¿ããŒã¹ãããã®ãã£ãŒã«ãã«æ ŒçŽãããããŒã¿ãåä¿¡ãããšãã«ãNULLã«é©åã«å¿çããããã«ããŸãã ãŸãããã®ãã£ãŒã«ããžã®æžã蟌ã¿ã«ã¯ã空ã®è¡ã®ä»£ããã«NULLãå¿ èŠã«ãªããŸãã
ãã€ã³ã3ãããã¢ããªã±ãŒã·ã§ã³ãšããŒã¿ããŒã¹ã1ã€ã®å šäœã®äžå¯åãªéšåã§ããããšãããããŸãã ããã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ°ããããŒãžã§ã³ãå®çšŒåç°å¢ã«é ä¿¡ããããšãããŒã¿ããŒã¹ã®ããŒãžã§ã³ãæŽæ°ããå¿ èŠãããããšãæå³ããŸããããããªããšãã¢ããªã±ãŒã·ã§ã³ã¯åã«æ£ããåäœã§ããªããªããŸãã ãã®äŸã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¿ãæ°ããããŒãžã§ã³ã«æŽæ°ããããšãããæç¹ã§NULLãNULLäžå¯ãã£ãŒã«ãã«æ¿å ¥ãããŸãããããã¯æãããªãšã©ãŒã§ãã
ãããã£ãŠã ã¢ããªã±ãŒã·ã§ã³ã®ããŒãžã§ã³ãæŽæ°ããã«ã¯ãæ£ããããŒãžã§ã³ã®ããŒã¿ããŒã¹ç§»è¡ãå¿ èŠã§ãã
ç°¡åã§ããïŒ
ããŒã¿ããŒã¹ãšã¢ããªã±ãŒã·ã§ã³ã®ããŒãžã§ã³ã®ããªãã£ãå¿ èŠã§ããããšã«æ°ä»ããããç®çã®ããŒãžã§ã³ãžã®ããŒã¿ããŒã¹ã®ç§»è¡ãåžžã«æ£ããå®è¡ãããããšã確èªããå¿ èŠããããŸãã ããããããã§ã®åé¡ã¯äœã§ããïŒ çµå±ã®ãšãããäžèŠãè€éãªãã®ã¯äœããããŸããïŒ
ããã§åã³çããäŸã«æ»ããŸãã éçºããã»ã¹ã®ããã°ã©ãããããŒã¿ããŒã¹ã®æ§é ãšããŒã¿ã®å€æŽããSQLã¯ãšãªïŒ DDLãšDMLã¯ãšãªã®äž¡æ¹ïŒã®åœ¢åŒã§å¥ã®ãã¡ã€ã«ã«æžã蟌ããšããŸã ã ãããŠãã¢ããªã±ãŒã·ã§ã³ã®ææ°ããŒãžã§ã³ããããã€ãããã³ã«ãããŒã¿ããŒã¹ãææ°ããŒãžã§ã³ã«åæã«æŽæ°ããåãSQLãã¡ã€ã«ããã¯ãšãªãå®è¡ããŸã...ããããããŒã¿ããŒã¹ãææ°ããŒãžã§ã³ã«æŽæ°ããã®ã¯ã©ã®ããŒãžã§ã³ã§ããïŒ ãéå»ãããïŒ ããããåã®ããŒãžã§ã³ïŒ2ãæåã«ãªãªãŒã¹ããããã®ïŒãæ£ç¢ºã«äœã§ãã£ãããããèŠããŠããŸããïŒ ããã§ãªãå Žåãã©ã®ããã«æŽæ°ããŸããïŒ å®éãæ§é ãšããŒã¿ã®ç¶æ ã«é¢ããæ£ç¢ºãªæ å ±ããªããšãæ£ãã移è¡ããããšã¯ã§ããŸããããã§ã«å®è¡ãããã¯ãšãªã誀ã£ãŠå®è¡ãããšãããŒã¿ã®æ倱ãæŽåæ§ã®äŸµå®³ã«ã€ãªããå¯èœæ§ããããŸãã
ç°¡åãªäŸã¯ããã¹ã¯ãŒããMD5åèšã§çœ®ãæããããšã§ãã ãã®ãããªãªã¯ãšã¹ããåå®è¡ãããšãããŒã¿ã¯ããã¯ã¢ããããã®ã¿åŸ©å ã§ããŸãã ãšã«ãããç¹°ãè¿ãå®è¡ããã
UPDATE
ã
DELETE
ãããã«ã¯
INSERT
ã§ãããéåžžã«æãŸãããªãçµæãæãå¯èœæ§ããããŸãã ã¿ã€ãã³ã°ã®æªã
TRUNCATE
ããã³
DROP
ã«ã€ããŠã¯èšããŸã§ããããŸããïŒãã ãããã®ãããªå Žåã¯ã¯ããã«å°ãªãã§ãïŒã
ã¡ãªã¿ã«ããã®èŠ³ç¹ããèŠããšãäžååãªå®è¡ã¯ãéå°ãªå®è¡ãããã¢ããªã±ãŒã·ã§ã³ã®æäœæ§ãžã®å±éºã«å£ããŸããã
ãããã£ãŠãããŒãžã§ã³ç®¡çããã移è¡ã®ããã»ã¹ã§ã¯ããã¹ãŠã®èŠæ±ãäžåºŠã ãå®è¡ããããã«æ£ããé åºã§å®è¡ããå¿ èŠããããšçµè«ä»ããããšãã§ããŸã ã äžéšã®å€æŽã¯ä»ã®å€æŽã«äŸåããå¯èœæ§ããããããäžè²«æ§ãéèŠã§ãïŒnull蚱容ãã£ãŒã«ãã®äŸã®ããã«ïŒã
ããŒãžã§ã³ç§»è¡ã®äžè¬åå
åã®ã»ã¯ã·ã§ã³ã§ã¯ãããŒãžã§ã³ç®¡çããã移è¡ããã»ã¹ã«å¿ èŠãªãã®ã瀺ãéèŠãªåºæºãç¹å®ããŸããã ããã¯ïŒ- åå€æŽã®1åéãã®å®è¡ïŒSQLã¯ãšãªïŒ;
- å³å¯ã«äºåå®çŸ©ãããå€æŽã®é åºã
- ããŒã¿ããŒã¹ã®ä»»æã®ããŒãžã§ã³ãä»»æã®ïŒéåžžã¯ææ°ã®ïŒããŒãžã§ã³ã«æŽæ°ã§ããããã«ããŸãã
- ä»»æã®2ã€ã®ããŒãžã§ã³éã®ç§»è¡ãå®è£ ããäžé£ã®SQLã¯ãšãªãã§ããã ãè¿ éãã€ç°¡åã«åä¿¡ã§ããããã«ããŸãã
- ãã®ãããåžžã«ææ°ããŒãžã§ã³ã®æ§é ãæã€ããŒã¿ããŒã¹ããŒãããäœæã§ããŸãã ããã¯ãéçºããã»ã¹ãšãã¹ãããã»ã¹ãããã³æ°ããéçšãµãŒããŒãå±éãããšãã«éåžžã«åœ¹ç«ã¡ãŸãã
- ç°ãªããã©ã³ãã§ã®äœæ¥ã®å Žåããã®åŸã®ããŒãžã§ãããŒã¿ããŒã¹ãã¡ã€ã«ã®æåç·šéãæå°éã«æããããŸãã
- ããŒã¿ããŒã¹ã以åã®ããŒãžã§ã³ã«ããŒã«ããã¯ããã®ã¯ãæ°ããããŒãžã§ã³ã«æŽæ°ããã®ãšåããããç°¡åã§ããã
移è¡ã®ããŒã¹
å€æããããã«ãã»ãšãã©ã®ã¢ãããŒãã«ã¯å ±éã®ååããããŸããããŒã¹ã©ã€ã³ãã€ãŸãéå§ããããŒã¿ããŒã¹ã®ç¹å®ã®åç §ç¶æ ãå¿ èŠã§ãã ãã®æŠå¿µã¯ãScott Allen ã®Versioning Databases-The Baselineã«è©³ãã説æãããŠããŸãã
ç°¡åã«èšãã°ãåºç€ãšã¯ãããŒã¹ãšããŠåãå ¥ããããããŒãžã§ã³ã®ããŒã¿ããŒã¹æ§é ã®ãã³ãã§ãã åºç€ãæå ã«ããã°ãããŒã¿ããŒã¹ãæåããäœæããããšãåžžã«å¯èœã«ãªããŸãã éçºããã»ã¹äžã«äœæããããã¹ãŠã®ç§»è¡ããã®ããŒã¿ããŒã¹ã«é©çšããåŸãææ°ããŒãžã§ã³ã®æ§é ãæã€ããŒã¿ããŒã¹ãååŸããŸãã
次ã«ãããŒãžã§ã³ç®¡çãããããŒã¿ããŒã¹ã®ç§»è¡ãæŽçããããã®3ã€ã®ã¢ãããŒããæ€èšããŸãã
å¢åå€æŽæ¹æ³
ãã®æ¹æ³ã¯ãåãScott Allenã®èšäºãããŒã¿ããŒã¹ã®ããŒãžã§ã³ç®¡ç-ã¹ã¯ãªããã®å€æŽãã§è©³ãã説æãããŠããŸãã åæ§ã®ã¢ãããŒãã¯ã Michael Baylon ã«ããèšäºãSQLã¹ã¯ãªããã®ç®¡çãšç¶ç¶ççµ±åãã«ãèšèŒãããŠããŸã ããã¡ã€ã«æ§é
ãã®å Žåã移è¡ãã¡ã€ã«ã®ãããã©ã«ããŒãã©ã®ããã«èŠãããã®äŸïŒ
Database
|- Baseline.sql
|- 0001. 03 .01.sql
|- 0002. 03 .01.sql
|- 0003. 03 .01.sql
|- 0004. 03 .02.sql
|- 0005. 03 .02.sql
|- 0006. 03 .02.sql
'- 0007. 03 .02.sql
ãã®äŸã§ã¯ããã©ã«ããŒã«ã¯ããŒãžã§ã³03ã®éçºäžã«äœæããããã¹ãŠã®ãã¡ã€ã«ãæ ŒçŽãããŸãã ãã ãããã©ã«ããŒã¯ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ããŒãžã§ã³ã«å ±éããå ŽåããããŸãã
ãããã«ããŠãããã®ãããªãã©ã«ããŒã«è¡šç€ºãããæåã®ãã¡ã€ã«ã¯ããŒã¹ ïŒBaseline.sqlïŒã§ãã ãã®åŸãããŒã¿ããŒã¹ã®å€æŽã¯ã
[ ].[].[].sql
ãšãã圢åŒã®ååãæã€æ°ãã移è¡ãã¡ã€ã«ã®åœ¢åŒã§ãªããžããªã«éä¿¡ãããŸãã
å®éããã®äŸã§ã¯ããã¡ã€ã«åã«ããŒã¿ããŒã¹ã®å®å šãªããŒãžã§ã³çªå·ãå«ãŸããŠããŸãã ã€ãŸããååã
0006 .03.02.sql
ã®ç§»è¡ãã¡ã€ã«
0006 .03.02.sql
ãããŒã¿ããŒã¹ã¯ããŒãžã§ã³
03.02. 0005
察å¿ããç¶æ ããæŽæ°ãããŸã
03.02. 0005
03.02. 0005
ããããŒãžã§ã³
03.02. 0006
03.02. 0006
ããŒãžã§ã³å±¥æŽä¿å
次ã®ã¹ãããã¯ãããŒã¿ããŒã¹ã«ãã¹ãŠã®å€æŽã®å±¥æŽãä¿åããç¹å¥ãªããŒãã«ãããŒã¿ããŒã¹ã«è¿œå ããããšã§ãã
CREATE TABLE MigrationHistory
(
Id INT ,
MajorVersion VARCHAR (2),
MinorVersion VARCHAR (2),
FileNumber VARCHAR (4),
Comment VARCHAR (255),
DateApplied DATETIME ,
PRIMARY KEY (Id)
)
ããã¯ãããŒãã«ãã©ã®ããã«èŠãããã®äžäŸã«ãããŸããã å¿ èŠã«å¿ããŠãç°¡çŽ åãšè£è¶³ã®äž¡æ¹ãè¡ãããšãã§ããŸãã
Baseline.sql
ãã¡ã€ã«ã§ããã®ããŒãã«ã«æåã®ã¬ã³ãŒããè¿œå ããå¿ èŠããããŸãã
INSERT INTO
MigrationHistory ( MajorVersion, MinorVersion, FileNumber, Comment, DateApplied )
VALUES ( '03' , '01' , '0000' , 'Baseline' , NOW() )
å移è¡ãã¡ã€ã«ãå®äºãããšããã¹ãŠã®ç§»è¡ããŒã¿ãå«ããšã³ããªããã®ããŒãã«ã«å ¥åãããŸãã
ããŒã¿ããŒã¹ã®çŸåšã®ããŒãžã§ã³ã¯ãæ倧æ¥ä»ã®ã¬ã³ãŒãããååŸã§ããŸãã
èªåçã«ç§»è¡ãã
ãã®ã¢ãããŒãã®æåŸã®ä»äžãã¯ãããŒã¿ããŒã¹ãçŸåšã®ããŒãžã§ã³ããææ°ã®ããŒãžã§ã³ã«æŽæ°ããããã°ã©ã /ã¹ã¯ãªããã§ãã
ããŒã¿ããŒã¹ã®ç§»è¡ãèªåçã«å®è¡ããã®ã¯éåžžã«ç°¡åã§ãããªããªãã æåŸã«å®è¡ããã移è¡ã®æ°ã¯ãMigrationHistoryããŒãã«ããååŸã§ããŸãããã®åŸããã倧ããªçªå·ãæã€ãã¹ãŠã®ãã¡ã€ã«ãé©çšããããã ãã«æ®ããŸãã ãã¡ã€ã«ãçªå·é ã«äžŠã¹æ¿ããããšãã§ããããã移è¡ã®é åºã«åé¡ã¯ãããŸããã
ãã®ãããªã¹ã¯ãªããã«ã¯ãå®äºãã移è¡ã®ã¬ã³ãŒããMigrationHistoryããŒãã«ã«è¿œå ããã¿ã¹ã¯ããããŸãã
ããã«äŸ¿å©ãªç¹ãšããŠããã®ãããªã¹ã¯ãªããã¯ãæåã«ããŒã¿ããŒã¹ã®çŸåšã®ããŒãžã§ã³ãæåããäœæããæåã«ããŒã¿ããŒã¹ã«ããŒã¿ããŒã¹ãå±éããŠãããææ°ããŒãžã§ã³ãžã®æšæºçãªç§»è¡æäœãå®è¡ã§ããå ŽåããããŸãã
é·æãçæãçµè«





ããŸããŸãªåœ¢åŒã®ãã®æ¹æ³ã¯éåžžã«åºãæ®åããŠããŸãã ããã«ããããžã§ã¯ãã®ããŒãºã«åãããŠç°¡åã«å€æŽããã³å€æŽã§ããŸãã
ã€ã³ã¿ãŒãããã§ã¯ãã€ã³ã¯ãªã¡ã³ã¿ã«ç§»è¡çšã®æ¢æã®ã¹ã¯ãªãããªãã·ã§ã³ãèŠã€ããŠããããžã§ã¯ãã«åã蟌ãããšãã§ããŸãã
ã¹ãçå€åæ³
ãã®æ¹æ³ã¯ãPhil Hack ã®INFORMATION_SCHEMAãã¥ãŒã䜿çšããé²åŒŸSQLå€æŽã¹ã¯ãªããã§èª¬æãããŠããŸãã StackOverflowã®ãã®è³ªåã«å¯Ÿããåçã§ããåæ§ã®ã¢ãããŒãã説æãããŠããŸããã¹ãçæ§ãšã¯ããªããžã§ã¯ããåã³å€æŽããããšãããšãã«ããªããžã§ã¯ãã®ããããã£ãå€æŽãããªããŸãŸã§ãããšç解ãããããšã§ãã
ããŒãã¯ãFriendsãã®é¢çœãã·ãŒã³ãæãåºããŸã:)
ãã®ã¢ãããŒãã®äž»ãªã¢ã€ãã¢ã¯ãããŒã¿ããŒã¹äžã§è€æ°åå®è¡ã§ããããã«ç§»è¡ãã¡ã€ã«ãäœæããããšã§ãã SQLã³ãã³ãã®ãããããæåã«å®è¡ããããšãããšãå€æŽãé©çšãããŸãã ãã®åŸã®ãã¹ãŠã®è©Šè¡ã§ã¯ãäœãèµ·ãããŸããã
ãã®ã¢ã€ãã¢ã¯ãäŸã䜿çšããŠç解ããã®ãæãç°¡åã§ãã ããŒã¿ããŒã¹ã«æ°ããããŒãã«ãè¿œå ããå¿ èŠããããšããŸãã ã¯ãšãªãæ¢ã«ååšããå Žåãã¯ãšãªã®å®è¡æã«ãšã©ãŒãçºçããªãããã«ããå ŽåãMySQLã«ã¯æ¬¡ã®ç®çã®ããã®çãæ§æããããŸãã
CREATE TABLE IF NOT EXISTS myTable
(
id INT (10) NOT NULL ,
myField VARCHAR (255) NULL ,
PRIMARY KEY (id)
);
IF NOT EXISTS
ããŒã¯ãŒãã®ãããã§ãMySQLã¯åãååã®ããŒãã«ããŸã ååšããªãå Žåã«ã®ã¿ããŒãã«ãäœæããããšããŸãã ãã ãããã®æ§æã¯ãã¹ãŠã®DBMSã§äœ¿çšã§ããããã§ã¯ãããŸããã ãŸããMySQLã§ããã¹ãŠã®ã³ãã³ãã«äœ¿çšã§ããããã§ã¯ãããŸããã ãããã£ãŠãããæ®éçãªæ¹æ³ãæ€èšããŸãã
IF NOT EXISTS
(
SELECT *
FROM information_schema.tables
WHERE table_name = 'myTable'
AND table_schema = 'myDb'
)
THEN
CREATE TABLE myTable
(
id INT (10) NOT NULL ,
myField VARCHAR (255) NULL ,
PRIMARY KEY (id)
);
END IF ;
æåŸã®äŸã§ã¯ãããŒãã«
myTable
myDb
ãšããååã®ããŒã¿ããŒã¹ã«
myTable
ãã©ããã確èªããã¯ãšãªãæ¡ä»¶åŒãã©ã¡ãŒã¿ãŒã®åœ¹å²ãæãããŸãã ãããŠãããŒãã«ãæ¬ èœããŠããå Žåã«ã®ã¿ãå®éã«äœæãããŸãã ãããã£ãŠãäžèšã®ã¯ãšãªã¯ã¹ãçã§ãã
MySQLã§ã¯ãäœããã®çç±ã§ãæ¡ä»¶åŒå ã§DDLã¯ãšãªãå®è¡ããããšãçŠæ¢ãããŠããããšã«æ³šæããŠãã ããã ãã ãããã®çŠæ¢äºé ã¯ç°¡åã«åé¿ã§ããŸãããã®ãããªèŠæ±ããã¹ãŠã¹ãã¢ãããã·ãŒãžã£ã®æ¬æã«å«ããã ãã§ãã
DELIMITER $$
CREATE PROCEDURE sp_tmp() BEGIN
IF NOT EXISTS
(
--
-- .
--
)
THEN
--
-- , .
--
END IF ;
END ;
$$
DELIMITER;
CALL sp_tmp();
DROP PROCEDURE sp_tmp;
information_schemaãšã¯ã©ã®ãããªé³¥ã§ããïŒ
information_schemaãšããååã®ããŒã¿ããŒã¹ã«ããç¹å¥ãªã·ã¹ãã ããŒãã«ãããããŒã¿ããŒã¹æ§é ã«é¢ããå®å šãªæ å ±ãååŸã§ããŸãã ãã®ããŒã¿ããŒã¹ãšãã®ããŒãã«ã¯SQL-92æšæºã®äžéšã§ããããããã®ã¡ãœããã¯ææ°ã®DBMSã§äœ¿çšã§ããŸãã åã®äŸã§ã¯ããã¹ãŠã®ããŒãã«ã«é¢ããããŒã¿ãæ ŒçŽãã
information_schema.tables
ããŒãã«ã䜿çšããŠã
information_schema.tables
ã åæ§ã«ãããŒãã«ãã¹ãã¢ãããã·ãŒãžã£ãããªã¬ãŒãã¹ããŒããããã³å®éã«ã¯ããŒã¿ããŒã¹æ§é å ã®ä»ã®ãªããžã§ã¯ãã®ãã£ãŒã«ãã®ååšãšã¡ã¿ããŒã¿ã確èªã§ããŸãã
ãããã®ç®çã«é¢ãã詳现ãªæ å ±ãããããŒãã«ã®å®å šãªãªã¹ãã¯æšæºã®ããã¹ãã§èŠã€ããããšãã§ããŸãã çããªã¹ãã¯ãåè¿°ã®Phil Hackã®èšäºã§èŠãããšãã§ããŸãã ããããæãç°¡åãªæ¹æ³ã¯ããã¡ãããåäœããŠããããŒã¿ããŒã¹ãµãŒããŒã§ãã®ããŒã¿ããŒã¹ãéããŠããã®åäœã確èªããããšã§ãã
䜿çšäŸ
ãããã£ãŠãã¹ãçã®SQLã¯ãšãªãäœæããæ¹æ³ãç¥ã£ãŠããŸãã 次ã«ããã®ã¢ãããŒããå®éã«äœ¿çšããæ¹æ³ãæ€èšããŸãã
ãã®å Žåãsqlãã¡ã€ã«ã®ãããã©ã«ããŒãã©ã®ããã«èŠãããã®äŸïŒ
Database
|- 3.01
| |- Baseline.sql
| '- Changes.sql
|
'- 3.02
|- Baseline.sql
'- Changes.sql
ãã®äŸã§ã¯ãããŒã¿ããŒã¹ã®ãã€ããŒããŒãžã§ã³ããšã«åå¥ã®ãã©ã«ããŒãäœæãããŸãã æ°ãããã©ã«ããŒãäœæãããã³ã«ãããŒã¹ã©ã€ã³ãçæãããBaseline.sqlã«èšé²ãããŸãã 次ã«ãéçºããã»ã¹äžã«ããã¹ãŠã®å¿ èŠãªå€æŽããã¹ãçã¯ãšãªã®åœ¢åŒã§Changes.sqlãã¡ã€ã«ã«æžã蟌ãŸããŸãã
ããŸããŸãªææã®éçºäžã«ãããã°ã©ããŒãããŒã¿ããŒã¹ã«æ¬¡ã®å€æŽãå ããå¿ èŠããããšããŸãã
aïŒããŒãã«myTableãäœæããŸãã
bïŒæ°ãããã£ãŒã«ããã£ãŒã«ããè¿œå ããŸãã
cïŒmyTableããŒãã«ã«ããŒã¿ãè¿œå ããŸãã
3ã€ã®å€æŽã¯ãã¹ãŠãç¹°ãè¿ãããªãããã«èšè¿°ãããŠããŸãã ãã®çµæãããŒã¿ããŒã¹ãã©ã®äžéç¶æ ã«ãããã«é¢ä¿ãªããChanges.sqlãã¡ã€ã«ãå®è¡ããããšãåžžã«ææ°ããŒãžã§ã³ã«ç§»è¡ãããŸãã
ããšãã°ãéçºè ã®1人ãããŒã¿ããŒã¹ã®ããŒã«ã«ã³ããŒã«myTableããŒãã«ãäœæããäžè¬ã³ãŒããªããžããªã«æ ŒçŽãããŠããChanges.sqlãã¡ã€ã«ã«å€æŽaïŒãèšé²ãããã°ããå¿ããŠããŸããã ããã§ã圌ãããŒã«ã«ããŒã¿ããŒã¹ã§ãã®ãã¡ã€ã«ãå®è¡ãããšãå€æŽaïŒã¯ç¡èŠãããå€æŽbïŒãšcïŒãé©çšãããŸãã
é·æãçæãçµè«



ããŒã¿ããŒã¹ãææ°ããŒãžã§ã³ã«æŽæ°ããã®ã¯éåžžã«ç°¡åã§ãããæåã§è¡ãããšãã§ãããããå€ãã®éçšãµãŒããŒããããé »ç¹ã«æŽæ°ããå¿ èŠãããå Žåããã®æ¹æ³ã¯éåžžã«åªããŠããŸãã
ããŒã¿ããŒã¹ã®æ§é ããœãŒã¹ã³ãŒããšæ¯èŒããæ¹æ³
æ®å¿µãªããããã®ã¢ãããŒãã«é¢ããèšäºã¯èŠã€ãããŸããã§ããã ããããã°ãæ¢åã®èšäºãžã®ãªã³ã¯ã«æè¬ããŸãã UPDïŒ Absentã¯èªåã®èšäºã§ ãèªå·±äœæã®diffãŠãŒãã£ãªãã£ã䜿çšããŠåæ§ã®ã¢ãããŒããå®è£ ããçµéšã«ã€ããŠèªã£ãŠããŸãããã®ã¡ãœããã®äž»ãªèãæ¹ã¯ãããããŒã«åæ ãããŠããŸããããŒã¿ããŒã¹æ§é ã¯ãPHPãCïŒããŸãã¯HTMLã³ãŒããšåããœãŒã¹ã³ãŒãã§ãã ãããã£ãŠã移è¡ãã¡ã€ã«ïŒããŒã¿ããŒã¹æ§é ãå€æŽããã¯ãšãªïŒãã³ãŒããªããžããªã«ä¿åãã代ããã«ãçŸåšã®ããŒã¿ããŒã¹æ§é ã宣èšåœ¢åŒã§ä¿åããã ãã§æžã¿ãŸãã
å®è£ äŸ
äŸãç°¡åã«ããããã«ããªããžããªã®åãªããžã§ã³ã«ã¯åžžã«CreateDatabase.sqlãšãã1ã€ã®SQLãã¡ã€ã«ã®ã¿ããããšæ³å®ããŠããŸãã ãã£ãå ã§ã¯ããœãŒã¹ã³ãŒããšåæ§ã«ãããã«é²ãã§ãåããŒã¿ããŒã¹ãªããžã§ã¯ãã®æ§é ãåå¥ã®ãã¡ã€ã«ã«æ ŒçŽã§ããããšã«æ³šæããŠãã ããã ãŸããæ§é ã¯ãDBMSã§ãµããŒããããŠããXMLãŸãã¯ãã®ä»ã®åœ¢åŒã§ä¿åã§ããŸãã
CreateDatabase.sqlãã¡ã€ã«ã«ã¯ãããŒã¿ããŒã¹å šäœãæåããäœæãã
CREATE TABLE
ã
CREATE PROCEDURE
ãªã©ã®ã³ãã³ããå«ãŸããŸãã å¿ èŠã«å¿ããŠãããŒãã«ã®æ§é ãå€æŽããŸãããããã®å€æŽã¯æ¢åã®DDLã¯ãšãªã«çŽæ¥è¡ãããããŒãã«ãäœæãããŸãã ã¹ãã¢ãããã·ãŒãžã£ãããªã¬ãŒãªã©ã®å€æŽã«ã€ããŠãåæ§ã§ãã
ããšãã°ããªããžããªã®çŸåšã®ããŒãžã§ã³ã«ã¯ãã§ã«ããŒãã«myTableããããCreateDatabase.sqlãã¡ã€ã«ã§ã¯æ¬¡ã®ããã«ãªããŸãã
CREATE TABLE myTable
(
id INT (10) NOT NULL ,
myField VARCHAR (255) NULL ,
PRIMARY KEY (id)
);
ãã®ããŒãã«ã«æ°ãããã£ãŒã«ããè¿œå ããå¿ èŠãããå Žåã¯ãæ¢åã®DDLã¯ãšãªã«è¿œå ããã ãã§ãã
CREATE TABLE myTable
(
id INT (10) NOT NULL ,
myField VARCHAR (255) NULL ,
newfield INT(4) NOT NULL ,
PRIMARY KEY (id)
);
ãã®åŸãå€æŽãããsqlãã¡ã€ã«ãã³ãŒããªããžããªã«éä¿¡ãããŸãã
ããŒãžã§ã³éã®ç§»è¡ã®å®è¡
ãã®æ¹æ³ã§ã¯ãããŒã¿ããŒã¹ãæ°ããããŒãžã§ã³ã«æŽæ°ããæé ã¯ãä»ã®æ¹æ³ã»ã©ç°¡åã§ã¯ãããŸããã ããŒãžã§ã³ããšã«æ§é ã®å®£èšçãªèšè¿°ã®ã¿ãä¿åãããããã移è¡ããšã«
ALTER
ã
DROP
ããã³
CREATE
èŠæ±ã®åœ¢åŒã§éããçæããå¿ èŠããããŸãã å€ãã®DBMSã§å©çšå¯èœãªSQLyog TOADã®äžéšã§ããã¹ããŒãåæããŒã«ã DmitryKoterovã«ããPostgreSQLã®Dklab_pgmigrator ã RedGateã® SQLæ¯èŒSDKãªã©ãèªååãããdiffãŠãŒãã£ãªãã£ã圹ç«ã¡ãŸãã
ããããŒã¿ããŒã¹ããŒãžã§ã³ããå¥ã®ããŒã¿ããŒã¹ããŒãžã§ã³ã«ç§»è¡ããã«ã¯ã2ã€ã®äžæããŒã¿ããŒã¹ã§å ã®ããŒãžã§ã³ãšæçµããŒãžã§ã³ã®æ§é ã埩å ããŠããã移è¡ã¹ã¯ãªãããçæããå¿ èŠããããŸãã ãã ãããã®æé ã¯èªååã§ãããããããã»ã©æéã¯ããããŸããã
ããŒã¿ã®å€æŽã¯ã©ãã§ããïŒ
æ¬çªãµãŒããŒã§ããŒã¿ããŒã¹ã®ããŒãžã§ã³ãæŽæ°ãããšãã¯ãããŒã¿ããŒã¹æ§é ã ãã§ãªããããã«ä¿åãããŠããããŒã¿ãæŽæ°ããå¿ èŠãããå ŽåããããŸãã äŸã¯ãæ£èŠåããããã®ãå€ãæ§é ãæã€ããŒãã«ããæ°ããããŒãã«ãžã®ããŒã¿ã®è»¢éã§ãã å®çšŒåãµãŒããŒäžã®ããŒã¿ã¯æ¢ã«ååšãã䜿çšãããŠãããããæ°ããããŒãã«ãäœæããŠå€ãããŒãã«ãåé€ããã ãã§ã¯äžååã§ããæ¢åã®ããŒã¿ã転éããå¿ èŠããããŸãã
以åã®æ¹æ³ã§ã¯ã移è¡ãä¿åããã³å®è¡ãããšããã³ã³ããã¹ãã§ãããŒã¿ã¯ããŒã¿ããŒã¹ã®æ§é ãšããŸãå€ãããŸããã§ããã ãã ãããã®æ¹æ³ã§ã¯ã宣èšåœ¢åŒã§ã³ãŒããªããžããªã«ä¿åããããšã¯äžå¯èœã§ãããããããŒã¿ã®å€æŽã¯ç¹å¥ã§ãããã¹ãŠã®ãµãŒããŒäžã®ããŒã¿ã¯ç°ãªããŸãã ãŸããããŒã¿ãå€æŽããããã«ãã®ãããªã¯ãšãªãèªåçã«çæããããšãäžå¯èœã§ãã人éã®ä»å ¥ãå¿ èŠã§ãã
ãã®åé¡ã«ã¯ãããã€ãã®å€ããå°ãªããåãå ¥ãããã解決çããããŸãã
- ããŒã¿ã®å€æŽãå¢åå€æŽæ¹æ³ã«åŸã£ãŠïŒããããç°¡ç¥åããã圢åŒã§ïŒä¿åããçæåŸã«æåã§çµæã®diffã¹ã¯ãªããã«è¿œå ããŸãã
- ããŒã¿å€æŽãªã¯ãšã¹ããä¿åããå Žæããªããdiffã¹ã¯ãªãããçæããããããããåæããŠå¿ èŠãªãã¹ãŠã®DMLãªã¯ãšã¹ããè¿œå ããŸã ã ç§ã®ååãããããæ©èœããŠããŠæ¬ ç¹ããªããšäž»åŒµããŠãããããããç§ã¯ãã®æ±ºå®ãããã«ãããããŸãã å±éºããããšæã diffã¹ã¯ãªããã®çæã¯ãå€æŽã®ã¢ããªã±ãŒã·ã§ã³é¢é£éšåã§äœæ¥ããŠããæ°ãæåŸã«çºçããå¯èœæ§ããããæ£ããããŒã¿ç§»è¡ã«å¿ èŠãªè©³çŽ°ã¯ãã§ã«å¿ããããŠããå¯èœæ§ããããŸãã
é·æãçæãçµè«








ãã®æ¹æ³ã«ã¯å€ãã®å©ç¹ããããŸããèšèŒãããŠããããŒã¿å€æŽã®åé¡ãæãããéçšãµãŒããŒãžã®æŽæ°ããŸããªå Žåã¯ããã®æ¹æ³ã䜿çšããããšããå§ãããŸãã
ããŒãžã§ã³ç®¡çãããããŒã¿ããŒã¹ç§»è¡ã®ããã®æ¢è£œã®ãœãªã¥ãŒã·ã§ã³
äžèšã®æ¹æ³ã¯ããµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ãªãã§ã䜿çšã§ããŸãããããã«äœ¿çšã§ãã補åããããããããç¬èªã®ã€ããªãã®ãŒãšç¬èªã®ã¢ãããŒãããããå¥ã®èšäºã«å€ããŸããããŒãžã§ã³ç®¡çããã移è¡ãœãªã¥ãŒã·ã§ã³ãéžæãããšãã¯ããã®ãããªè£œåãèæ ®ããŠãã ããããããã®ããã€ãã¯ã Denis Gladkikh ã«ããæè¿ã®èšäºãããŒã¿ããŒã¹ã®ããŒãžã§ã³ç®¡çã®ã¢ãããŒããã§èª¬æãããŠããŸãã
ããã«äœ¿çšã§ããããŒãžã§ã³å¯Ÿå¿ã®ç§»è¡ã·ã¹ãã ã®ããäžéšã®ã¿ã以äžã«ç€ºããŸãã
- Migrator.NET ;
- ECM7.Migrator â Migrator.NET dima117 . ;
- Active Record Migrations , Ruby on Rails;
- SQL Source Control RedGate;
- DotNetMigrations ;
- Fluent Migrator . tabushi , ;
- DbDeploy.NET ;
- Tarantino ;
- Mygrate ;
- DBUpdater ;
- Wizardby ostapbender .