ΠŸΡ€ΠΈΠΌΠ΅Π½Π° ΠΈ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π±Π΅Π· Π·Π°ΡΡ‚ΠΎΡ˜Π°

ΠŸΡ€ΠΈΠΌΠ΅Π½Π° ΠΈ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π±Π΅Π· Π·Π°ΡΡ‚ΠΎΡ˜Π°

Овај Ρ‡Π»Π°Π½Π°ΠΊ Π΄Π΅Ρ‚Π°Ρ™Π½ΠΎ објашњава ΠΊΠ°ΠΊΠΎ Π΄Π° Ρ€Π΅ΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ са ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½ΠΎΡˆΡ›Ρƒ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈ. Π Π΅Ρ›ΠΈ Ρ›Π΅ΠΌΠΎ Π²Π°ΠΌ ΡˆΡ‚Π° сС ΠΌΠΎΠΆΠ΅ Π΄ΠΎΠ³ΠΎΠ΄ΠΈΡ‚ΠΈ вашим ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΈΠΌ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°ΠΌΠ° Π°ΠΊΠΎ ΠΏΠΎΠΊΡƒΡˆΠ°Ρ‚Π΅ Π΄Π° ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ Π±Π΅Π· ΠΏΡ€Π΅Π»ΠΈΠΌΠΈΠ½Π°Ρ€Π½Π΅ ΠΏΡ€ΠΈΠΏΡ€Π΅ΠΌΠ΅. Π—Π°Ρ‚ΠΈΠΌ Ρ›Π΅ΠΌΠΎ ΠΏΡ€ΠΎΡ›ΠΈ ΠΊΡ€ΠΎΠ· Ρ„Π°Π·Π΅ ΠΆΠΈΠ²ΠΎΡ‚Π½ΠΎΠ³ циклуса Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ Π·Π° којС јС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ Π΄Π° Π½Π΅ΠΌΠ°Ρ˜Ρƒ Π·Π°ΡΡ‚ΠΎΡ˜Π° (ΠΏΡ€ΠΈΠ±Π». Ρ‚Ρ€Π°ΠΊΠ°: Π΄Π°Ρ™Π΅ - Π½ΡƒΠ»Π° Π·Π°ΡΡ‚ΠΎΡ˜Π°). Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π°ΡˆΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ˜Π° Π±ΠΈΡ›Π΅ Π΄Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ Π½Π°Π·Π°Π΄ Π½Π΅ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½Ρƒ ΠΏΡ€ΠΎΠΌΠ΅Π½Ρƒ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π½Π° Π½Π°Ρ‡ΠΈΠ½ ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π°Π½ са ΡƒΠ½Π°Π·Π°Π΄.

Ако ΠΆΠ΅Π»ΠΈΡ‚Π΅ Π΄Π° Ρ€Π°Π·ΡƒΠΌΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ΄Π° ΠΈΠ· Ρ‡Π»Π°Π½ΠΊΠ°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡ… ΠΏΡ€ΠΎΠ½Π°Ρ›ΠΈ Π½Π° Π“ΠΈΡ‚Π₯ΡƒΠ±.

Π£Π²ΠΎΠ΄

ΠŸΡ€ΠΈΠΌΠ΅Π½Π° Π±Π΅Π· Π·Π°ΡΡ‚ΠΎΡ˜Π°

Каква мистика Π½ΡƒΠ»Π° Π·Π°ΡΡ‚ΠΎΡ˜Π° Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈ? ΠœΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π΅Ρ›ΠΈ Π΄Π° јС Ρ‚ΠΎ ΠΊΠ°Π΄Π° јС ваша Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° распорСђСна Π½Π° Π½Π°Ρ‡ΠΈΠ½ Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ увСсти Π½ΠΎΠ²Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ Ρƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΡšΡƒ, Π° Π΄Π° корисник Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ΠΈ ΡšΠ΅Π½Ρƒ нСдоступност. Из пСрспСктивС корисника ΠΈ компанијС, ΠΎΠ²ΠΎ јС Π½Π°Ρ˜Π±ΠΎΡ™ΠΈ ΠΌΠΎΠ³ΡƒΡ›ΠΈ сцСнарио ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅ Ρ˜Π΅Ρ€ ΠΎΠΌΠΎΠ³ΡƒΡ›Π°Π²Π° ΡƒΠ²ΠΎΡ’Π΅ΡšΠ΅ Π½ΠΎΠ²ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° ΠΈ ΠΈΡΠΏΡ€Π°Π²Ρ™Π°ΡšΠ΅ Π³Ρ€Π΅ΡˆΠ°ΠΊΠ° Π±Π΅Π· ΠΎΠΌΠ΅Ρ‚Π°ΡšΠ°.

Како Ρ‚ΠΎ постићи? ΠŸΠΎΡΡ‚ΠΎΡ˜ΠΈ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ Π½Π°Ρ‡ΠΈΠ½Π°, Π΅Π²ΠΎ јСдног ΠΎΠ΄ ΡšΠΈΡ…:

  • ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ Π±Ρ€. 1 својС услугС
  • ΠΈΠ·Π²Ρ€ΡˆΠΈ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Ρƒ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°
  • ΠŸΠΎΡΡ‚Π°Π²ΠΈΡ‚Π΅ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ #2 својС услугС ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ са Π²Π΅Ρ€Π·ΠΈΡ˜ΠΎΠΌ #1
  • Ρ‡ΠΈΠΌ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π΄Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π±Ρ€.2 Ρ€Π°Π΄ΠΈ ΠΊΠ°ΠΊΠΎ Ρ‚Ρ€Π΅Π±Π°, ΡƒΠΊΠ»ΠΎΠ½ΠΈΡ‚Π΅ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ Π±Ρ€.1
  • Π³ΠΎΡ‚ΠΎΠ²!

Π›Π°ΠΊΠΎ, Π·Π°Ρ€ Π½Π΅? НаТалост, Ρ‚ΠΎ нијС Ρ‚Π°ΠΊΠΎ Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΎ, Π° каснијС Ρ›Π΅ΠΌΠΎ Ρ‚ΠΎ Π΄Π΅Ρ‚Π°Ρ™Π½ΠΈΡ˜Π΅ ΠΏΠΎΠ³Π»Π΅Π΄Π°Ρ‚ΠΈ. Π‘Π°Π΄Π° Ρ…Π°Ρ˜Π΄Π΅ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌΠΎ још јСдан ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ ΡƒΠΎΠ±ΠΈΡ‡Π°Ρ˜Π΅Π½ процСс ΠΏΠΎΡΡ‚Π°Π²Ρ™Π°ΡšΠ° - ΠΏΠ»Π°Π²ΠΎ Π·Π΅Π»Π΅Π½ΠΎ Ρ€Π°ΡΠΏΠΎΡ€Π΅Ρ’ΠΈΠ²Π°ΡšΠ΅.

ΠˆΠ΅ΡΡ‚Π΅ Π»ΠΈ ΠΈΠΊΠ°Π΄Π° Ρ‡ΡƒΠ»ΠΈ Π·Π° ΠΏΠ»Π°Π²ΠΎ Π·Π΅Π»Π΅Π½ΠΎ Ρ€Π°ΡΠΏΠΎΡ€Π΅Ρ’ΠΈΠ²Π°ΡšΠ΅? Π¦Π»ΠΎΡƒΠ΄ Π€ΠΎΡƒΠ½Π΄Ρ€ΠΈ ΠΎΠ²ΠΎ Ρ‡ΠΈΠ½ΠΈ ΠΈΠ·ΡƒΠ·Π΅Ρ‚Π½ΠΎ Π»Π°ΠΊΠΈΠΌ. Π‘Π°ΠΌΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π°Ρ˜Ρ‚Π΅ овај Ρ‡Π»Π°Π½Π°ΠΊ, Π³Π΄Π΅ ΠΎΠ²ΠΎ Π΄Π΅Ρ‚Π°Ρ™Π½ΠΈΡ˜Π΅ ΠΎΠΏΠΈΡΡƒΡ˜Π΅ΠΌΠΎ. Π”Π° ΡƒΠΊΡ€Π°Ρ‚ΠΊΠΎ Ρ€Π΅Π·ΠΈΠΌΠΈΡ€Π°ΠΌΠΎ, подсСтимо вас ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΠ»Π°Π²ΠΎ Π·Π΅Π»Π΅Π½ΠΎ:

  • ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈΡ‚Π΅ Π΄Π° Π΄Π²Π΅ копијС вашСг ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ ΠΊΠΎΠ΄Π° (β€žΠΏΠ»Π°Π²Π°β€œ ΠΈ β€žΠ·Π΅Π»Π΅Π½Π°β€œ) Ρ€Π°Π΄Π΅;
  • сав ΡΠ°ΠΎΠ±Ρ€Π°Ρ›Π°Ρ˜ усмСрити Π½Π° ΠΏΠ»Π°Π²ΠΎ ΠΎΠΊΡ€ΡƒΠΆΠ΅ΡšΠ΅, Ρ‚Ρ˜. Ρ‚Π°ΠΊΠΎ Π΄Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Π΅ Π£Π Π› адрСсС ΡƒΠΏΡƒΡ›ΡƒΡ˜Ρƒ Ρ‚Π°ΠΌΠΎ;
  • ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΠΈ ΠΈ тСстирати свС ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Ρƒ Π·Π΅Π»Π΅Π½ΠΎΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅ΡšΡƒ;
  • ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π£Π Π› ΠΈΠ· ΠΏΠ»Π°Π²ΠΎΠ³ Ρƒ Π·Π΅Π»Π΅Π½ΠΎ ΠΎΠΊΡ€ΡƒΠΆΠ΅ΡšΠ΅

Плаво Π·Π΅Π»Π΅Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π° јС приступ који Π²Π°ΠΌ ΠΎΠΌΠΎΠ³ΡƒΡ›Π°Π²Π° Π΄Π° Π»Π°ΠΊΠΎ ΡƒΠ²Π΅Π΄Π΅Ρ‚Π΅ Π½ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π΅ Π±Π΅Π· Π±Ρ€ΠΈΠ³Π΅ ΠΎ ΠΏΡ€Π΅ΠΊΠΈΠ΄Ρƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΡšΠ΅. Π’ΠΎ јС Π·Π±ΠΎΠ³ Ρ‡ΠΈΡšΠ΅Π½ΠΈΡ†Π΅ Π΄Π° Ρ‡Π°ΠΊ ΠΈ Π°ΠΊΠΎ сС Π½Π΅ΡˆΡ‚ΠΎ Π΄ΠΎΠ³ΠΎΠ΄ΠΈ, Π»Π°ΠΊΠΎ сС ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ€Π°Ρ‚ΠΈΡ‚ΠΈ Π½Π° ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ ΠΎΠΊΡ€ΡƒΠΆΠ΅ΡšΠ΅ Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΈΠΌ β€žΠΏΡ€Π΅Π±Π°Ρ†ΠΈΠ²Π°ΡšΠ΅ΠΌ ΠΏΡ€Π΅ΠΊΠΈΠ΄Π°Ρ‡Π°β€œ.

