์กฐ๋ง๊ฐ ๋ง์ ์ฌ๋๋ค์ด ํ
์ด๋ธ ๋ ์ฝ๋์์ ๋ฌด์ธ๊ฐ๋ฅผ ๋๊ท๋ชจ๋ก ์์ ํด์ผ ํ ํ์์ฑ์ ์ง๋ฉดํ๊ฒ ๋ฉ๋๋ค. ๋๋ ์ด๋ฏธ
์๋ฅผ ๋ค์ด, ๋ฌด์ธ๊ฐ๋ฅผ ์์ ํด์ผ ํ๋ ํ
์ด๋ธ์์ ์
์์ ์ธ ํธ๋ฆฌ๊ฑฐ๊ฐ ์ค๋จ๋ฉ๋๋ค. ON UPDATE
, ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ผ๋ถ ์ง๊ณ๋ก ์ ์กํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์ง๊ณ๊ฐ ์ํฅ์ ๋ฐ์ง ์๋๋ก ๋ชจ๋ ๊ฒ์ ์ ์คํ๊ฒ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค(์: ์ ํ๋ ์ด๊ธฐํ).
ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋นํ์ฑํํฉ์๋ค!
BEGIN;
ALTER TABLE ... DISABLE TRIGGER ...;
UPDATE ...; -- ััั ะดะพะปะณะพ-ะดะพะปะณะพ
ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;
์ฌ์ค ๊ทธ๊ฒ ๋ค์ผ - ๋ชจ๋ ๊ฒ์ด ๊ฑธ๋ ค์๋ค.
๋๋ฌธ์ ALTER TABLE
๋ถ๊ณผํ๋ค ์ก์ธ์ค ๋
์ - ๋จ์ํ ๊ฒ์ผ์ง๋ผ๋ ์๋ฌด๋ ๋ณ๋ ฌ๋ก ์คํํ์ง ์๋ ์ ๊ธ SELECT
, ํ
์ด๋ธ์์ ์๋ฌด ๊ฒ๋ ์ฝ์ ์ ์์ต๋๋ค. ์ฆ, ์ด ํธ๋์ญ์
์ด ๋๋ ๋๊น์ง "๊ทธ๋ฅ ์ฝ๊ธฐ"๋ผ๋ ์ํ๋ ๋ชจ๋ ์ฌ๋์ด ๊ธฐ๋ค๋ฆด ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๊ธฐ์ตํฉ๋๋ค UPDATE
์ฐ๋ฆฌ๋ ๊ธด ...
๋นจ๋ฆฌ ๊ป๋ค๊ฐ ๋นจ๋ฆฌ ์ผ์!
BEGIN;
ALTER TABLE ... DISABLE TRIGGER ...;
COMMIT;
UPDATE ...;
BEGIN;
ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;
์ฌ๊ธฐ์ ์ํฉ์ ์ด๋ฏธ ๋ ์ข๊ณ ๋๊ธฐ ์๊ฐ์ ํจ์ฌ ์ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ ๊ฐ์ง ๋ฌธ์ ๋ง์ด ๋ชจ๋ ์๋ฆ๋ค์์ ๋ง์นฉ๋๋ค.
ALTER TABLE
๊ธด ์์ ์ ํฌํจํ์ฌ ํ ์ด๋ธ์ ๋ค๋ฅธ ๋ชจ๋ ์์ ์ ๊ธฐ๋ค๋ฆฝ๋๋ค.SELECT
- ํธ๋ฆฌ๊ฑฐ๊ฐ ๊บผ์ ธ ์๋ ๋์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ "๋นํ" ํ ์ด๋ธ์, ์ฌ์ง์ด ์ฐ๋ฆฌ ๊ฒ์ด ์๋๋๋ค. ์ง๊ณ์ ํฌํจ๋์ด์ผ ํ์ง๋ง ์ง๊ณ์ ํฌํจ๋์ง๋ ์์ต๋๋ค. ๋ฌธ์ !
์ธ์ ๋ณ์ ๊ด๋ฆฌ
๋ฐ๋ผ์ ์ด์ ๋ฒ์ ์์ ์ฐ๋ฆฌ๋ ๊ทผ๋ณธ์ ์ธ ์ ์ ์ฐ์ฐํ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ฆ, ํ
์ด๋ธ์ "์ฐ๋ฆฌ" ๋ณ๊ฒฝ ์ฌํญ๊ณผ "์ฐ๋ฆฌ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋" ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌ๋ณํ๊ธฐ ์ํด ์ด๋ป๊ฒ๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ฐ๋ฅด์ณ์ผ ํฉ๋๋ค. "Ours"๋ ๊ทธ๋๋ก ๊ฑด๋๋ฐ์ง๋ง "not ours"์์๋ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค. ์ด๋ฅผ ์ํด ๋ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ธ์ _๋ณต์ _์ญํ
์ฐ๋ฆฌ๋ ์ฝ์๋ค.
ํธ๋ฆฌ๊ฑฐ ๋ฉ์ปค๋์ฆ์ ๊ตฌ์ฑ ๋ณ์์ ์ํฅ๋ ๋ฐ์ต๋๋ค.
์ธ์ _๋ณต์ _์ญํ . ์ถ๊ฐ ์ง์นจ ์์ด ํ์ฑํ(๊ธฐ๋ณธ๊ฐ), ๋ณต์ ์ญํ ์ด "์๋ณธ"(๊ธฐ๋ณธ๊ฐ) ๋๋ "๋ก์ปฌ"์ผ ๋ ํธ๋ฆฌ๊ฑฐ๊ฐ ์คํ๋ฉ๋๋ค. ์ง์ ํ์ฌ ํ์ฑํ๋ ํธ๋ฆฌ๊ฑฐENABLE REPLICA
, ๋ค์ ๊ฒฝ์ฐ์๋ง ์๋ํฉ๋๋ค. ํ์ฌ ์ธ์ ๋ชจ๋ - "๋ณต์ ๋ณธ" ๋ฐ ์ง์ ํ์ฌ ํ์ฑํ๋ ํธ๋ฆฌ๊ฑฐENABLE ALWAYS
, ํ์ฌ ๋ณต์ ๋ชจ๋์ ๊ด๊ณ์์ด ์๋ํฉ๋๋ค.
์ค์ ์ด ํ ๋ฒ์ ๋ชจ๋ ์ ์ฉ๋์ง ์๋๋ค๋ ์ ์ ํนํ ๊ฐ์กฐํ๊ฒ ์ต๋๋ค. ALTER TABLE
, ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ์ ๋ณ๋์ ํน์ ์ฐ๊ฒฐ์๋ง ํด๋น๋ฉ๋๋ค. ์ ์ฒด์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
ํธ๋ฆฌ๊ฑฐ๊ฐ ์๋ํ์ง ์๋๋ก ๋ค์์ ์ํํฉ๋๋ค.
SET session_replication_role = replica; -- ะฒัะบะปััะธะปะธ ััะธะณะณะตัั
UPDATE ...;
SET session_replication_role = DEFAULT; -- ะฒะตัะฝัะปะธ ะฒ ะธัั
ะพะดะฝะพะต ัะพััะพัะฝะธะต
ํธ๋ฆฌ๊ฑฐ ๋ด๋ถ ์กฐ๊ฑด
๊ทธ๋ฌ๋ ์์ ์ต์ ์ ํ ๋ฒ์ ๋ชจ๋ ํธ๋ฆฌ๊ฑฐ์ ๋ํด ์๋ํฉ๋๋ค(๋๋ ๋นํ์ฑํํ์ง ์์ผ๋ ค๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฏธ๋ฆฌ "๊ต์ฒด"ํด์ผ ํจ). ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ํ์ํ๋ค๋ฉด ํ๋์ ํน์ ํธ๋ฆฌ๊ฑฐ๋ฅผ "๋๊ธฐ"?
์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ๋์์ด ๋ ๊ฒ์
๋๋ค
ํ์ฅ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋ฉ๋๋ค. SQL์ ์ ์ฒด ๊ฐ์ฒด ์ด๋ฆ๊ณผ ์ ์ฌํ๊ฒ ํ์ฅ ์ด๋ฆ ๋ค์ ์ ๊ณผ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ด ์ต๋๋ค. ์: plpgsql.variable_conflict.
์ ์ ํ ํ์ฅ ๋ชจ๋์ ๋ก๋ํ์ง ์๋ ํ๋ก์ธ์ค์์ ์์คํ ์ธ๋ถ ์ต์ ์ ์ค์ ํ ์ ์์ผ๋ฏ๋ก PostgreSQL์ ๋ ๊ฐ์ง ๊ตฌ์ฑ ์์๊ฐ ์๋ ๋ชจ๋ ์ด๋ฆ์ ๊ฐ.
๋จผ์ ๋ค์๊ณผ ๊ฐ์ด ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ง๋ฌด๋ฆฌํฉ๋๋ค.
BEGIN
-- ะฟัะพัะตััั ะบะพะฝะฒะตััะฐัะธะธ ะผะพะถะฝะพ ะดะตะปะฐัั ะฒัะต
IF current_setting('mycfg.my_table_convert_process') = 'TRUE' THEN
IF TG_OP IN ('INSERT', 'UPDATE') THEN
RETURN NEW;
ELSE
RETURN OLD;
END IF;
END IF;
...
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ด๊ฒ์ ์ฐจ๋จํ์ง ์๊ณ "์ด์ต์ ์ํด" ์ํํ ์ ์์ต๋๋ค. CREATE OR REPLACE
ํธ๋ฆฌ๊ฑฐ ๊ธฐ๋ฅ์ ์ํด. ๊ทธ๋ฐ ๋ค์ ํน์ ์ฐ๊ฒฐ์์ "์ฐ๋ฆฌ" ๋ณ์๋ฅผ ์ฝํนํฉ๋๋ค.
SET mycfg.my_table_convert_process = 'TRUE';
UPDATE ...;
SET mycfg.my_table_convert_process = ''; -- ะฒะตัะฝัะปะธ ะฒ ะธัั
ะพะดะฝะพะต ัะพััะพัะฝะธะต
๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๊น? ์๊ฒฌ์ ๊ณต์ ํ์ญ์์ค.
์ถ์ฒ : habr.com