
ããŒã¿ããŒã¹ã®ããŒãžã§ã³ã®å¶åŸ¡ãšããŒãžã§ã³éã®ç§»è¡ã®åé¡ã¯ãHabréïŒ
1ã2ã3ãªã©ïŒãšã€ã³ã¿ãŒãããïŒäž»ã«è±èªïŒã®äž¡æ¹ã§ç¹°ãè¿ãçºçããŠããŸãã
ãã®èšäºã®æåã®ã»ã¯ã·ã§ã³ã§ã¯ãããŒã¿ããŒã¹æ§é ã«å€æŽãå ããéã«ããã°ã©ããŒã®ããŒã ã§çºçããäž»ãªåé¡ã«ã€ããŠèª¬æããŸãã 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ããŒãã«ã«è¿œå ããã¿ã¹ã¯ããããŸãã
ããã«äŸ¿å©ãªç¹ãšããŠããã®ãããªã¹ã¯ãªããã¯ãæåã«ããŒã¿ããŒã¹ã®çŸåšã®ããŒãžã§ã³ãæåããäœæããæåã«ããŒã¿ããŒã¹ã«ããŒã¿ããŒã¹ãå±éããŠãããææ°ããŒãžã§ã³ãžã®æšæºçãªç§»è¡æäœãå®è¡ã§ããå ŽåããããŸãã
é·æãçæãçµè«

ææ°ããŒãžã§ã³ãžã®è¿
éãã€ç°¡åãªç§»è¡ã

ããŒãžã§ã³çªå·ä»ãã¡ã«ããºã ã çŸåšã®ããŒãžã§ã³çªå·ã¯ããŒã¿ããŒã¹ã«çŽæ¥ä¿åãããŸãã

æå€§éã®å©äŸ¿æ§ãåŸãã«ã¯ãç§»è¡çšã®èªååããŒã«ãå¿
èŠã§ãã

ããŒã¿ããŒã¹æ§é ã«ã³ã¡ã³ãã远å ããã®ã¯äžäŸ¿ã§ãã Baseline.sqlã«è¿œå ãããšã次ã®ããŒãžã§ã³ã§ã¯è¡šç€ºãããªããªããŸãã æ§é ã®æ°ããããŒãžã§ã³ã®ãã³ããšããŠãããŒã¹ã¯æåããåã³çæãããŸãã ããã«ããã®ãããªã³ã¡ã³ãã¯ããã«æä»£é
ãã«ãªããŸãã

ãªããžããªã®ããã€ãã®ãã©ã³ãã§ã¯ã䞊è¡éçºããã»ã¹äžã«åé¡ããããŸãã ç§»è¡ãã¡ã€ã«ã®çªå·ä»ãã¯é£ç¶ããŠãããããç°ãªãDDL / DMLèŠæ±ãæã€ãã¡ã€ã«ã¯ãç°ãªããã©ã³ãã®åãçªå·ã®äžã«è¡šç€ºãããå ŽåããããŸãã ãã®ããããã©ã³ããããŒãžãããšãã¯ããã¡ã€ã«ãšãã®ã·ãŒã±ã³ã¹ãæåã§ç·šéããããæ°ãããããŒãžãããããã©ã³ãã§ãäž¡æ¹ã®ãã©ã³ãããã®å€æŽãèæ
®ããæ°ããBaseline.sqlã§éå§ããå¿
èŠããããŸãã
ããŸããŸãªåœ¢åŒã®ãã®æ¹æ³ã¯éåžžã«åºãæ®åããŠããŸãã ããã«ããããžã§ã¯ãã®ããŒãºã«åãããŠç°¡åã«å€æŽããã³å€æŽã§ããŸãã
ã€ã³ã¿ãŒãããã§ã¯ãã€ã³ã¯ãªã¡ã³ã¿ã«ç§»è¡çšã®æ¢æã®ã¹ã¯ãªãããªãã·ã§ã³ãèŠã€ããŠããããžã§ã¯ãã«åã蟌ãããšãã§ããŸãã
ã¹ãçå€åæ³
ãã®æ¹æ³ã¯ã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ïŒãé©çšãããŸãã
é·æãçæãçµè«

äžéããŒãžã§ã³ããææ°ããŒãžã§ã³ãžã®éåžžã«äŸ¿å©ãªç§»è¡-ããŒã¿ããŒã¹ïŒChanges.sqlïŒã§1ã€ã®ãã¡ã€ã«ãå®è¡ããã ãã§ãã

ããŒã¿ã倱ãããå¯èœæ§ã®ããç¶æ³ã¯ããããç£èŠããå¿
èŠããããŸãã ããšãã°ãããŒãã«ãåé€ããŠãããåãååã®å¥ã®ããŒãã«ãäœæããŸãã åé€äžã«ååã®ã¿ããã§ãã¯ãããå ŽåãäžåºŠå®è¡ããããšããäºå®ã«ãããããããã¹ã¯ãªãããå®è¡ããããã³ã«äž¡æ¹ã®æäœïŒåé€ãšäœæïŒãçºçããŸãã