Након ΡˆΡ‚ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚Π΅ свС Π³ΠΎΡ€Π΅ Π½Π°Π²Π΅Π΄Π΅Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ поставити ΠΏΠΈΡ‚Π°ΡšΠ΅: КаквС Π²Π΅Π·Π΅ Π½ΡƒΠ»Ρ‚ΠΈ Π·Π°ΡΡ‚ΠΎΡ˜ ΠΈΠΌΠ° са ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΎΠΌ ΠΏΠ»Π°Π²ΠΎ Π·Π΅Π»Π΅Π½Π΅ бојС?

Па, ΠΈΠΌΠ°Ρ˜Ρƒ доста Ρ‚ΠΎΠ³Π° Π·Π°Ρ˜Π΅Π΄Π½ΠΈΡ‡ΠΊΠΎΠ³, ΠΏΠΎΡˆΡ‚ΠΎ ΠΎΠ΄Ρ€ΠΆΠ°Π²Π°ΡšΠ΅ Π΄Π²Π΅ копијС истог ΠΎΠΊΡ€ΡƒΠΆΠ΅ΡšΠ° Π·Π°Ρ…Ρ‚Π΅Π²Π° двоструки Π½Π°ΠΏΠΎΡ€ Π΄Π° сС ΠΎΠ½Π΅ ΠΎΠ΄Ρ€ΠΆΠ΅. Π—Π±ΠΎΠ³ Ρ‚ΠΎΠ³Π° Π½Π΅ΠΊΠΈ Ρ‚ΠΈΠΌΠΎΠ²ΠΈ Ρ‚Π²Ρ€Π΄Π΅ ΠœΠ°Ρ€Ρ‚ΠΈΠ½ Π€ΠΎΠ²Π»Π΅Ρ€, ΠΏΡ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π°Ρ€ΠΈΡ˜Π°Ρ†ΠΈΡ˜Ρƒ ΠΎΠ²ΠΎΠ³ приступа:

Π”Ρ€ΡƒΠ³Π° ΠΎΠΏΡ†ΠΈΡ˜Π° јС Π΄Π° користитС исту Π±Π°Π·Ρƒ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°, ΠΊΡ€Π΅ΠΈΡ€Π°Ρ˜ΡƒΡ›ΠΈ ΠΏΠ»Π°Π²ΠΎ-Π·Π΅Π»Π΅Π½Π΅ ΠΏΡ€Π΅ΠΊΠΈΠ΄Π°Ρ‡Π΅ Π·Π° Π²Π΅Π± ΠΈ слојСвС Π΄ΠΎΠΌΠ΅Π½Π°. Π£ ΠΎΠ²ΠΎΠΌ приступу Π±Π°Π·Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° чСсто ΠΌΠΎΠΆΠ΅ прСдстављати ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, посСбно ΠΊΠ°Π΄Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΡšΠ΅Π½Ρƒ ΡˆΠ΅ΠΌΡƒ Π΄Π° бистС ΠΏΠΎΠ΄Ρ€ΠΆΠ°Π»ΠΈ Π½ΠΎΠ²Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ софтвСра.

И ΠΎΠ²Π΄Π΅ Π΄ΠΎΠ»Π°Π·ΠΈΠΌΠΎ Π΄ΠΎ Π³Π»Π°Π²Π½ΠΎΠ³ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρƒ ΠΎΠ²ΠΎΠΌ Ρ‡Π»Π°Π½ΠΊΡƒ. Π‘Π°Π·Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°. Π₯ајдС Π΄Π° још јСдном ΠΏΠΎΠ³Π»Π΅Π΄Π°ΠΌΠΎ ΠΎΠ²Ρƒ Ρ„Ρ€Π°Π·Ρƒ.

ΠΈΠ·Π²Ρ€ΡˆΠΈ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Ρƒ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°.

Π‘Π°Π΄Π° ΠΌΠΎΡ€Π°Ρ‚Π΅ Π΄Π° сС Π·Π°ΠΏΠΈΡ‚Π°Ρ‚Π΅ – ΡˆΡ‚Π° Π°ΠΊΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π° Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° нијС ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½Π° ΡƒΠ½Π°Ρ‚Ρ€Π°Π³? Π—Π°Ρ€ сС моја ΠΏΡ€Π²Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ Π½Π΅Ρ›Π΅ ΠΏΠΎΠΊΠ²Π°Ρ€ΠΈΡ‚ΠΈ? Π£ ствари, ΡƒΠΏΡ€Π°Π²ΠΎ Ρ‚ΠΎ Ρ›Π΅ сС Π΄ΠΎΠ³ΠΎΠ΄ΠΈΡ‚ΠΈ...

Π”Π°ΠΊΠ»Π΅, Ρ‡Π°ΠΊ ΠΈ упркос ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΈΠΌ прСдностима Π½ΡƒΠ»Ρ‚Π΅ Π·Π°ΡΡ‚ΠΎΡ˜Π΅ / ΠΏΠ»Π°Π²ΠΎ Π·Π΅Π»Π΅Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅, компанијС ΠΈΠΌΠ°Ρ˜Ρƒ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΡ˜Ρƒ Π΄Π° слСдС слСдСћи ΡΠΈΠ³ΡƒΡ€Π½ΠΈΡ˜ΠΈ процСс Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ ΡΠ²ΠΎΡ˜ΠΈΡ… Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°:

  • ΠΏΡ€ΠΈΠΏΡ€Π΅ΠΌΠΈΡ‚Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ са Π½ΠΎΠ²ΠΎΠΌ Π²Π΅Ρ€Π·ΠΈΡ˜ΠΎΠΌ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅
  • искључитС ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΡ‚Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ
  • ΠΏΠΎΠΊΡ€Π΅Π½ΠΈΡ‚Π΅ скриптС Π·Π° ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Ρƒ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°
  • ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΠΈ ΠΈ ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΡ‚ΠΈ Π½ΠΎΠ²Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅

Π£ ΠΎΠ²ΠΎΠΌ Ρ‡Π»Π°Π½ΠΊΡƒ Ρ›Π΅ΠΌΠΎ Π΄Π΅Ρ‚Π°Ρ™Π½ΠΎ описати ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Ρ€Π°Π΄ΠΈΡ‚Π΅ са својом Π±Π°Π·ΠΎΠΌ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° ΠΈ ΠΊΠΎΠ΄ΠΎΠΌ Π΄Π° бистС искористили прСдности ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅ Π±Π΅Π· Π·Π°ΡΡ‚ΠΎΡ˜Π°.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ са Π±Π°Π·ΠΎΠΌ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°

Ако ΠΈΠΌΠ°Ρ‚Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ Π±Π΅Π· ΡΡ‚Π°ΡšΠ° која Π½Π΅ ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚ΠΈ Π½ΠΈΠΊΠ°ΠΊΠ²Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ Ρƒ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°, ΠΎΠ΄ΠΌΠ°Ρ… ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±ΠΈΡ‚ΠΈ Π½ΡƒΠ»Ρ‚Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Π½Ρƒ Π·Π°ΡΡ‚ΠΎΡ˜Π°. НаТалост, Π²Π΅Ρ›ΠΈΠ½Π° софтвСра ΠΌΠΎΡ€Π° Π½Π΅Π³Π΄Π΅ Π΄Π° ΡƒΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅. Π—Π±ΠΎΠ³ Ρ‚ΠΎΠ³Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π²Π°ΠΏΡƒΡ‚ размислити ΠΏΡ€Π΅ Π½Π΅Π³ΠΎ ΡˆΡ‚ΠΎ унСсСтС Π±ΠΈΠ»ΠΎ ΠΊΠ°ΠΊΠ²Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅ Ρƒ ΠΊΠΎΠ»ΠΎ. ΠŸΡ€Π΅ Π½Π΅Π³ΠΎ ΡˆΡ‚ΠΎ ΡƒΡ’Π΅ΠΌΠΎ Ρƒ Π΄Π΅Ρ‚Π°Ρ™Π΅ ΠΎ Ρ‚ΠΎΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΌΠΎ ΡˆΠ΅ΠΌΡƒ Ρ‚Π°ΠΊΠΎ Π΄Π° јС ΠΌΠΎΠ³ΡƒΡ›Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π° Π±Π΅Π· Π·Π°ΡΡ‚ΠΎΡ˜Π°, Ρ…Π°Ρ˜Π΄Π΅ Π΄Π° сС ΠΏΡ€Π²ΠΎ фокусирамо Π½Π° ΡˆΠ΅ΠΌΡƒ Π²Π΅Ρ€Π·ΠΈΠΎΠ½ΠΈΡΠ°ΡšΠ°.

Π¨Π΅ΠΌΠ° Π²Π΅Ρ€Π·ΠΈΡ˜Π°

Π£ ΠΎΠ²ΠΎΠΌ Ρ‡Π»Π°Π½ΠΊΡƒ Ρ›Π΅ΠΌΠΎ користити Π€Π»ΠΈΠ²Π°ΠΈ ΠΊΠ°ΠΎ Π°Π»Π°Ρ‚ Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Π° (ΠΏΡ€ΠΈΠ±Π». ΠŸΡ€Π΅Π²ΠΎΠ΄: Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌΠΎ ΠΎ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Π°ΠΌΠ° Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°). Наравно, Ρ‚Π°ΠΊΠΎΡ’Π΅ Ρ›Π΅ΠΌΠΎ написати Π‘ΠΏΡ€ΠΈΠ½Π³ Π‘ΠΎΠΎΡ‚ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ која ΠΈΠΌΠ° ΡƒΠ³Ρ€Π°Ρ’Π΅Π½Ρƒ ΠΏΠΎΠ΄Ρ€ΡˆΠΊΡƒ Π·Π° Π€Π»ΠΈΠ²Π°ΠΈ ΠΈ која Ρ›Π΅ Π²Ρ€ΡˆΠΈΡ‚ΠΈ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Ρƒ шСмС Ρ‚ΠΎΠΊΠΎΠΌ подСшавања контСкста Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅. Када користитС Π€Π»ΠΈΠ²Π°ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚ΠΈΡ‚Π΅ скриптС Π·Π° ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Ρƒ Ρƒ фасциклу са ΠΏΡ€ΠΎΡ˜Π΅ΠΊΡ‚ΠΈΠΌΠ° (ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π½ΠΎ Ρƒ classpath:db/migration). ОвдС ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠ²ΠΈΡ… Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Ρƒ

└── db
 └── migration
     β”œβ”€β”€ V1__init.sql
     β”œβ”€β”€ V2__Add_surname.sql
     β”œβ”€β”€ V3__Final_migration.sql
     └── V4__Remove_lastname.sql

