Skip to main content

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ต์ฐฉ ์ƒํƒœ ๋˜๋Š” ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ

Copilot Chat๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์ด ๋А๋ฆฌ๊ฑฐ๋‚˜ ์ฐจ๋‹จ๋˜๋Š” ์ฝ”๋“œ๋‚˜ ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…, ํŠนํžˆ ํŠธ๋žœ์žญ์…˜๊ณผ ๊ด€๋ จ๋œ ์ž‘์—…์€ ๋””๋ฒ„๊ทธํ•˜๊ธฐ ์–ด๋ ค์šด ๊ต์ฐฉ ์ƒํƒœ ๋˜๋Š” ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Copilot Chat๋Š” ์ž ๊ธˆ ๋˜๋Š” ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํŠธ๋žœ์žญ์…˜์˜ ์ง€์ ์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž ๊ธˆ ์ „๋žต ์กฐ์ • ๋˜๋Š” ๊ต์ฐฉ ์ƒํƒœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ๋˜๋Š” ๊ต์ฐฉ ์ƒํƒœ ํ•ด๊ฒฐ์— ๋Œ€ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ํ•ญ๋ชฉ

์ด ๋ฌธ์„œ์— ํ‘œ์‹œ๋œ ์‘๋‹ต์€ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. Copilot Chat ์‘๋‹ต์€ ๋น„๊ฒฐ์ •์ ์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋œ ์‘๋‹ต๊ณผ ๋‹ค๋ฅธ ์‘๋‹ต์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒํ˜ธ ์ข…์†์  ํ–‰์—์„œ ๋™์‹œ ์—…๋ฐ์ดํŠธ ๋ฐฉ์ง€

๋‘˜ ์ด์ƒ์˜ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์—์„œ ๋™์ผํ•œ ํ–‰์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€๋งŒ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ์ˆœํ™˜ ๋Œ€๊ธฐ ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ ์‹œ๋‚˜๋ฆฌ์˜ค

๋‹ค์Œ SQL ์กฐ๊ฐ์€ ํ…Œ์ด๋ธ”์˜ ํ•œ ํ–‰์„ ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ, ๋ช‡ ์ดˆ๊ฐ„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋™์ผํ•œ ํ…Œ์ด๋ธ”์˜ ๋‹ค๋ฅธ ํ–‰์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— id = 1 ํ–‰์„ ๋ช‡ ์ดˆ ๋™์•ˆ ์ž ๊ทธ๋ฉด ์ž ๊ธˆ์ด ํ•ด์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ด ์‹œ๊ฐ„ ๋™์•ˆ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋˜์ง€๋งŒ id = 2 ํ–‰์„ ๋จผ์ € ์ž ๊ทธ๊ณ  ํ–‰์„ ์—…๋ฐ์ดํŠธํ•œ ๋‹ค์Œ, id = 1 ํ–‰์„ ์ž ๊ทธ๋ ค๊ณ  ํ•˜๋ฉด ๋‘ ํŠธ๋žœ์žญ์…˜์ด ๋ชจ๋‘ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜์—ฌ ๊ต์ฐฉ ์ƒํƒœ์— ๋น ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

BEGIN TRANSACTION;
UPDATE my_table SET value = 'Some value' WHERE id = 301;
-- Simulate a process taking 5 seconds:
WAITFOR DELAY '00:00:05';
UPDATE my_table SET value = 'Another value' WHERE id = 127;
COMMIT TRANSACTION;

์˜ˆ์ œ ํ”„๋กฌํ”„ํŠธ 1

์ด ํŠธ๋žœ์žญ์…˜์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘๊ธฐ์—์„œ ํŠธ๋žœ์žญ์…˜ ์ฝ”๋“œ๋ฅผ ์„ ํƒํ•œ ๋‹ค์Œ, Copilot Chat์— ๋‹ค์Œ์„ ์š”์ฒญํ•˜์„ธ์š”.

Is this transaction good?

์˜ˆ์ œ ์‘๋‹ต 1

Copilot์€ "SQL ์ฝ”๋“œ์˜ ํŠธ๋žœ์žญ์…˜์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ํ•˜๋ฉด์„œ๋„ ์ž ๊ธˆ ๊ธฐ๊ฐ„, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ, ๋™์‹œ์„ฑ ๋“ฑ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. โ€œํŠธ๋žœ์žญ์…˜์ด ์žฅ๊ธฐ๊ฐ„ ์ž ๊ธˆ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์—ฌ ์ž ์žฌ์ ์œผ๋กœ ์ฐจ๋‹จ ๋˜๋Š” ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.โ€๋ผ๊ณ  ์–ธ๊ธ‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์‘๋‹ต์—๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ˆ˜์ •๋œ ์ฝ”๋“œ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ํ”„๋กฌํ”„ํŠธ 2

๋‹ค์Œ ํ›„์† ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

How can I rewrite this code to reduce the chance of deadlock to a minimum while not adversely affecting performance. Tell me anything else I can do to avoid a deadlock. Note: I don't want to add error handling at this time.

์˜ˆ์ œ ์‘๋‹ต 2

