Skip to content
11 / 15

БСзопасный DDL: ΠΊΠ°ΠΊΠΈΠ΅ измСнСния схСмы Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ ΠΊΠ°ΠΊ этого ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ?

Π§Π°ΡΡ‚ΡŒ DDL Π² PostgreSQL выполняСтся ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ, Ρ‡Π°ΡΡ‚ΡŒ пСрСписываСт Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ ΠΏΠΎΠ΄ ACCESS EXCLUSIVE. ΠœΠ³Π½ΠΎΠ²Π΅Π½Π½Ρ‹Π΅: Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ (Π² Ρ‚ΠΎΠΌ числС с константным DEFAULT β€” с вСрсии 11 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ хранится Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ…), ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ NOT VALID-ограничСния, снятиС NOT NULL. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ: смСна Ρ‚ΠΈΠΏΠ° ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ с Π²ΠΎΠ»Π°Ρ‚ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ALTER TABLE ... SET LOGGED. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ катСгория β€” ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сами ΠΏΠΎ сСбС быстры, Π½ΠΎ ΠΆΠ΄ΡƒΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΈ Ρ‚Π΅ΠΌ самым Π²Ρ‹ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ Π·Π° собой ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈΠ· ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… запросов; поэтому любой DDL Π² ΠΏΡ€ΠΎΠ΄Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ с lock_timeout ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π°ΠΌΠΈ. Π”ΠΎΠ»Π³ΠΈΠ΅ построСния выносят ΠΈΠ· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ: CREATE INDEX CONCURRENTLY, ALTER TABLE ... ADD CONSTRAINT ... NOT VALID с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ VALIDATE CONSTRAINT, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ NOT NULL Ρ‡Π΅Ρ€Π΅Π· CHECK NOT VALID β†’ VALIDATE β†’ SET NOT NULL.

БСзопасный DDL: ΠΊΠ°ΠΊΠΈΠ΅ измСнСния схСмы Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ ΠΊΠ°ΠΊ этого ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ? | JScriptiser