Π£ ΠΎΠ²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Π²ΠΈΠ΄ΠΈΠΌΠΎ 4 скриптС Π·Π° ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Ρƒ којС Ρ›Π΅ сС, Π°ΠΊΠΎ сС ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ Π½Π΅ ΠΈΠ·Π²Ρ€ΡˆΠ΅, ΠΈΠ·Π²Ρ€ΡˆΠ°Π²Π°Ρ‚ΠΈ јСдна Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΊΠ°Π΄Π° сС Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ΠΏΠΎΠΊΡ€Π΅Π½Π΅. Π₯ајдС Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π°ΠΌΠΎ јСдан ΠΎΠ΄ Ρ„Π°Ρ˜Π»ΠΎΠ²Π° (V1__init.sql) ΠΊΠ°ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

Π‘Π²Π΅ јС ΡΠ°Π²Ρ€ΡˆΠ΅Π½ΠΎ само ΠΏΠΎ сСби Ρ€Π°Π·ΡƒΠΌΡ™ΠΈΠ²ΠΎ: ΠΌΠΎΠΆΠ΅Ρ‚Π΅ користити Π‘ΠšΠ› Π΄Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠ°ΠΊΠΎ ваша Π±Π°Π·Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π±ΡƒΠ΄Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠΎΠ²Π°Π½Π°. Π—Π° вишС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ˜Π° ΠΎ Π‘ΠΏΡ€ΠΈΠ½Π³ Π‘ΠΎΠΎΡ‚-Ρƒ ΠΈ Π€Π»ΠΈΠ²Π°ΠΈ-Ρƒ, ΠΏΠΎΠ³Π»Π΅Π΄Π°Ρ˜Ρ‚Π΅ Π‘ΠΏΡ€ΠΈΠ½Π³ Π‘ΠΎΠΎΡ‚ Доцс.

ΠšΠΎΡ€ΠΈΡˆΡ›Π΅ΡšΠ΅ΠΌ Π°Π»Π°Ρ‚Π° Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Ρƒ ΠΈΠ·Π²ΠΎΡ€Π° са Π‘ΠΏΡ€ΠΈΠ½Π³ Π‘ΠΎΠΎΡ‚-ΠΎΠΌ, Π΄ΠΎΠ±ΠΈΡ˜Π°Ρ‚Π΅ 2 Π²Π΅Π»ΠΈΠΊΠ΅ прСдности:

  • ΠΎΠ΄Π²Π°Ρ˜Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° ΠΎΠ΄ ΠΏΡ€ΠΎΠΌΠ΅Π½Π° ΠΊΠΎΠ΄Π°
  • ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Π° Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° сС дСшава зајСдно са ΡƒΠ²ΠΎΡ’Π΅ΡšΠ΅ΠΌ вашС Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅, Ρ‚Ρ˜. ваш процСс ΠΏΠΎΡΡ‚Π°Π²Ρ™Π°ΡšΠ° јС ΠΏΠΎΡ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Ρ™Π΅Π½

РСшавањС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° са Π±Π°Π·ΠΎΠΌ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°

Π£ слСдСћСм ΠΎΠ΄Π΅Ρ™ΠΊΡƒ Ρ‡Π»Π°Π½ΠΊΠ°, фокусираћСмо сС Π½Π° Ρ€Π°Π·ΠΌΠ°Ρ‚Ρ€Π°ΡšΠ΅ Π΄Π²Π° приступа ΠΏΡ€ΠΎΠΌΠ΅Π½Π°ΠΌΠ° Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°.

  • Π½Π°Π·Π°Π΄Π½Π° нСкомпатибилност
  • ΠšΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½ΠΎΡΡ‚

ΠŸΡ€Π²ΠΈ Ρ›Π΅ сС сматрати ΡƒΠΏΠΎΠ·ΠΎΡ€Π΅ΡšΠ΅ΠΌ Π΄Π° Π½Π΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π²Ρ€ΡˆΠΈΡ‚Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ Π½ΡƒΠ»Ρ‚ΠΎΠ³ Π·Π°ΡΡ‚ΠΎΡ˜Π° Π±Π΅Π· ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½Π΅ ΠΏΡ€ΠΈΠΏΡ€Π΅ΠΌΠ΅... Π”Ρ€ΡƒΠ³ΠΈ Π½ΡƒΠ΄ΠΈ Ρ€Π΅ΡˆΠ΅ΡšΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΠΈΡ‚Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ Π±Π΅Π· Π·Π°ΡΡ‚ΠΎΡ˜Π°, Π° Π΄Π° истоврСмСно ΠΎΠ΄Ρ€ΠΆΠΈΡ‚Π΅ компатибилност ΡƒΠ½Π°Π·Π°Π΄.

Наш ΠΏΡ€ΠΎΡ˜Π΅ΠΊΠ°Ρ‚ Π½Π° којСм Ρ›Π΅ΠΌΠΎ Ρ€Π°Π΄ΠΈΡ‚ΠΈ Π±ΠΈΡ›Π΅ Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½Π° Π‘ΠΏΡ€ΠΈΠ½Π³ Π‘ΠΎΠΎΡ‚ Π€Π»ΠΈΠ²Π°ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° која ΠΈΠΌΠ° Person с first_name ΠΈ last_name Ρƒ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° (ΠΏΡ€ΠΈΠ±Π». ΠΏΡ€Π΅Π²ΠΎΠ΄: Person јС Ρ‚Π°Π±Π΅Π»Π° ΠΈ Ρ„irst_name ΠΈ last_name - ΠΎΠ²ΠΎ су ΠΏΠΎΡ™Π° Ρƒ ΡšΠ΅ΠΌΡƒ). Π–Π΅Π»ΠΈΠΌΠΎ Π΄Π° ΠΏΡ€Π΅ΠΈΠΌΠ΅Π½ΡƒΡ˜Π΅ΠΌΠΎ last_name Π² surname.

ΠŸΡ€Π΅Ρ‚ΠΏΠΎΡΡ‚Π°Π²ΠΊΠ΅

ΠŸΡ€Π΅ Π½Π΅Π³ΠΎ ΡˆΡ‚ΠΎ ΡƒΡ’Π΅ΠΌΠΎ Ρƒ Π΄Π΅Ρ‚Π°Ρ™Π΅, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ јС Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠΎ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ прСтпоставки ΠΎ нашим Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°ΠΌΠ°. Π“Π»Π°Π²Π½ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ који ΠΆΠ΅Π»ΠΈΠΌΠΎ Π΄Π° постигнСмо Π±ΠΈΡ›Π΅ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π°Π½ процСс.

Π‘Π΅Π»Π΅ΡˆΠΊΠ°. Пословни ПРО-ВИП. ΠŸΠΎΡ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Ρ™ΠΈΠ²Π°ΡšΠ΅ Π²Π°ΡˆΠΈΡ… процСса ΠΌΠΎΠΆΠ΅ Π²Π°ΠΌ ΡƒΡˆΡ‚Π΅Π΄Π΅Ρ‚ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²Ρ†Π° Π½Π° ΠΏΠΎΠ΄Ρ€ΡˆΡ†ΠΈ (ΡˆΡ‚ΠΎ вишС Ρ™ΡƒΠ΄ΠΈ Ρ€Π°Π΄ΠΈΡ‚Π΅ Π·Π° Π²Π°ΡˆΡƒ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ˜Ρƒ, вишС Π½ΠΎΠ²Ρ†Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡˆΡ‚Π΅Π΄Π΅Ρ‚ΠΈ)!

НСма ΠΏΠΎΡ‚Ρ€Π΅Π±Π΅ Π·Π° Π²Ρ€Π°Ρ›Π°ΡšΠ΅ΠΌ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°

Ово ΠΏΠΎΡ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Ρ™ΡƒΡ˜Π΅ процСс ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π΅ (Π½Π΅ΠΊΠ° Π²Ρ€Π°Ρ›Π°ΡšΠ° Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° су скоро Π½Π΅ΠΌΠΎΠ³ΡƒΡ›Π°, ΠΊΠ°ΠΎ ΡˆΡ‚ΠΎ јС Π²Ρ€Π°Ρ›Π°ΡšΠ΅ Π±Ρ€ΠΈΡΠ°ΡšΠ°). РадијС Π²Ρ€Π°Ρ›Π°ΠΌΠΎ само Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅. На овај Π½Π°Ρ‡ΠΈΠ½, Ρ‡Π°ΠΊ ΠΈ Π°ΠΊΠΎ ΠΈΠΌΠ°Ρ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚Π΅ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π‘ΠšΠ› ΠΈ ΠΠΎΠ‘ΠšΠ›), ваш Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ Π·Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Ρƒ Ρ›Π΅ ΠΈΠ·Π³Π»Π΅Π΄Π°Ρ‚ΠΈ исто.

Π£Π²Π΅ΠΊ ΠΌΠΎΡ€Π° Π±ΠΈΡ‚ΠΈ ΠΌΠΎΠ³ΡƒΡ›Π΅ Π²Ρ€Π°Ρ‚ΠΈΡ‚ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ Π·Π° Ρ˜Π΅Π΄Π½Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ ΡƒΠ½Π°Π·Π°Π΄ (Π½Π΅ вишС)

Π’Ρ€Π°Ρ›Π°ΡšΠ΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС Π²Ρ€ΡˆΠΈ само ΠΊΠ°Π΄Π° јС Ρ‚ΠΎ Π½Π΅ΠΎΠΏΡ…ΠΎΠ΄Π½ΠΎ. Ако ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ Π³Ρ€Π΅ΡˆΠΊΠ° Ρƒ Ρ‚Ρ€Π΅Π½ΡƒΡ‚Π½ΠΎΡ˜ Π²Π΅Ρ€Π·ΠΈΡ˜ΠΈ ΠΊΠΎΡ˜Ρƒ нијС Π»Π°ΠΊΠΎ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚ΠΈ, Ρ‚Ρ€Π΅Π±Π°Π»ΠΎ Π±ΠΈ Π΄Π° Π±ΡƒΠ΄Π΅ΠΌΠΎ Ρƒ могућности Π΄Π° сС Π²Ρ€Π°Ρ‚ΠΈΠΌΠΎ Π½Π° Π½Π°Ρ˜Π½ΠΎΠ²ΠΈΡ˜Ρƒ Ρ€Π°Π΄Π½Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ. ΠŸΡ€Π΅Ρ‚ΠΏΠΎΡΡ‚Π°Π²Ρ™Π°ΠΌΠΎ Π΄Π° јС ΠΎΠ²Π° најновија Ρ€Π°Π΄Π½Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½Π°. ΠžΠ΄Ρ€ΠΆΠ°Π²Π°ΡšΠ΅ компатибилности ΠΊΠΎΠ΄Π° ΠΈ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π·Π° вишС ΠΎΠ΄ јСдног ΠΏΠΎΠΊΡ€Π΅Ρ‚Π°ΡšΠ° Π±ΠΈΠ»ΠΎ Π±ΠΈ ΠΈΠ·ΡƒΠ·Π΅Ρ‚Π½ΠΎ Ρ‚Π΅ΡˆΠΊΠΎ ΠΈ скупо.