Copilot์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ์–ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์•ก์„ธ์Šค ์ˆœ์„œ: ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์ด ํ…Œ์ด๋ธ”๊ณผ ํ–‰์— ๋™์ผํ•œ ์ˆœ์„œ๋กœ ์•ก์„ธ์Šคํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์„ ์งง๊ฒŒ ์œ ์ง€: ํŠธ๋žœ์žญ์…˜์ด ์ž ๊ธˆ์„ ์œ ์ง€ํ•˜๋Š” ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ ์ ˆํ•œ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ์‚ฌ์šฉ: ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ •๋œ ์ฝ”๋“œ ๋ฒ„์ „์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

BEGIN TRANSACTION;
-- Update the rows in a consistent order
UPDATE my_table SET value = 'Another value' WHERE id = 127;
UPDATE my_table SET value = 'Some value' WHERE id = 301;
-- Simulate a process taking 5 seconds:
WAITFOR DELAY '00:00:05';
COMMIT TRANSACTION;

์ธ๋ฑ์‹ฑ๋˜์ง€ ์•Š์€ ๊ฒ€์ƒ‰ ๋ฐฉ์ง€

์ธ๋ฑ์‹ฑ๋˜์ง€ ์•Š์€ ํ…Œ์ด๋ธ” ์—ด์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ์ „์ฒด ํ…Œ์ด๋ธ” ์Šค์บ”์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋งค์šฐ ๋А๋ฆฌ๊ณ  ๋ฆฌ์†Œ์Šค ์ง‘์•ฝ์ ์ด์–ด์„œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ ์‹œ๋‚˜๋ฆฌ์˜ค

๋‹ค์Œ SQL์—์„œ some_column์ด ์ธ๋ฑ์‹ฑ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์ „์ฒด ํ…Œ์ด๋ธ” ์Šค์บ”์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

BEGIN TRANSACTION;
SELECT * FROM my_table WHERE some_column = 'some_value';
-- More actions here, then:
COMMIT TRANSACTION;

์˜ˆ์‹œ ํ”„๋กฌํ”„ํŠธ

Copilot์—๊ฒŒ ๋‹ค์Œ ์งˆ๋ฌธ์„ ํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๊ฐ€ ๋“œ๋Ÿฌ๋‚˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

How can I optimize this transaction?

์˜ˆ์ œ ์‘๋‹ต

Copilot์€ ๋ช‡ ๊ฐ€์ง€ ์กฐ์–ธ์„ ์ œ๊ณตํ•˜๋ฉฐ ์—ด์„ ์ธ๋ฑ์‹ฑํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜์„ ์ตœ์ ํ™”ํ•˜๋ ค๋ฉด ์ž ๊ธˆ์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋žœ์žญ์…˜์ด ๊ฐ€๋Šฅํ•œ ํ•œ ์งง์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ํŒ์ž…๋‹ˆ๋‹ค.

  1. ํŠธ๋žœ์žญ์…˜์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—… ์ตœ์†Œํ™”: ํŠธ๋žœ์žญ์…˜ ๋‚ด์— ํ•„์š”ํ•œ ์ž‘์—…๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  2. ์ ์ ˆํ•œ ์ธ๋ฑ์Šค ์‚ฌ์šฉ: WHERE ์ ˆ์— ์‚ฌ์šฉ๋œ ์—ด์ด ์ธ๋ฑ์‹ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. ์žฅ๊ธฐ ์‹คํ–‰ ํŠธ๋žœ์žญ์…˜ ๋ฐฉ์ง€: ์ž ๊ธˆ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋žœ์žญ์…˜ ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์‘๋‹ต์˜ ์ œ์•ˆ๋œ ์ฝ”๋“œ์—๋Š” ์—ด์„ ์ธ๋ฑ์‹ฑํ•˜๊ธฐ ์œ„ํ•œ SQL ๋ช…๋ น์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

`CREATE INDEX idx_some_column ON my_table(some_column);`

์žฅ๊ธฐ ์‹คํ–‰ ํŠธ๋žœ์žญ์…˜ ๋ฐฉ์ง€

๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋Š” ์„ฑ๋Šฅ์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ์ €ํ•˜์‹œํ‚ค๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์— ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ๊ธฐ ์‹คํ–‰ ์ฟผ๋ฆฌ ๋ฐ ํŠธ๋žœ์žญ์…˜์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ์™€ ๋กœ๊ทธ ๊ณต๊ฐ„์ด ๋งŽ์ด ์†Œ๋ชจ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€ํ•˜๊ฐ€ ๋†’์€ ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ค๋ฅ˜๊ฐ€ ๋” ์‰ฝ๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ ์‹œ๋‚˜๋ฆฌ์˜ค

๋‹ค์Œ SQL์€ ๋‹ค์–‘ํ•œ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋Š” source_table ํ–‰์˜ ์„ ํƒ๋œ ํ•„๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” target_table์— ์ƒˆ ํ–‰์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. source_table์ด ๋งค์šฐ ํฐ ๊ฒฝ์šฐ ์žฅ๊ธฐ ์‹คํ–‰ ํŠธ๋žœ์žญ์…˜์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