倿Žãiçã§ããããã«ã¯ãããããæžãã®ã«ããå€ãã®æéïŒããã³ã³ãŒãïŒãè²»ããå¿
èŠããããŸãã
ããŒã¿ããŒã¹ãææ°ããŒãžã§ã³ã«æŽæ°ããã®ã¯éåžžã«ç°¡åã§ãããæåã§è¡ãããšãã§ãããããå€ãã®éçšãµãŒããŒããããé »ç¹ã«æŽæ°ããå¿
èŠãããå Žåããã®æ¹æ³ã¯éåžžã«åªããŠããŸãã
ããŒã¿ããŒã¹ã®æ§é ããœãŒã¹ã³ãŒããšæ¯èŒããæ¹æ³
æ®å¿µãªããããã®ã¢ãããŒãã«é¢ããèšäºã¯èŠã€ãããŸããã§ããã ããããã°ãæ¢åã®èšäºãžã®ãªã³ã¯ã«æè¬ããŸãã
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ã¹ã¯ãªããã®çæã¯ã倿Žã®ã¢ããªã±ãŒã·ã§ã³é¢é£éšåã§äœæ¥ããŠããæ°ãæåŸã«çºçããå¯èœæ§ããããæ£ããããŒã¿ç§»è¡ã«å¿
èŠãªè©³çްã¯ãã§ã«å¿ããããŠããå¯èœæ§ããããŸãã
é·æãçæãçµè«

ããŒãžã§ã³ç®¡çã·ã¹ãã ã®ããŒã«ã䜿çšããŠãããŒãžã§ã³éã®æ§é ã®å€åã芳å¯ãããšäŸ¿å©ã§ãã

ä»ã®ãœãŒã¹ã³ãŒããšåæ§ã«ãããŒã¿ããŒã¹æ§é ã«ã€ããŠã³ã¡ã³ãããã®ã䟿å©ã§ãã
ææ°ããŒãžã§ã³ã®ã¯ãªãŒã³ãªããŒã¿ããŒã¹ããŒãããäœæããã«ã¯ã1ã€ã®ãã¡ã€ã«ã®ã¿ãå®è¡ããå¿
èŠããããŸãã
ç§»è¡ã¹ã¯ãªããã¯ãèªåçã«çæããããããä»ã®æ¹æ³ãããä¿¡é Œæ§ãé«ããªããŸãã
æ°ããããŒãžã§ã³ããå€ãããŒãžã§ã³ãžã®ç§»è¡ã¯ãå€ãããŒãžã§ã³ããæ°ããããŒãžã§ã³ãžã®ç§»è¡ãšã»ãŒåããããç°¡åã§ãïŒåé¡ã¯æªåé«ãããŒã¿ã®å€æŽã«ãã£ãŠã®ã¿çºçããŸãïŒã
ãªããžããªã®2ã€ã®ãã©ã³ããããŒãžããå ŽåãããŒã¿ããŒã¹æ§é ã®ããŒãžã¯ä»ã®ã¢ãããŒãã䜿çšãããããç°¡åã§ãã
ããŒã¿ã®å€æŽã¯åå¥ã«ä¿åããçæãããç§»è¡ã¹ã¯ãªããã«æåã§æ¿å
¥ããå¿
èŠããããŸãã
æåã§ç§»è¡ãå®è¡ããã®ã¯éåžžã«äžäŸ¿ã§ãããèªååãããããŒã«ãå¿
èŠã§ãããã®æ¹æ³ã«ã¯å€ãã®å©ç¹ããããŸããèšèŒãããŠããããŒã¿å€æŽã®åé¡ãæãããéçšãµãŒããŒãžã®æŽæ°ããŸããªå Žåã¯ããã®æ¹æ³ã䜿çšããããšããå§ãããŸããããŒãžã§ã³ç®¡çãããããŒã¿ããŒã¹ç§»è¡ã®ããã®æ¢è£œã®ãœãªã¥ãŒã·ã§ã³
äžèšã®æ¹æ³ã¯ããµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ãªãã§ã䜿çšã§ããŸãããããã«äœ¿çšã§ãã補åããããããããç¬èªã®ã€ããªãã®ãŒãšç¬èªã®ã¢ãããŒãããããå¥ã®èšäºã«å€ããŸããããŒãžã§ã³ç®¡çãããç§»è¡ãœãªã¥ãŒã·ã§ã³ãéžæãããšãã¯ããã®ãããªè£œåãèæ
®ããŠãã ããããããã®ããã€ãã¯ã Denis Gladkikh ã«ããæè¿ã®èšäºãããŒã¿ããŒã¹ã®ããŒãžã§ã³ç®¡çã®ã¢ãããŒããã§èª¬æãããŠããŸããããã«äœ¿çšã§ããããŒãžã§ã³å¯Ÿå¿ã®ç§»è¡ã·ã¹ãã ã®ããäžéšã®ã¿ã以äžã«ç€ºããŸããããŒã¿ããŒã¹ã«å€æŽãä¿åããŠé©çšããã«ã¯ãããŸããŸãªæ¹æ³ããããŸãããããžã§ã¯ãã§ã©ããéžæãããã¯ããã»ã©éèŠã§ã¯ãããŸãããäž»ãªããšã¯ãããããã®æ¹æ³ãæ¡çšããŠçå®ã«ããã«åŸãããšã§ããæ®ãã¯è©³çްã§ããç§ã¯ãã®èšäºã§ãã®èããäŒããããšããŸãããæãç°¡åãªæ¹æ³ã®åé¡ãç§ã®èãã«å ããŠã圌ããããªãã«æãé©ãã解決çãéžã¶ã®ãå©ããããšãæãã§ããŸãã