Π‘Π΅Π»Π΅ΡˆΠΊΠ°. Π Π°Π΄ΠΈ Π²Π΅Ρ›Π΅ читљивости, Ρƒ ΠΎΠ²ΠΎΠΌ Ρ‡Π»Π°Π½ΠΊΡƒ Ρ›Π΅ΠΌΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚ΠΈ Π³Π»Π°Π²Π½Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅.

ΠšΠΎΡ€Π°ΠΊ 1: ΠŸΠΎΡ‡Π΅Ρ‚Π½ΠΎ ΡΡ‚Π°ΡšΠ΅

Π’Π΅Ρ€Π·ΠΈΡ˜Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅: 1.0.0
Π”Π‘ Π²Π΅Ρ€Π·ΠΈΡ˜Π°: v1

ΠšΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€

Ово Ρ›Π΅ Π±ΠΈΡ‚ΠΈ ΠΏΠΎΡ‡Π΅Ρ‚Π½ΠΎ ΡΡ‚Π°ΡšΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅.

ΠŸΡ€ΠΎΠΌΠ΅Π½Π΅ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°

Π”Π‘ садрТи last_name.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

ΠŸΡ€ΠΎΠΌΠ΅Π½Π΅ ΠΊΠΎΠ΄Π°

ΠΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Ρ‡ΡƒΠ²Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ ΠΎ личности Ρƒ last_name:

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastname) {
        this.lastName = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName
                + "]";
    }
}

ΠŸΡ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°ΡšΠ΅ ΠΊΠΎΠ»ΠΎΠ½Π΅ Π½Π΅ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½ΠΎ ΡƒΠ½Π°Π·Π°Π΄

ПоглСдајмо ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°ΠΊΠΎ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΈΠΌΠ΅ ΠΊΠΎΠ»ΠΎΠ½Π΅:

ПаТња. Π‘Π»Π΅Π΄Π΅Ρ›ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ›Π΅ Π½Π°ΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°Π·Π±ΠΈΡ‚ΠΈ ствари. Ово ΠΏΠΎΠΊΠ°Π·ΡƒΡ˜Π΅ΠΌΠΎ Π΄Π° бисмо дСмонстрирали ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ компатибилности Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°.

Π’Π΅Ρ€Π·ΠΈΡ˜Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅: 2.0.0.BAD

Π”Π‘ Π²Π΅Ρ€Π·ΠΈΡ˜Π°: v2bad

ΠšΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€

Π’Ρ€Π΅Π½ΡƒΡ‚Π½Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅ Π½Π°ΠΌ НЕ Π΄ΠΎΠ·Π²ΠΎΡ™Π°Π²Π°Ρ˜Ρƒ Π΄Π° истоврСмСно ΠΏΠΎΠΊΡ€Π΅Ρ›Π΅ΠΌΠΎ Π΄Π²Π΅ инстанцС (старС ΠΈ Π½ΠΎΠ²Π΅). Π‘Ρ‚ΠΎΠ³Π° Ρ›Π΅ Π±ΠΈΡ‚ΠΈ Ρ‚Π΅ΡˆΠΊΠΎ постићи Π½ΡƒΠ»Ρ‚Ρƒ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ Π·Π°ΡΡ‚ΠΎΡ˜Π° (Π°ΠΊΠΎ сС ΡƒΠ·ΠΌΡƒ Ρƒ ΠΎΠ±Π·ΠΈΡ€ прСтпоставкС, Ρ‚ΠΎ јС Π·Π°ΠΏΡ€Π°Π²ΠΎ Π½Π΅ΠΌΠΎΠ³ΡƒΡ›Π΅).

А/Π‘ Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅

Π’Ρ€Π΅Π½ΡƒΡ‚Π½Π° ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡ˜Π° јС Π΄Π° ΠΈΠΌΠ°ΠΌΠΎ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ 1.0.0, распорСђСни Ρƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΡšΠΈ ΠΈ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° v1. ΠœΠΎΡ€Π°ΠΌΠΎ Π΄Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ Π΄Ρ€ΡƒΠ³Ρƒ инстанцу Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅, Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ 2.0.0.BAD, ΠΈ Π°ΠΆΡƒΡ€ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π±Π°Π·Ρƒ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π½Π° v2bad.

ΠšΠΎΡ€Π°Ρ†ΠΈ:

  1. ΠΏΡ€ΠΈΠΌΠ΅ΡšΡƒΡ˜Π΅ сС Π½ΠΎΠ²Π° инстанца Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ 2.0.0.BADкоји Π°ΠΆΡƒΡ€ΠΈΡ€Π° Π±Π°Π·Ρƒ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π½Π° v2bad
  2. Ρƒ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° v2bad ΠΊΠΎΠ»ΠΎΠ½Π° last_name вишС Π½Π΅ ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ – ΠΏΡ€ΠΎΠΌΠ΅ΡšΠ΅Π½ΠΎ јС Ρƒ surname
  3. ΠΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ јС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈ Π½Π΅ΠΊΠ΅ инстанцС су ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΡ‚Π΅ 1.0.0, Π΄Ρ€ΡƒΠ³ΠΈ - Ρƒ 2.0.0.BAD. Π‘Π²Π΅ јС ΠΏΠΎΠ²Π΅Π·Π°Π½ΠΎ са Π±Π°Π·ΠΎΠΌ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° v2bad
  4. свС инстанцС Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ 1.0.0 Ρ›Π΅ ΠΏΠΎΡ‡Π΅Ρ‚ΠΈ Π΄Π° Π±Π°Ρ†Π° Π³Ρ€Π΅ΡˆΠΊΠ΅ Ρ˜Π΅Ρ€ Ρ›Π΅ ΠΏΠΎΠΊΡƒΡˆΠ°Ρ‚ΠΈ Π΄Π° ΡƒΠ±Π°Ρ†Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ Ρƒ ΠΊΠΎΠ»ΠΎΠ½Ρƒ last_nameкоји вишС Π½Π΅ ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ
  5. свС инстанцС Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ 2.0.0.BAD Ρ€Π°Π΄ΠΈΡ›Π΅ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

Као ΡˆΡ‚ΠΎ Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π°ΠΊΠΎ ΠΈΠ·Π²Ρ€ΡˆΠΈΠΌΠΎ ΡƒΠ½Π°Π·Π°Π΄ Π½Π΅ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅ Ρƒ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜ΠΈ, А/Π‘ Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅ јС Π½Π΅ΠΌΠΎΠ³ΡƒΡ›Π΅.

Π’Ρ€Π°Ρ›Π°ΡšΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅

ΠŸΡ€Π΅Ρ‚ΠΏΠΎΡΡ‚Π°Π²ΠΈΠΌΠΎ Π΄Π° Π½Π°ΠΊΠΎΠ½ ΠΏΠΎΠΊΡƒΡˆΠ°Ρ˜Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π΅ А/Π‘ (ΠΏΡ€ΠΈΠ±Π». ΠΏΠ΅Ρ€.: Π°ΡƒΡ‚ΠΎΡ€ јС ΠΎΠ²Π΄Π΅ Π²Π΅Ρ€ΠΎΠ²Π°Ρ‚Π½ΠΎ мислио Π½Π° А/Π‘ Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅) ΠΎΠ΄Π»ΡƒΡ‡ΠΈΠ»ΠΈ смо Π΄Π° ΠΌΠΎΡ€Π°ΠΌΠΎ Π΄Π° Π²Ρ€Π°Ρ‚ΠΈΠΌΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ Π½Π° Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ 1.0.0. Π Π΅Ρ†ΠΈΠΌΠΎ Π΄Π° Π½Π΅ ΠΆΠ΅Π»ΠΈΠΌΠΎ Π΄Π° Π²Ρ€Π°Ρ‚ΠΈΠΌΠΎ Π±Π°Π·Ρƒ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°.

ΠšΠΎΡ€Π°Ρ†ΠΈ:

  1. заустављамо Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ инстанцС 2.0.0.BAD
  2. Π±Π°Π·Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° јС још ΡƒΠ²Π΅ΠΊ v2bad
  3. ΠΎΠ΄ Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ 1.0.0 Π½Π΅ Ρ€Π°Π·ΡƒΠΌΠ΅ ΡˆΡ‚Π° јС Ρ‚ΠΎ surname, Π²ΠΈΠ΄Π΅Ρ›Π΅ΠΌΠΎ Π³Ρ€Π΅ΡˆΠΊΠ΅
  4. ΠΏΠ°ΠΊΠ°ΠΎ јС настао, Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠΎ вишС Π΄Π° сС Π²Ρ€Π°Ρ‚ΠΈΠΌΠΎ

Као ΡˆΡ‚ΠΎ Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π°ΠΊΠΎ ΠΈΠ·Π²Ρ€ΡˆΠΈΠΌΠΎ ΡƒΠ½Π°Π·Π°Π΄ Π½Π΅ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅ Ρƒ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜ΠΈ, Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° сС Π²Ρ€Π°Ρ‚ΠΈΠΌΠΎ Π½Π° ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ.

Π”Π½Π΅Π²Π½ΠΈΡ†ΠΈ ΠΈΠ·Π²Ρ€ΡˆΠ°Π²Π°ΡšΠ° скриптС

Backward incompatible scenario:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0.BAD
05) Wait for the app (2.0.0.BAD) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0 <-- this should fail
07) Generate a person by calling POST localhost:9992/person to version 2.0.0.BAD <-- this should pass

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"b73f639f-e176-4463-bf26-1135aace2f57","lastName":"b73f639f-e176-4463-bf26-1135aace2f57"}

Starting app in version 2.0.0.BAD
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

curl: (22) The requested URL returned error: 500 Internal Server Error

Generate a person in version 2.0.0.BAD
Sending a post to 127.0.0.1:9995/person. This is the response:

{"firstName":"e156be2e-06b6-4730-9c43-6e14cfcda125","surname":"e156be2e-06b6-4730-9c43-6e14cfcda125"}

ΠŸΡ€ΠΎΠΌΠ΅Π½Π΅ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°

Π‘ΠΊΡ€ΠΈΠΏΡ‚Π° Π·Π° ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Ρƒ која ΠΏΡ€Π΅ΠΈΠΌΠ΅Π½ΡƒΡ˜Π΅ last_name Π² surname

Π˜Π·Π²ΠΎΡ€ Π€Π»ΠΈΠ²Π°ΠΈ скрипта:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