BEGIN TRANSACTION;

INSERT INTO target_table (first_name, last_name, email, dept, role, hire_date)
SELECT first_name, last_name, email, department, job_title, start_date
FROM source_table
WHERE (department = 'Engineering' AND (salary > 95000 OR grade > 5))
  OR (department = 'Marketing' AND performance_rating = 'Excellent');

COMMIT;

์˜ˆ์‹œ ํ”„๋กฌํ”„ํŠธ

์žฅ๊ธฐ ์‹คํ–‰ ํŠธ๋žœ์žญ์…˜์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ Copilot์— ๋ฌธ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

source_table is an extremely large table. Without altering the table, how can I ensure this SQL doesn't become a long-running query, that blocks other operations?

์˜ˆ์ œ ์‘๋‹ต

Copilot์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ „๋žต์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

  • ์ผ๊ด„ ์ฒ˜๋ฆฌ: ๋‹จ์ผ ํฐ ํŠธ๋žœ์žญ์…˜ ๋Œ€์‹  ๋” ์ž‘์€ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ์ œํ•œ ๋ฐ ์˜คํ”„์…‹์ด ์žˆ๋Š” ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์‹ฑ: ์ฟผ๋ฆฌ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด WHERE ์ ˆ์— ์‚ฌ์šฉ๋œ ์—ด(department, salary, grade, performance_rating)์ด ์ธ๋ฑ์‹ฑ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ž ๊ธˆ: ํ–‰ ์ˆ˜์ค€ ์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ํ…Œ์ด๋ธ”์ด ์ž ๊ธฐ์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ผ๊ด„ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด SQL์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— 1000๊ฐœ ํ–‰์˜ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  ์žฅ๊ธฐ ์‹คํ–‰ ํŠธ๋žœ์žญ์…˜์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

DECLARE @BatchSize INT = 1000;
DECLARE @Offset INT = 0;
DECLARE @RowCount INT;

SET @RowCount = @BatchSize;

WHILE @RowCount = @BatchSize
BEGIN
    BEGIN TRANSACTION;

    INSERT INTO target_table (first_name, last_name, email, dept, role, hire_date)
    SELECT first_name, last_name, email, department, job_title, start_date
    FROM source_table
    WHERE (department = 'Engineering' AND salary > 95000)
       OR (department = 'Engineering' AND years_of_experience > 5)
       OR (department = 'Marketing' AND performance_rating = 'Excellent');
    ORDER BY primary_key_column
    OFFSET @Offset ROWS FETCH NEXT @BatchSize ROWS ONLY;

    SET @RowCount = @@ROWCOUNT;
    SET @Offset = @Offset + @BatchSize;

    COMMIT;
END;

Copilot์—์„œ๋Š” ์ œ์•ˆ๋œ ์ฝ”๋“œ์˜ primary_key_column์„ source_table์˜ ์‹ค์ œ ๊ธฐ๋ณธ ํ‚ค ์—ด ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ๋ผ๊ณ  ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ฌธ์ œ ๋ฐฉ์ง€

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ •๋ณด๋Š” ์ •ํ™•ํ•˜๊ณ  ์ผ๊ด€๋˜๋ฉฐ ์™„์ „ํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ œ๋Œ€๋กœ ์„ค๊ณ„๋˜์ง€ ์•Š์€ ์ฟผ๋ฆฌ๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ ์‹œ๋‚˜๋ฆฌ์˜ค

๋‹ค์Œ SQL ํŠธ๋žœ์žญ์…˜์€ ์ง์› ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์‚ญ์ œ ๋กœ๊ทธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ DELETE ์ž‘์—…์€ ์„ฑ๊ณตํ•˜๊ณ  INSERT ์ž‘์—…์€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ์‚ญ์ œ์— ๋Œ€ํ•œ ๋กœ๊ทธ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

BEGIN TRANSACTION;

DELETE FROM employees
WHERE employee_id = 101;

INSERT INTO deletion_log (employee_id, deletion_date, reason)
VALUES (101, GETDATE(), 'Voluntary Resignation');

COMMIT TRANSACTION;

์˜ˆ์‹œ ํ”„๋กฌํ”„ํŠธ

How can I ensure that the DELETE and INSERT operations are only performed if both succeed?

Copilot์—์„œ๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. SQL Server์˜ TRY...CATCH ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

BEGIN TRY
    BEGIN TRANSACTION;

    DELETE FROM employees
    WHERE employee_id = 101;

    INSERT INTO deletion_log (employee_id, deletion_date, reason)
    VALUES (101, GETDATE(), 'Voluntary Resignation');

    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;
    -- Handle the error, e.g., log it or re-throw
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH;

์ œ์•ˆ๋œ ์ฝ”๋“œ๋Š” DELETE ๋˜๋Š” INSERT ์ž‘์—…์ด ์‹คํŒจํ•  ๊ฒฝ์šฐ ํŠธ๋žœ์žญ์…˜์ด ๋กค๋ฐฑ๋˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ฐธ๊ณ  ์ž๋ฃŒ