Π‘ΠΊΡ€ΠΈΠΏΡ‚Π° која ΠΏΡ€Π΅ΠΈΠΌΠ΅Π½ΡƒΡ˜Π΅ last_name.

-- This change is backward incompatible - you can't do A/B testing
ALTER TABLE PERSON CHANGE last_name surname VARCHAR;

ΠŸΡ€ΠΎΠΌΠ΅Π½Π΅ ΠΊΠΎΠ΄Π°

ΠŸΡ€ΠΎΠΌΠ΅Π½ΠΈΠ»ΠΈ смо Π½Π°Π·ΠΈΠ² ΠΏΠΎΡ™Π° lastName Π½Π° surname.

ΠŸΡ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°ΡšΠ΅ ΠΊΠΎΠ»ΠΎΠ½Π΅ Π½Π° Π½Π°Ρ‡ΠΈΠ½ који јС ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π°Π½ ΡƒΠ½Π°Π·Π°Π΄

Ово јС Π½Π°Ρ˜Ρ‡Π΅ΡˆΡ›Π° ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡ˜Π° са којом сС ΠΌΠΎΠΆΠ΅ΠΌΠΎ сусрСсти. ΠœΠΎΡ€Π°ΠΌΠΎ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠΎ ΡƒΠ½Π°Π·Π°Π΄ Π½Π΅ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅. Π’Π΅Ρ› смо Π΄ΠΎΠΊΠ°Π·Π°Π»ΠΈ Π΄Π° Π·Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Ρƒ Π±Π΅Π· Π·Π°ΡΡ‚ΠΎΡ˜Π° Π½Π΅ Π±ΠΈ Ρ‚Ρ€Π΅Π±Π°Π»ΠΎ Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΎ Π΄Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Ρƒ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π±Π΅Π· Π΄ΠΎΠ΄Π°Ρ‚Π½ΠΈΡ… ΠΊΠΎΡ€Π°ΠΊΠ°. Π£ ΠΎΠ²ΠΎΠΌ ΠΎΠ΄Π΅Ρ™ΠΊΡƒ Ρ‡Π»Π°Π½ΠΊΠ°, ΠΈΠ·Π²Ρ€ΡˆΠΈΡ›Π΅ΠΌΠΎ 3 ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ зајСдно са ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Π°ΠΌΠ° Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π΄Π° бисмо постигли ΠΆΠ΅Ρ™Π΅Π½ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΡƒΠ· ΠΎΠ΄Ρ€ΠΆΠ°Π²Π°ΡšΠ΅ компатибилности ΡƒΠ½Π°Π·Π°Π΄.

Π‘Π΅Π»Π΅ΡˆΠΊΠ°. ΠŸΠΎΠ΄ΡΠ΅Ρ‚ΠΈΠΌΠΎ сС Π΄Π° ΠΈΠΌΠ°ΠΌΠΎ Π±Π°Π·Ρƒ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° ΠΎ Π²Π΅Ρ€Π·ΠΈΡ˜Π°ΠΌΠ° v1. Π‘Π°Π΄Ρ€ΠΆΠΈ ΠΊΠΎΠ»ΠΎΠ½Π΅ first_name ΠΈ last_name. ΠœΠΎΡ€Π°ΠΌΠΎ Π΄Π° сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΌΠΎ last_name Π½Π° surname. Имамо ΠΈ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ 1.0.0, који сС још Π½Π΅ користи surname.

ΠšΠΎΡ€Π°ΠΊ 2: Π”ΠΎΠ΄Π°Ρ˜Ρ‚Π΅ ΠΏΡ€Π΅Π·ΠΈΠΌΠ΅

Π’Π΅Ρ€Π·ΠΈΡ˜Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅: 2.0.0
Π”Π‘ Π²Π΅Ρ€Π·ΠΈΡ˜Π°: v2

ΠšΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€

Π”ΠΎΠ΄Π°Π²Π°ΡšΠ΅ΠΌ Π½ΠΎΠ²Π΅ ΠΊΠΎΠ»ΠΎΠ½Π΅ ΠΈ ΠΊΠΎΠΏΠΈΡ€Π°ΡšΠ΅ΠΌ њСног ΡΠ°Π΄Ρ€ΠΆΠ°Ρ˜Π°, ΠΊΡ€Π΅ΠΈΡ€Π°ΠΌΠΎ Π½Π°Π·Π°Π΄ ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°. Π£ исто Π²Ρ€Π΅ΠΌΠ΅, Π°ΠΊΠΎ Π²Ρ€Π°Ρ‚ΠΈΠΌΠΎ ЈАР ΠΈΠ»ΠΈ ΠΏΠΎΠΊΡ€Π΅Π½Π΅ΠΌΠΎ стари ЈАР, ΠΎΠ½ сС Π½Π΅Ρ›Π΅ ΠΏΠΎΠΊΠ²Π°Ρ€ΠΈΡ‚ΠΈ Ρ‚ΠΎΠΊΠΎΠΌ ΠΈΠ·Π²Ρ€ΡˆΠ°Π²Π°ΡšΠ°.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Ρ™Π°ΠΌΠΎ Π½ΠΎΠ²Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ

ΠšΠΎΡ€Π°Ρ†ΠΈ:

  1. ΠΈΠ·Π²Ρ€ΡˆΠΈΡ‚Π΅ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Ρƒ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π΄Π° бистС ΠΊΡ€Π΅ΠΈΡ€Π°Π»ΠΈ Π½ΠΎΠ²Ρƒ ΠΊΠΎΠ»ΠΎΠ½Ρƒ surname. Π‘Π°Π΄Π° ваша Π”Π‘ Π²Π΅Ρ€Π·ΠΈΡ˜Π° v2
  2. ΠΊΠΎΠΏΠΈΡ€Π°Ρ˜ ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ ΠΈΠ· last_name Π² surname. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅Π΄Π° Π°ΠΊΠΎ ΠΈΠΌΠ°Ρ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ²ΠΈΡ… ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°, Ρ‚Ρ€Π΅Π±Π°Π»ΠΎ Π±ΠΈ Π΄Π° размислитС ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΡ˜ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜ΠΈ!
  3. Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠ΄ Π³Π΄Π΅ сС користС ΠžΠ‘ΠžΠˆΠ• ΠΈ новиИ стари ΠΊΠΎΠ»ΠΎΠ½Π°. Π‘Π°Π΄Π° ваша Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ 2.0.0
  4. ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ˜Ρ‚Π΅ врСдност ΠΈΠ· ΠΊΠΎΠ»ΠΎΠ½Π΅ surname, Π°ΠΊΠΎ нијС null, ΠΈΠ»ΠΈ ΠΎΠ΄ Π»ast_nameΠ°ΠΊΠΎ surname нијС ΠΏΡ€Π΅Ρ†ΠΈΠ·ΠΈΡ€Π°Π½ΠΎ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ избрисати getLastName() ΠΈΠ· ΠΊΠΎΠ΄Π°, ΠΏΠΎΡˆΡ‚ΠΎ Ρ›Π΅ ΠΎΠ½ исписати null ΠΏΡ€ΠΈΠ»ΠΈΠΊΠΎΠΌ Π²Ρ€Π°Ρ›Π°ΡšΠ° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ са 3.0.0 Π΄ΠΎ 2.0.0.

Ако користитС Π‘ΠΏΡ€ΠΈΠ½Π³ Π‘ΠΎΠΎΡ‚ Π€Π»ΠΈΠ²Π°ΠΈ, ΠΎΠ²Π° Π΄Π²Π° ΠΊΠΎΡ€Π°ΠΊΠ° Ρ›Π΅ сС ΠΈΠ·Π²Ρ€ΡˆΠΈΡ‚ΠΈ Ρ‚ΠΎΠΊΠΎΠΌ ΠΏΠΎΠΊΡ€Π΅Ρ‚Π°ΡšΠ° Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ 2.0.0 Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅. Ако Ρ€ΡƒΡ‡Π½ΠΎ ΠΏΠΎΠΊΡ€Π΅Π½Π΅Ρ‚Π΅ Π°Π»Π°Ρ‚ΠΊΡƒ Π·Π° ΠΎΠ΄Ρ€Π΅Ρ’ΠΈΠ²Π°ΡšΠ΅ Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°, ΠΌΠΎΡ€Π°Ρ›Π΅Ρ‚Π΅ Π΄Π° ΡƒΡ€Π°Π΄ΠΈΡ‚Π΅ Π΄Π²Π΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚Π΅ ствари Π΄Π° бистС Ρ‚ΠΎ ΡƒΡ€Π°Π΄ΠΈΠ»ΠΈ (ΠΏΡ€Π²ΠΎ Ρ€ΡƒΡ‡Π½ΠΎ Π°ΠΆΡƒΡ€ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ Π΄Π±-Π°, Π° Π·Π°Ρ‚ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½ΠΎΠ²Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ).

Π’Π°ΠΆΠ½ΠΎ јС. Π—Π°ΠΏΠ°ΠΌΡ‚ΠΈΡ‚Π΅ Π΄Π° јС новостворСна ΠΊΠΎΠ»ΠΎΠ½Π° НЕ ВРЕБА Π±ΠΈΡ‚ΠΈ НОВ НУЛЛ. Ако ΠΈΠ·Π²Ρ€ΡˆΠΈΡ‚Π΅ Π²Ρ€Π°Ρ›Π°ΡšΠ΅, стара Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π΅ Π·Π½Π° Π·Π° Π½ΠΎΠ²Ρƒ ΠΊΠΎΠ»ΠΎΠ½Ρƒ ΠΈ Π½Π΅Ρ›Π΅ јС инсталирати Ρ‚ΠΎΠΊΠΎΠΌ Insert. Али Π°ΠΊΠΎ Π΄ΠΎΠ΄Π°Ρ‚Π΅ ΠΎΠ²ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅ΡšΠ΅ ΠΈ ваш Π΄Π± Ρ›Π΅ Π±ΠΈΡ‚ΠΈ v2, ΠΎΠ²ΠΎ Ρ›Π΅ Π·Π°Ρ…Ρ‚Π΅Π²Π°Ρ‚ΠΈ подСшавањС врСдности Π½ΠΎΠ²Π΅ ΠΊΠΎΠ»ΠΎΠ½Π΅. Π¨Ρ‚ΠΎ Ρ›Π΅ довСсти Π΄ΠΎ ΠΊΡ€ΡˆΠ΅ΡšΠ° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅ΡšΠ°.

Π’Π°ΠΆΠ½ΠΎ јС. Π’Ρ€Π΅Π±Π°Π»ΠΎ Π±ΠΈ Π΄Π° ΡƒΠΊΠ»ΠΎΠ½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ getLastName(), Ρ˜Π΅Ρ€ Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜ΠΈ 3.0.0 Π£ ΠΊΠΎΠ΄Ρƒ Π½Π΅ ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ ΠΊΠΎΠ»ΠΎΠ½Π΅ last_name. Π’ΠΎ Π·Π½Π°Ρ‡ΠΈ Π΄Π° Ρ›Π΅ Ρ‚Π°ΠΌΠΎ Π±ΠΈΡ‚ΠΈ постављСна Π½ΡƒΠ»Π°. ΠœΠΎΠΆΠ΅Ρ‚Π΅ оставити ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ Π΄ΠΎΠ΄Π°Ρ‚ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅ Π·Π° null, Π°Π»ΠΈ Π±ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΡ™Π΅ Ρ€Π΅ΡˆΠ΅ΡšΠ΅ Π±ΠΈΠ»ΠΎ Π΄Π° сС Ρƒ Ρ‚ΠΎ ΡƒΠ²Π΅Ρ€ΠΈΠΌΠΎ Ρƒ Π»ΠΎΠ³ΠΈΡ†ΠΈ getSurname() ΠΈΠ·Π°Π±Ρ€Π°Π»ΠΈ стС исправну врСдност која нијС Π½ΡƒΠ»Π°.

А/Π‘ Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅

Π’Ρ€Π΅Π½ΡƒΡ‚Π½Π° ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡ˜Π° јС Π΄Π° ΠΈΠΌΠ°ΠΌΠΎ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ 1.0.0, распорСђСно Ρƒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΡšΠΈ, Π° Π±Π°Π·Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Ρƒ v1. ΠœΠΎΡ€Π°ΠΌΠΎ Π΄Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ Π΄Ρ€ΡƒΠ³Ρƒ инстанцу Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ 2.0.0који Ρ›Π΅ Π°ΠΆΡƒΡ€ΠΈΡ€Π°Ρ‚ΠΈ Π±Π°Π·Ρƒ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π½Π° v2.

ΠšΠΎΡ€Π°Ρ†ΠΈ:

  1. ΠΏΡ€ΠΈΠΌΠ΅ΡšΡƒΡ˜Π΅ сС Π½ΠΎΠ²Π° инстанца Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ 2.0.0који Π°ΠΆΡƒΡ€ΠΈΡ€Π° Π±Π°Π·Ρƒ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π½Π° v2
  2. Ρƒ ΠΌΠ΅Ρ’ΡƒΠ²Ρ€Π΅ΠΌΠ΅Π½Ρƒ су Π½Π΅ΠΊΠΈ Π·Π°Ρ…Ρ‚Π΅Π²ΠΈ ΠΎΠ±Ρ€Π°Ρ’Π΅Π½ΠΈ ΠΎΠ΄ странС инстанци Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ 1.0.0
  3. Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ јС Π±ΠΈΠ»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈ ΠΈΠΌΠ°Ρ‚Π΅ вишС ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΡ‚ΠΈΡ… инстанци Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ 1.0.0 ΠΈ Π΄Ρ€ΡƒΠ³Π΅ Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ 2.0.0. Π‘Π²ΠΈ ΠΊΠΎΠΌΡƒΠ½ΠΈΡ†ΠΈΡ€Π°Ρ˜Ρƒ са Π±Π°Π·ΠΎΠΌ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Ρƒ v2
  4. Π²Π΅Ρ€Π·ΠΈΡ˜Π° 1.0.0 Π½Π΅ користи ΠΊΠΎΠ»ΠΎΠ½Ρƒ ΠΏΡ€Π΅Π·ΠΈΠΌΠ΅Π½Π° Ρƒ Π±Π°Π·ΠΈ, Π²Π΅Ρ› Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ 2.0.0 користи. Они сС Π½Π΅ ΠΌΠ΅ΡˆΠ°Ρ˜Ρƒ јСдни Ρƒ Π΄Ρ€ΡƒΠ³Π΅ ΠΈ Π½Π΅ Π±ΠΈ Ρ‚Ρ€Π΅Π±Π°Π»ΠΎ Π΄Π° Π±ΡƒΠ΄Π΅ Π³Ρ€Π΅ΡˆΠ°ΠΊΠ°.
  5. Π²Π΅Ρ€Π·ΠΈΡ˜Π° 2.0.0 Ρ‡ΡƒΠ²Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ ΠΈ Ρƒ ΡΡ‚Π°Ρ€ΠΎΡ˜ ΠΈ Ρƒ новој ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΎΠ±Π΅Π·Π±Π΅Ρ’ΡƒΡ˜ΡƒΡ›ΠΈ компатибилност ΡƒΠ½Π°Π·Π°Π΄

Π’Π°ΠΆΠ½ΠΎ јС. Ако ΠΈΠΌΠ°Ρ‚Π΅ Π±ΠΈΠ»ΠΎ ΠΊΠ°ΠΊΠ²Π΅ ΡƒΠΏΠΈΡ‚Π΅ који Π±Ρ€ΠΎΡ˜Π΅ ставкС Π½Π° основу врСдности ΠΈΠ· старС/Π½ΠΎΠ²Π΅ ΠΊΠΎΠ»ΠΎΠ½Π΅, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π·Π°ΠΏΠ°ΠΌΡ‚ΠΈΡ‚Π΅ Π΄Π° сада ΠΈΠΌΠ°Ρ‚Π΅ Π΄ΡƒΠΏΠ»ΠΈΡ€Π°Π½Π΅ врСдности (Π½Π°Ρ˜Π²Π΅Ρ€ΠΎΠ²Π°Ρ‚Π½ΠΈΡ˜Π΅ сС још ΡƒΠ²Π΅ΠΊ ΠΌΠΈΠ³Ρ€ΠΈΡ€Π°Ρ˜Ρƒ). На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°ΠΊΠΎ ΠΆΠ΅Π»ΠΈΡ‚Π΅ Π΄Π° ΠΏΡ€Π΅Π±Ρ€ΠΎΡ˜ΠΈΡ‚Π΅ Π±Ρ€ΠΎΡ˜ корисника Ρ‡ΠΈΡ˜Π΅ ΠΏΡ€Π΅Π·ΠΈΠΌΠ΅ (ΠΊΠ°ΠΊΠΎ Π³ΠΎΠ΄ Π΄Π° сС Π·ΠΎΠ²Π΅ ΠΊΠΎΠ»ΠΎΠ½Π°) ΠΏΠΎΡ‡ΠΈΡšΠ΅ словом A, Π·Π°Ρ‚ΠΈΠΌ Π΄ΠΎΠΊ сС ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π½Π΅ Π·Π°Π²Ρ€ΡˆΠΈ (old β†’ new ΠΊΠΎΠ»ΠΎΠ½Π°) ΠΌΠΎΠΆΠ΄Π° ΠΈΠΌΠ°Ρ‚Π΅ нСдослСднС ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ Π°ΠΊΠΎ постављатС ΡƒΠΏΠΈΡ‚ Π·Π° Π½ΠΎΠ²Ρƒ ΠΊΠΎΠ»ΠΎΠ½Ρƒ.

Π’Ρ€Π°Ρ›Π°ΡšΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅

Π‘Π°Π΄Π° ΠΈΠΌΠ°ΠΌΠΎ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ 2.0.0 ΠΈ Π±Π°Π·Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Ρƒ v2.

ΠšΠΎΡ€Π°Ρ†ΠΈ:

  1. Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ Π½Π° Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ 1.0.0.
  2. Π²Π΅Ρ€Π·ΠΈΡ˜Π° 1.0.0 Π½Π΅ користи ΠΊΠΎΠ»ΠΎΠ½Ρƒ Ρƒ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° surname, Ρ‚Π°ΠΊΠΎ Π΄Π° Π±ΠΈ Π²Ρ€Π°Ρ›Π°ΡšΠ΅ Ρ‚Ρ€Π΅Π±Π°Π»ΠΎ Π΄Π° Π±ΡƒΠ΄Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ

Π”Π‘ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅

Π‘Π°Π·Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° садрТи ΠΊΠΎΠ»ΠΎΠ½Ρƒ ΠΏΠΎΠ΄ Π½Π°Π·ΠΈΠ²ΠΎΠΌ last_name.

Π˜Π·Π²ΠΎΡ€Π½Π° скрипта Π€Π»ΠΈΠ²Π°ΠΈ:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

Π”ΠΎΠ΄Π°Ρ˜Ρ‚Π΅ скрипту surname.

ПаТња. Π—Π°ΠΏΠ°ΠΌΡ‚ΠΈΡ‚Π΅ Π΄Π° НЕ ΠœΠžΠ–Π•Π’Π• Π”ΠžΠ”ΠΠ’Π˜ Π½ΠΈΠΊΠ°ΠΊΠ²Π° НОВ НУЛЛ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅ΡšΠ° Ρƒ ΠΊΠΎΠ»ΠΎΠ½Ρƒ ΠΊΠΎΡ˜Ρƒ Π΄ΠΎΠ΄Π°Ρ˜Π΅Ρ‚Π΅. Ако Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ ЈАР, стара Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π΅Ρ›Π΅ ΠΈΠΌΠ°Ρ‚ΠΈ појма ΠΎ Π΄ΠΎΠ΄Π°Ρ‚ΠΎΡ˜ ΠΊΠΎΠ»ΠΎΠ½ΠΈ ΠΈ аутоматски Ρ›Π΅ јС поставити Π½Π° НУЛЛ. Ако ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ Ρ‚Π°ΠΊΠ²ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅ΡšΠ΅, стара Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Ρ›Π΅ сС Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΎ ΠΏΠΎΠΊΠ²Π°Ρ€ΠΈΡ‚ΠΈ.

-- NOTE: This field can't have the NOT NULL constraint cause if you rollback, the old version won't know about this field
-- and will always set it to NULL
ALTER TABLE PERSON ADD surname varchar(255);

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
UPDATE PERSON SET PERSON.surname = PERSON.last_name

ΠŸΡ€ΠΎΠΌΠ΅Π½Π΅ ΠΊΠΎΠ΄Π°

ΠŸΠΎΠ΄Π°Ρ‚ΠΊΠ΅ Ρ‡ΡƒΠ²Π°ΠΌΠΎ ΠΊΠ°ΠΎ last_name, ΠΈ ΠΈΠ½ surname. Π£ исто Π²Ρ€Π΅ΠΌΠ΅ Ρ‡ΠΈΡ‚Π°ΠΌΠΎ ΠΈΠ· last_name, ΠΏΠΎΡˆΡ‚ΠΎ јС ΠΎΠ²Π° ΠΊΠΎΠ»ΠΎΠ½Π° Π½Π°Ρ˜Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½ΠΈΡ˜Π°. Π’ΠΎΠΊΠΎΠΌ процСса ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π΅, Π½Π΅ΠΊΠΈ Π·Π°Ρ…Ρ‚Π΅Π²ΠΈ су ΠΌΠΎΠΆΠ΄Π° ΠΎΠ±Ρ€Π°Ρ’Π΅Π½ΠΈ ΠΎΠ΄ странС инстанцС Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ која још нијС Π°ΠΆΡƒΡ€ΠΈΡ€Π°Π½Π°.

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * Reading from the new column if it's set. If not the from the old one.
     *
     * When migrating from version 1.0.0 -> 2.0.0 this can lead to a possibility that some data in
     * the surname column is not up to date (during the migration process lastName could have been updated).
     * In this case one can run yet another migration script after all applications have been deployed in the
     * new version to ensure that the surname field is updated.
     *
     * However it makes sense since when looking at the migration from 2.0.0 -> 3.0.0. In 3.0.0 we no longer
     * have a notion of lastName at all - so we don't update that column. If we rollback from 3.0.0 -> 2.0.0 if we
     * would be reading from lastName, then we would have very old data (since not a single datum was inserted
     * to lastName in version 3.0.0).
     */
    public String getSurname() {
        return this.surname != null ? this.surname : this.lastName;
    }

    /**
     * Storing both FIRST_NAME and SURNAME entries
     */
    public void setSurname(String surname) {
        this.lastName = surname;
        this.surname = surname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName + ", surname=" + this.surname
                + "]";
    }
}

ΠšΠΎΡ€Π°ΠΊ 3: УклањањС ΠΏΡ€Π΅Π·ΠΈΠΌΠ΅Π½Π° ΠΈΠ· ΠΊΠΎΠ΄Π°

Π’Π΅Ρ€Π·ΠΈΡ˜Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅: 3.0.0

Π”Π‘ Π²Π΅Ρ€Π·ΠΈΡ˜Π°:v3

ΠšΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€

Π‘Π΅Π»Π΅ΡˆΠΊΠ° ΠΏΠ΅Ρ€.: ΠžΡ‡ΠΈΠ³Π»Π΅Π΄Π½ΠΎ јС Ρƒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΎΠΌ Ρ‡Π»Π°Π½ΠΊΡƒ Π°ΡƒΡ‚ΠΎΡ€ Π³Ρ€Π΅ΡˆΠΊΠΎΠΌ ΠΊΠΎΠΏΠΈΡ€Π°ΠΎ тСкст ΠΎΠ²ΠΎΠ³ Π±Π»ΠΎΠΊΠ° ΠΈΠ· ΠΊΠΎΡ€Π°ΠΊΠ° 2. Π£ ΠΎΠ²ΠΎΠΌ ΠΊΠΎΡ€Π°ΠΊΡƒ Ρ‚Ρ€Π΅Π±Π° ΠΈΠ·Π²Ρ€ΡˆΠΈΡ‚ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅ Ρƒ ΠΊΠΎΠ΄Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ са Ρ†ΠΈΡ™Π΅ΠΌ Π΄Π° сС ΡƒΠΊΠ»ΠΎΠ½ΠΈ функционалност која користи ΠΊΠΎΠ»ΠΎΠ½Ρƒ last_name.

Π”ΠΎΠ΄Π°Π²Π°ΡšΠ΅ΠΌ Π½ΠΎΠ²Π΅ ΠΊΠΎΠ»ΠΎΠ½Π΅ ΠΈ ΠΊΠΎΠΏΠΈΡ€Π°ΡšΠ΅ΠΌ њСног ΡΠ°Π΄Ρ€ΠΆΠ°Ρ˜Π°, Π½Π°ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ смо ΡƒΠ½Π°Π·Π°Π΄ ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°. Π’Π°ΠΊΠΎΡ’Π΅, Π°ΠΊΠΎ Π²Ρ€Π°Ρ‚ΠΈΠΌΠΎ ЈАР ΠΈΠ»ΠΈ ΠΏΠΎΠΊΡ€Π΅Π½Π΅ΠΌΠΎ стари ЈАР, ΠΎΠ½ сС Π½Π΅Ρ›Π΅ ΠΏΠΎΠΊΠ²Π°Ρ€ΠΈΡ‚ΠΈ Ρ‚ΠΎΠΊΠΎΠΌ ΠΈΠ·Π²Ρ€ΡˆΠ°Π²Π°ΡšΠ°.

Π’Ρ€Π°Ρ›Π°ΡšΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅

Π’Ρ€Π΅Π½ΡƒΡ‚Π½ΠΎ ΠΈΠΌΠ°ΠΌΠΎ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ 3.0.0 ΠΈ Π±Π°Π·Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° v3. Π’Π΅Ρ€Π·ΠΈΡ˜Π° 3.0.0 Π½Π΅ Ρ‡ΡƒΠ²Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ Ρƒ last_name. Π’ΠΎ Π·Π½Π°Ρ‡ΠΈ Π΄Π° Ρƒ surname Ρ‡ΡƒΠ²Π°Ρ˜Ρƒ сС Π½Π°Ρ˜Π°ΠΆΡƒΡ€Π½ΠΈΡ˜Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ˜Π΅.

ΠšΠΎΡ€Π°Ρ†ΠΈ:

  1. Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ Π½Π° Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ 2.0.0.
  2. Π²Π΅Ρ€Π·ΠΈΡ˜Π° 2.0.0 користи ΠΈ last_name ΠΈ surname.
  3. Π²Π΅Ρ€Π·ΠΈΡ˜Π° 2.0.0 ΠΎΠ΄Ρ€ΠΆΠ°Ρ›Π΅ surname, Π°ΠΊΠΎ нијС Π½ΡƒΠ»Π°, ΠΈΠ½Π°Ρ‡Π΅ -last_name

ΠŸΡ€ΠΎΠΌΠ΅Π½Π΅ Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°

Π£ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π½Π΅ΠΌΠ° структурних ΠΏΡ€ΠΎΠΌΠ΅Π½Π°. Π‘Π»Π΅Π΄Π΅Ρ›Π° скрипта сС ΠΈΠ·Π²Ρ€ΡˆΠ°Π²Π° Π΄Π° Π±ΠΈ сС ΠΈΠ·Π²Ρ€ΡˆΠΈΠ»Π° ΠΊΠΎΠ½Π°Ρ‡Π½Π° ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Π° старих ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°:

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
-- ALSO WE'RE NOT CHECKING IF WE'RE NOT OVERRIDING EXISTING ENTRIES. WE WOULD HAVE TO COMPARE
-- ENTRY VERSIONS TO ENSURE THAT IF THERE IS ALREADY AN ENTRY WITH A HIGHER VERSION NUMBER
-- WE WILL NOT OVERRIDE IT.
UPDATE PERSON SET PERSON.surname = PERSON.last_name;

-- DROPPING THE NOT NULL CONSTRAINT; OTHERWISE YOU WILL TRY TO INSERT NULL VALUE OF THE LAST_NAME
-- WITH A NOT_NULL CONSTRAINT.
ALTER TABLE PERSON MODIFY COLUMN last_name varchar(255) NULL DEFAULT NULL;

ΠŸΡ€ΠΎΠΌΠ΅Π½Π΅ ΠΊΠΎΠ΄Π°

Π‘Π΅Π»Π΅ΡˆΠΊΠ° ΠΏΠ΅Ρ€.: Опис ΠΎΠ²ΠΎΠ³ Π±Π»ΠΎΠΊΠ° јС Ρ‚Π°ΠΊΠΎΡ’Π΅ Π³Ρ€Π΅ΡˆΠΊΠΎΠΌ ΠΊΠΎΠΏΠΈΡ€Π°ΠΎ Π°ΡƒΡ‚ΠΎΡ€ ΠΈΠ· ΠΊΠΎΡ€Π°ΠΊΠ° 2. Π£ складу са Π»ΠΎΠ³ΠΈΠΊΠΎΠΌ Ρ‡Π»Π°Π½ΠΊΠ°, ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅ Ρƒ ΠΊΠΎΠ΄Ρƒ Ρƒ ΠΎΠ²ΠΎΠΌ ΠΊΠΎΡ€Π°ΠΊΡƒ Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΈΠΌΠ°Ρ˜Ρƒ Π·Π° Ρ†ΠΈΡ™ Π΄Π° ΠΈΠ· њСга ΡƒΠΊΠ»ΠΎΠ½Π΅ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π΅ који Ρ€Π°Π΄Π΅ са ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΌ last_name.

ΠŸΠΎΠ΄Π°Ρ‚ΠΊΠ΅ Ρ‡ΡƒΠ²Π°ΠΌΠΎ ΠΊΠ°ΠΎ last_name, ΠΈ ΠΈΠ½ surname. ΠŸΠΎΡ€Π΅Π΄ Ρ‚ΠΎΠ³Π°, Ρ‡ΠΈΡ‚Π°ΠΌΠΎ ΠΈΠ· ΠΊΠΎΠ»ΡƒΠΌΠ½Π΅ last_name, ΠΏΠΎΡˆΡ‚ΠΎ јС Π½Π°Ρ˜Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½ΠΈΡ˜ΠΈ. Π’ΠΎΠΊΠΎΠΌ процСса ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π΅, Π½Π΅ΠΊΠ΅ Π·Π°Ρ…Ρ‚Π΅Π²Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΠ±Ρ€Π°Π΄ΠΈ инстанца која још ΡƒΠ²Π΅ΠΊ нијС Π½Π°Π΄ΠΎΠ³Ρ€Π°Ρ’Π΅Π½Π°.

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSurname() {
        return this.surname;
    }

    public void setSurname(String lastname) {
        this.surname = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", surname=" + this.surname
                + "]";
    }
}

ΠšΠΎΡ€Π°ΠΊ 4: УклањањС ΠΏΡ€Π΅Π·ΠΈΠΌΠ΅Π½Π° ΠΈΠ· Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°

Π’Π΅Ρ€Π·ΠΈΡ˜Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅: 4.0.0

Π”Π‘ Π²Π΅Ρ€Π·ΠΈΡ˜Π°: v4

ΠšΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€

Π—Π±ΠΎΠ³ Ρ‡ΠΈΡšΠ΅Π½ΠΈΡ†Π΅ Π΄Π° јС ΠΊΠΎΠ΄ Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ 3.0.0 нијС користио ΠΊΠΎΠ»ΠΎΠ½Ρƒ last_name, Π½ΠΈΡˆΡ‚Π° лошС сС Π½Π΅Ρ›Π΅ Π΄ΠΎΠ³ΠΎΠ΄ΠΈΡ‚ΠΈ Ρ‚ΠΎΠΊΠΎΠΌ ΠΈΠ·Π²Ρ€ΡˆΠ΅ΡšΠ° Π°ΠΊΠΎ сС Π²Ρ€Π°Ρ‚ΠΈΠΌΠΎ Π½Π° 3.0.0 Π½Π°ΠΊΠΎΠ½ ΡƒΠΊΠ»Π°ΡšΠ°ΡšΠ° ΠΊΠΎΠ»ΠΎΠ½Π΅ ΠΈΠ· Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°.

Π”Π½Π΅Π²Π½ΠΈΡ†ΠΈ ΠΈΠ·Π²Ρ€ΡˆΠ°Π²Π°ΡšΠ° скриптС

We will do it in the following way:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0
05) Wait for the app (2.0.0) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0
07) Generate a person by calling POST localhost:9992/person to version 2.0.0
08) Kill app (1.0.0)
09) Run 3.0.0
10) Wait for the app (3.0.0) to boot
11) Generate a person by calling POST localhost:9992/person to version 2.0.0
12) Generate a person by calling POST localhost:9993/person to version 3.0.0
13) Kill app (3.0.0)
14) Run 4.0.0
15) Wait for the app (4.0.0) to boot
16) Generate a person by calling POST localhost:9993/person to version 3.0.0
17) Generate a person by calling POST localhost:9994/person to version 4.0.0

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2","lastName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2"}

Starting app in version 2.0.0

Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"e41ee756-4fa7-4737-b832-e28827a00deb","lastName":"e41ee756-4fa7-4737-b832-e28827a00deb"}

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:

{"firstName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","lastName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","surname":"0c1240f5-649a-4bc5-8aa9-cff855f3927f"}

Killing app 1.0.0

Starting app in version 3.0.0

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","lastName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","surname":"74d84a9e-5f44-43b8-907c-148c6d26a71b"}

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"c6564dbe-9ab5-40ae-9077-8ae6668d5862","surname":"c6564dbe-9ab5-40ae-9077-8ae6668d5862"}

Killing app 2.0.0

Starting app in version 4.0.0

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:

{"firstName":"cbe942fc-832e-45e9-a838-0fae25c10a51","surname":"cbe942fc-832e-45e9-a838-0fae25c10a51"}

Generate a person in version 4.0.0
Sending a post to 127.0.0.1:9994/person. This is the response:

{"firstName":"ff6857ce-9c41-413a-863e-358e2719bf88","surname":"ff6857ce-9c41-413a-863e-358e2719bf88"}

Π”Π‘ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅

Π Π΅Π»Π°Ρ‚ΠΈΠ²Π½ΠΎ v3 само ΡƒΠΊΠ»Π°ΡšΠ°ΠΌΠΎ ΠΊΠΎΠ»ΠΎΠ½Ρƒ last_name ΠΈ Π΄ΠΎΠ΄Π°Ρ˜Ρ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅ΡšΠ° која Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ˜Ρƒ.

-- REMOVE THE COLUMN
ALTER TABLE PERSON DROP last_name;

-- ADD CONSTRAINTS
UPDATE PERSON SET surname='' WHERE surname IS NULL;
ALTER TABLE PERSON ALTER COLUMN surname VARCHAR NOT NULL;

ΠŸΡ€ΠΎΠΌΠ΅Π½Π΅ ΠΊΠΎΠ΄Π°

НСма ΠΏΡ€ΠΎΠΌΠ΅Π½Π° Ρƒ ΠΊΠΎΠ΄Ρƒ.

Излаз

УспСшно смо ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Ρƒ Π½Π°Π·ΠΈΠ²Π° ΠΊΠΎΠ»ΠΎΠ½Π΅ која нијС ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½Π° са ΡƒΠ½Π°Π·Π°Π΄ Ρ‚Π°ΠΊΠΎ ΡˆΡ‚ΠΎ смо ΠΈΠ·Π²Ρ€ΡˆΠΈΠ»ΠΈ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Ρƒ ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½ΠΈΡ… са ΡƒΠ½Π°Π·Π°Π΄. Испод јС Ρ€Π΅Π·ΠΈΠΌΠ΅ ΠΈΠ·Π²Ρ€ΡˆΠ΅Π½ΠΈΡ… Ρ€Π°Π΄ΡšΠΈ:

  1. ΠΏΡ€ΠΈΠΌΠ΅Π½Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ 1.0.0 с v1 шСма Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° (ΠΈΠΌΠ΅ ΠΊΠΎΠ»ΠΎΠ½Π΅ = last_name)
  2. ΠΏΡ€ΠΈΠΌΠ΅Π½Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ 2.0.0, који Ρ‡ΡƒΠ²Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ Ρƒ last_name ΠΈ surname. ΠΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Ρ‡ΠΈΡ‚Π° ΠΎΠ΄ last_name. Π‘Π°Π·Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° јС Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜ΠΈ v2који садрТС ΠΊΠΎΠ»ΠΎΠ½Π΅ ΠΏΠΎΠΏΡƒΡ‚ last_nameИ surname. surname јС копија Π»ast_name. (ΠΠΠŸΠžΠœΠ•ΠΠ: Ова ΠΊΠΎΠ»ΠΎΠ½Π° Π½Π΅ смС Π΄Π° ΠΈΠΌΠ° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅ΡšΠ΅ нијС Π½ΡƒΠ»Ρ‚ΠΎ)
  3. ΠΏΡ€ΠΈΠΌΠ΅Π½Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ 3.0.0, који само Ρ‡ΡƒΠ²Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ Ρƒ surname Π° гласи ΠΈΠ· ΠΏΡ€Π΅Π·ΠΈΠΌΠ΅Π½Π°. Π¨Ρ‚ΠΎ сС Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Ρ‚ΠΈΡ‡Π΅, послСдња ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡ˜Π° јС Ρƒ Ρ‚ΠΎΠΊΡƒ last_name Π² surname. Π’Π°ΠΊΠΎΡ’Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅ΡšΠ΅ НОВ НУЛЛ ΡƒΠΊΠ»ΠΎΡšΠ΅Π½Π° ΠΈΠ· last_name. Π‘Π°Π·Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° јС сада Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜ΠΈ v3
  4. ΠΏΡ€ΠΈΠΌΠ΅Π½Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ 4.0.0 - Π½Π΅ΠΌΠ° ΠΏΡ€ΠΎΠΌΠ΅Π½Π° Ρƒ ΠΊΠΎΠ΄Ρƒ. ΠŸΡ€ΠΈΠΌΠ΅Π½Π° Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° v4, који ΡƒΠΊΠ»Π°ΡšΠ° last_name. ОвдС ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ΄Π°Ρ‚ΠΈ сва ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅ΡšΠ° која Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ˜Ρƒ Ρƒ Π±Π°Π·Ρƒ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°.

ΠŸΡ€Π°Ρ‚Π΅Ρ›ΠΈ овај приступ, ΡƒΠ²Π΅ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Ρ˜Π΅Π΄Π½Ρƒ Π²Π΅Ρ€Π·ΠΈΡ˜Ρƒ ΡƒΠ½Π°Π·Π°Π΄ Π±Π΅Π· Π½Π°Ρ€ΡƒΡˆΠ°Π²Π°ΡšΠ° компатибилности Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°/Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°.

Код

Π‘Π°Π² ΠΊΠΎΠ΄ ΠΊΠΎΡ€ΠΈΡˆΡ›Π΅Π½ Ρƒ ΠΎΠ²ΠΎΠΌ Ρ‡Π»Π°Π½ΠΊΡƒ доступан јС Π½Π° Π“ΠΈΡ‚Ρ…ΡƒΠ±. Испод јС Π΄ΠΎΠ΄Π°Ρ‚Π½ΠΈ опис.

ΠŸΡ€ΠΎΡ˜Π΅ΠΊΡ‚ΠΈ

Након ΠΊΠ»ΠΎΠ½ΠΈΡ€Π°ΡšΠ° ΡΠΏΡ€Π΅ΠΌΠΈΡˆΡ‚Π°, Π²ΠΈΠ΄Π΅Ρ›Π΅Ρ‚Π΅ слСдСћу структуру фасцикли.

β”œβ”€β”€ boot-flyway-v1              - 1.0.0 version of the app with v1 of the schema
β”œβ”€β”€ boot-flyway-v2              - 2.0.0 version of the app with v2 of the schema (backward-compatible - app can be rolled back)
β”œβ”€β”€ boot-flyway-v2-bad          - 2.0.0.BAD version of the app with v2bad of the schema (backward-incompatible - app cannot be rolled back)
β”œβ”€β”€ boot-flyway-v3              - 3.0.0 version of the app with v3 of the schema (app can be rolled back)
└── boot-flyway-v4              - 4.0.0 version of the app with v4 of the schema (app can be rolled back)

Π‘ΠΊΡ€ΠΈΠΏΡ‚Π΅

ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΡ‚ΠΈ скриптС описанС Ρƒ скриптама Ρƒ наставку, којС Ρ›Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΠΈ ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½Π΅ ΠΈ Π½Π΅ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅ Ρƒ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°.

Π”Π° бистС Π²ΠΈΠ΄Π΅Π»ΠΈ ΡΠ»ΡƒΡ‡Π°Ρ˜ са ΠΏΡ€ΠΎΠΌΠ΅Π½Π°ΠΌΠ° ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½ΠΈΠΌ са ΡƒΠ½Π°Π·Π°Π΄, Ρ‚Ρ€Ρ†Π°Ρ‚ΠΈ:

./scripts/scenario_backward_compatible.sh

И Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΡΠ»ΡƒΡ‡Π°Ρ˜ са Π½Π°Π·Π°Π΄ Π½Π΅ΠΊΠΎΠΌΠΏΠ°Ρ‚ΠΈΠ±ΠΈΠ»Π½ΠΈΠΌ ΠΏΡ€ΠΎΠΌΠ΅Π½Π°ΠΌΠ°, Ρ‚Ρ€Ρ†Π°Ρ‚ΠΈ:

./scripts/scenario_backward_incompatible.sh

ΠŸΡ€ΠΎΠ»Π΅Ρ›Π½ΠΈ ΡƒΠ·ΠΎΡ€Π°ΠΊ Π·Π° ΠΏΡ€ΠΎΠ»Π΅Ρ›Π΅

Π‘Π²ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ су ΠΏΡ€Π΅ΡƒΠ·Π΅Ρ‚ΠΈ ΠΈΠ· Spring Boot Sample Flyway.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ³Π»Π΅Π΄Π°Ρ‚ΠΈ http://localhost:8080/flyway, ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ листа скрипти.

Овај ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΡ’Π΅ ΡƒΠΊΡ™ΡƒΡ‡ΡƒΡ˜Π΅ ΠΊΠΎΠ½Π·ΠΎΠ»Ρƒ Π₯2 (Π½Π° http://localhost:8080/h2-console) Ρ‚Π°ΠΊΠΎ Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ статус Π±Π°Π·Π΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° (ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π½Π° Ρ˜Π΄Π±Ρ† Π£Π Π› адрСса јС jdbc:h2:mem:testdb).

Π΄ΠΎΠ΄Π°Ρ‚Π½ΠΎ

ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ˜Ρ‚Π΅ ΠΈ Π΄Ρ€ΡƒΠ³Π΅ Ρ‡Π»Π°Π½ΠΊΠ΅ Π½Π° нашСм Π±Π»ΠΎΠ³Ρƒ:

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€