18-4.SQL ServerÀÇ Æ®¸®°Å

1.Æ®¸®°Å »ý¼º

SQL ServerÀÇ Æ®¸®°Åµµ ¿À¶óŬÀÇ Æ®¸®°Å¿Í °³³äÀ̳ª »ç¿ë ¸ñÀûÀº °ÅÀÇ °°°í Á¦°øÇÏ´Â ±â´Éµµ ºñ½ÁÇÏ´Ù. ÀÌÂÊ¿¡ ÀÖ´Â ±â´ÉÀº °á±¹ ÀúÂÊ¿¡µµ ÀÖÀ» ¼ö¹Û¿¡ ¾ø´Ù. ±×·¯³ª Çü½ÄÀÌ ´Ù¸£´Ù º¸´Ï ±¸¹®»óÀÇ Â÷ÀÌ°¡ ÀÖ°í ±â´ÉÀÇ ¹üÀ§µµ ¾à°£¾¿ ´Ù¸£´Ù.

ÀÌ¹Ì ¿À¶óŬ Æí¿¡¼­ Æ®¸®°ÅÀÇ °³³ä°ú Á¾·ù, »ç¿ë ½Ç½ÀÀ» ´Ù ÇØ º» »óÅÂÀ̹ǷΠ°¡±ÞÀû °°Àº ¿¹Á¦·Î ¶È°°Àº ½Ç½ÀÀ» ÇØ º¸ÀÚ. ¿ä¾àÀûÀ¸·Î Á¤¸®ÇÏ¸ç ±â´ÉÀûÀÎ Â÷ÀÌÁ¡ À§ÁÖ·Î ¾Ë¾Æº¸¹Ç·Î ¿À¶óŬÀÇ Æ®¸®°Å¸¦ ¸ÕÀú ¾Ë¾Æ¾ß SQL ServerÀÇ Æ®¸®°Å¸¦ ÀÌÇØÇÒ ¼ö ÀÖ´Ù. Æ®¸®°Å¸¦ Á¤ÀÇÇÏ´Â ±âº» Çü½ÄÀº ´ÙÀ½°ú °°´Ù.

 

CREATE TRIGGER À̸§

ON { Å×À̺í | ºä }

[WITH ENCRYPTION]

{ FOR | AFTER | INSTEAD OF } { INSERT, UPDATE, DELETE }

AS

º»Ã¼

 

¿À¶óŬÀº AFTER UPDATE ON tCity¼øÀε¥ ºñÇØ SQL Server´Â ON tCity AFTER UPDATE ¼øÀÌ´Ù. ¹®Àå Æ®¸®°Å, Çà Æ®¸®°Å ±¸ºÐÀº ¾ø°í BEFORE Æ®¸®°Åµµ ¾øÀ¸¸ç INSTEAD OF°¡ ±× ¿ªÇÒÀ» ´ë½ÅÇÑ´Ù. FOR´Â AFTER¿Í µ¿ÀǾîÀÌ´Ù. ¿©·¯ À̺¥Æ®¸¦ µ¿½Ã¿¡ ÁöÁ¤ÇÒ ¶§´Â ÄÞ¸¶·Î ±¸ºÐÇÑ´Ù.

Çì´õ¿Í º»¹® »çÀÌ¿¡ AS Å°¿öµå°¡ ÀÖ¾î º»Ã¼ÀÇ BEGIN END´Â »ý·«Çصµ ¹«¹æÇÏÁö¸¸ ¹üÀ§¸¦ ¸íÈ®È÷ Çϱâ À§ÇØ ºí·ÏÀ» °¨½Î´Â °ÍÀÌ ÁÁ´Ù. WITH ENCRYPTION ¿É¼ÇÀº Æ®¸®°Å º»¹®À» ¾ÏȣȭÇÏ¿© ÀúÀåÇÑ´Ù. tCity Å×ÀÌºí º¯°æ¿¡ ´ëÇÑ Æ®¸®°Å´Â ´ÙÀ½°ú °°´Ù.

 

CREATE TRIGGER TR_Message

ON tCity AFTER UPDATE

AS

BEGIN

    PRINT('µµ½Ã Á¤º¸¸¦ °»½ÅÇÏ¿´½À´Ï´Ù.');

END;

 

tCity Å×À̺íÀ» °»½ÅÇÒ ¶§ È£ÃâµÇ¾î ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù. ´ÙÀ½ ¸í·ÉÀ¸·Î Æ®¸®°Å°¡ Àß È£ÃâµÇ´ÂÁö Å×½ºÆ®ÇØ º¸ÀÚ.

 

UPDATE tCity SET popu = popu + 1 WHERE name = '¼­¿ï';

UPDATE tCity SET popu = popu + 1 WHERE region = '°æ±â';

 

¼­¿ïÀÇ Àα¸¸¦ Áõ°¡½ÃÅ°¸é TR_Message°¡ È£ÃâµÈ´Ù. °æ±âµµÀÇ µµ½Ã µÑÀ» ÇѲ¨¹ø¿¡ º¯°æÇصµ Æ®¸®°Å´Â ÇÑ ¹ø¸¸ È£ÃâµÇ¸ç ¸Þ½ÃÁöµµ ÇÑ ¹ø¸¸ Ãâ·ÂÇÑ´Ù. Çà Æ®¸®°Å°¡ µû·Î ¾ø°í ¸í·É Çϳª¿¡ ´ëÇØ Æ®¸®°Å¸¦ ÇÑ ¹ø È£ÃâÇÏ´Â ½ÄÀÌ´Ù. Æ®¸®°Å º»¹®¿¡¼­´Â ´ÙÀ½ Àӽà Å×À̺í°ú ÇÔ¼ö·Î º¯°æ »ç½ÇÀ» ¾Ë¾Æ³½´Ù.

 

Å×À̺í, ÇÔ¼ö

¼³¸í

inserted Å×À̺í

INSERT, UPDATE½Ã º¯°æµÈ ÈÄÀÇ ·¹ÄÚµåÀÌ¸ç ¾î¶² ·¹Äڵ尡 »ðÀԵǾú´ÂÁö, ·¹Äڵ尡 ¾î¶»°Ô ¹Ù²î¾ú´ÂÁö ¾Ë ¼ö ÀÖ´Ù.

deleted Å×À̺í

DELETE, UPDATE½Ã »èÁ¦ ¶Ç´Â º¯°æ ÀüÀÇ ·¹ÄÚµåÀ̸ç Äõ¸®¹® ½ÇÇàÀüÀÇ ·¹Äڵ带 ¾Ë ¼ö ÀÖ´Ù.

UPDATE ÇÔ¼ö

ƯÁ¤ ¿­ÀÌ º¯°æµÇ¾ú´ÂÁö Á¶»çÇÑ´Ù. DELETE ¸í·ÉÀº ƯÁ¤ ¿­¸¸ »èÁ¦ÇÏ´Â ±â´ÉÀÌ ¾ø¾î ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù.

COLUMNS_UPDATED ÇÔ¼ö

º¯°æµÈ ¿­ÀÇ ºñÆ® ¸¶½ºÅ©À̸ç ÇÏÀ§ ºñÆ®ºÎÅÍ Ã¹ ¹ø° Çʵå¿Í ´ëÀÀÇÑ´Ù.

 

inserted, deleted´Â ¿À¶óŬÀÇ NEW, OLD¿¡ ÇØ´çÇ쵂 ¿À¶óŬÀº ·¹ÄÚµå Çϳª¸¦ Àü´ÞÇϴµ¥ ºñÇØ SQL Server´Â ¿©·¯ ·¹Äڵ带 Æ÷ÇÔÇÑ Å×À̺íÀ̶ó´Â Á¡ÀÌ ´Ù¸£´Ù. µÎ Àӽà Å×ÀÌºí¿¡ ¾î¶² Á¤º¸°¡ ÀúÀåµÇ´ÂÁö Æ®¸®°Å º»¹®¿¡¼­ ´ýÇÁÇØ º¸ÀÚ. Æ®¸®°Å¸¦ ¼öÁ¤ÇÒ ¶§´Â DROP ÈÄ ´Ù½Ã ¸¸µé°Å³ª ¾Æ´Ï¸é ALTER TRIGGER ¸í·ÉÀ» »ç¿ëÇÑ´Ù.

 

ALTER TRIGGER TR_Message

ON tCity AFTER UPDATE

AS

BEGIN

     SELECT * FROM deleted;

     SELECT * FROM inserted;

END;

 

º¯¼ö¸¦ °æÀ¯ÇÒ ÇÊ¿ä ¾øÀÌ SELECT ¸í·ÉÀ» ¹Ù·Î ¾µ ¼ö ÀÖ¾î °á°ú È®ÀÎÀÌ Æí¸®ÇÏ´Ù. ÀÌ Æ®¸®°Å¸¦ ¼³Ä¡ÇØ ³õÀº »óÅ¿¡¼­ °æ±âµµ µµ½ÃÀÇ Àα¸¼ö¸¦ º¯°æÇÏ¸é µÎ Å×À̺íÀÌ °á°úâ¿¡ ³ªÅ¸³ª¸ç º¯°æÇÑ ¸ðµç ·¹Äڵ尡 ±â·ÏµÇ¾î ÀÖ´Ù.

deleted Å×ÀÌºí¿¡´Â ¿ø·¡ Àα¸¼ö°¡ ÀÖ°í inserted Å×ÀÌºí¿¡´Â º¯°æµÈ Àα¸¼ö°¡ ÀÖ´Ù. ¿À¶óŬÀÇ Çà Æ®¸®°Å´Â ·¹ÄÚµå Çϳª¾¿ Àü´ÞÇϴµ¥ ºñÇØ SQL Server´Â ¸ðµç ·¹Äڵ带 Åë°·Î Àü´ÞÇÏ¿© º¯°æ ³»¿ªÀ» ÇÑ ¹ø¿¡ ¾Ë ¼ö ÀÖ´Ù. Æ®¸®°Å¿¡¼­ °¢ µµ½ÃÀÇ Àü, ÈÄ Àα¸¸¦ Ãâ·ÂÇØ º¸ÀÚ.

 

ALTER TRIGGER TR_Message

ON tCity AFTER UPDATE

AS

BEGIN

     SELECT name, popu, ' => ', (SELECT popu FROM inserted WHERE name = D.name) FROM deleted D;

END;

 

¿¬°ü ¼­ºêÄõ¸® Çϳª·Î ½±°Ô ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. ·¹Äڵ庰·Î Æ®¸®°Å°¡ ¹ß»ýÇÏÁö ¾Ê¾Æ ÁýÇÕÀûÀ¸·Î ´Ù·ç¾î¾ß ÇÏ´Â ºÎ´ãÀÌ ÀÖÁö¸¸ ¸ð¾Æ¼­ ÀÏ°ý ó¸®ÇÒ ¼ö ÀÖ¾î ¼º´É»ó À¯¸®ÇÏ´Ù.

ON tCity AFTER INSERT, UPDATE, DELETE ½ÄÀ¸·Î µ¿½Ã¿¡ ¿©·¯ °³ÀÇ À̺¥Æ®¸¦ ¹ÞÀ» ¶§´Â Àӽà Å×ÀÌºí¿¡ ·¹Äڵ尡 ÀÖ´ÂÁö Á¡°ËÇØ º¸¸é ¾î¶² À̺¥Æ®°¡ ¹ß»ýÇß´ÂÁö ¾Ë ¼ö ÀÖ´Ù. inserted¿¡¸¸ ÀÖÀ¸¸é »ðÀÔÇÑ °ÍÀÌ°í deleted¿¡¸¸ ÀÖÀ¸¸é »èÁ¦ÇÑ °ÍÀÌ¸ç ¾çÂÊ ´Ù ÀÖÀ¸¸é °»½ÅÇÑ °ÍÀÌ´Ù.

Æ®¸®°Å¸¦ »èÁ¦ÇÒ ¶§´Â DROP TRIGGER ¸í·ÉÀ» »ç¿ëÇÑ´Ù. ´õ ÀÌ»ó À̺¥Æ®¸¦ ¹ÞÀ» ÇÊ¿ä°¡ ¾ø´Ù¸é Á¦°ÅÇÏ¿© ½Ã½ºÅÛ ºÎ´ãÀ» ´ú¾îÁÖ´Â °ÍÀÌ ÁÁ´Ù. ÀϽà ÁßÁö¸¸ ÇØ ³õÀ» ¶§´Â ´ÙÀ½ ¸í·ÉÀ» »ç¿ëÇÑ´Ù.

 

ALTER TABLE Å×À̺íÀ̸§

{ ENABLE | DISABLE } TRIGGER ( Æ®¸®°Å À̸§ | ALL }

 

ALLÀº Å×À̺íÀÇ ¸ðµç Æ®¸®°Å¸¦ ÁßÁöÇϸç À̸§À» ÁöÁ¤Çϸé ÇØ´ç Æ®¸®°Å¸¸ ÁßÁöÇÑ´Ù. ´ÙÀ½ ¸í·ÉÀ» ½ÇÇàÇÑ ÈÄ tCity¸¦ ¾÷µ¥ÀÌÆ®ÇÏ¸é ´õ ÀÌ»ó ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏÁö ¾Ê´Â´Ù.

 

ALTER TABLE tCity DISABLE TRIGGER TR_Message;

 

DISABLE¸¦ ENABLE·Î ¹Ù²Ù¸é Æ®¸®°Å°¡ ´Ù½Ã È°¼ºÈ­µÈ´Ù.

2.Æ®¸®°Å¿Í ¹«°á¼º

Æ®¸®°Å´Â º¯È­ÀÇ ¸ðµç ³»¿ªÀ» ´Ù µé¿©´Ù º¼ ¼ö ÀÖ´Ù´Â Á¡¿¡¼­ ¹«°á¼ºÀ» ÁöÅ°´Â ÃÖÈÄÀÇ º¸·çÀÌ´Ù. ´ÙÀ½ Æ®¸®°Å´Â 1¾ï ÃÊ°ú Àα¸¼ö¸¦ °ÅºÎÇÑ´Ù.

 

ALTER TRIGGER TR_Message

ON tCity AFTER UPDATE

AS

BEGIN

     IF (SELECT popu FROM inserted) > 10000

     BEGIN

          PRINT('Àα¸°¡ 1¾ïÀ» ³ÑÀ» ¼ö´Â ¾ø½À´Ï´Ù.');

          ROLLBACK;

     END

END;

 

Á¶°ÇÀÌ ¸ÂÁö ¾ÊÀ» °æ¿ì ·Ñ¹éÇØ ¹ö¸®¸é ±×¸¸ÀÌ´Ù. ¼­¿ï Àα¸¸¦ 12345·Î °»½ÅÇϸé Áï½Ã °ÅºÎÇÑ´Ù. ¿À¶óŬÀº Æ®¸®°Å¿¡¼­ Æ®·£Àè¼ÇÀ» ´Ù·ê ¼ö ¾ø¾î ¿¹¿Ü¸¦ ´øÁ®¾ß ÇÏÁö¸¸ SQL ServerÀÇ Æ®¸®°Å´Â ±× ÀÚü°¡ Æ®·£Àè¼ÇÀ̾ Ãë¼Ò °¡´ÉÇÏ´Ù. ´ÙÀ½ Æ®¸®°Å´Â ÃÖ¾¾ÀÇ ÀԻ縦 °ÅºÎÇÑ´Ù.

 

CREATE TRIGGER TR_PreventChoi

ON tStaff AFTER INSERT

AS

IF EXISTS (SELECT * FROM inserted WHERE name LIKE 'ÃÖ%')

BEGIN

     PRINT 'ÃÖ°¡´Â ¾ÈµÇ!';

     ROLLBACK TRANSACTION;

END

 

»õ·Î »ðÀÔÇÑ »ç¿øÀÇ Á¤º¸¸¦ Á¶»çÇÏ¿© À̸§ÀÌ ÃÖ·Î ½ÃÀÛÇÏ´Â »ç¶÷ÀÌ ÀÖÀ¸¸é ·Ñ¹éÇÏ¿© Àüü¸¦ »ðÀÔ °ÅºÎÇÑ´Ù. °ÅºÎÇÏ´Â ´ë½Å ƯÁ¤ÇÑ °ªÀ¸·Î °­Á¦ º¯°æÇÏ·Á¸é »ðÀÔÇÑ ·¹Äڵ带 ã¾Æ ¿øÇÏ´Â °ªÀ¸·Î °»½ÅÇØ ¹ö¸®¸é µÈ´Ù. ´ÙÀ½ Æ®¸®°Å´Â ÃÖ¾¾¸¦ ÀÔ·ÂÇÏ¸é ±è¾¾·Î º¯°æÇÑ´Ù.

 

ALTER TRIGGER TR_PreventChoi

ON tStaff AFTER INSERT

AS

BEGIN

     UPDATE tStaff SET name = '±è' + SUBSTRING(name, 2, LEN(name) - 1) WHERE name LIKE 'ÃÖ%';

END

 

INSTEAD OF Æ®¸®°Å´Â ¿À¶óŬ°ú »ç¿ë ¸ñÀûÀÌ °°´Ù. ÁÖ·Î ºä¿¡ ´ëÇØ »ç¿ëÇÏ¸ç ºä¿¡ ÀÔ·ÂÇÑ Á¤º¸¸¦ °¢ Å×ÀÌºí¿¡ ºÐ¹èÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. vCarMaker ºä¸¦ »ý¼ºÇÑ ÈÄ ´ÙÀ½ Æ®¸®°Å¸¦ Á¤ÀÇÇÑ´Ù.

 

CREATE TRIGGER TR_AddNewCar

ON vCarMaker INSTEAD OF INSERT

AS

BEGIN

     INSERT INTO tCar (car, capacity, price, maker) SELECT car, capacity, price, maker FROM inserted;

     INSERT INTO tMaker (maker, factory, domestic) SELECT maker, factory, domestic FROM inserted;

END

 

inserted Å×À̺íÀÇ Á¤º¸¸¦ tCar¿Í tMaker·Î °ñ°í·ç ºÐ¹èÇÏ¿© ³ª´©¾îÁØ´Ù. ¿ø·¡ÀÇ Äõ¸®´Â ½ÇÇàÇÏÁö ¾Ê°í µÎ °³ÀÇ Äõ¸®¸¦ ´ë½Å ½ÇÇàÇÑ´Ù.

3.Áßø Æ®¸®°Å

´ÙÀ½ Æ®¸®°Å´Â ¼îÇθôÀÇ ¼öÇè»ý ½ÅÀÔ È¸¿ø¿¡ ´ëÇØ ¿¹Ä¡±ÝÀ» µÎ ¹è·Î ´Ã·Á ÁØ´Ù.

 

CREATE TRIGGER TR_DoubleMoney

ON tMember AFTER INSERT

AS

DECLARE @name CHAR(20)

DECLARE @age INT

SELECT @name = member, @age = age FROM inserted;

IF @age = 18

     UPDATE tMember SET money = money * 2 WHERE member = @name;

 

AFTER Æ®¸®°Å¸¦ ¹Þ¾ÒÀ¸¹Ç·Î ·¹Äڵ带 ÀÌ¹Ì »ðÀÔÇÑ ÈÄÀÌ´Ù. ÀÌ »óÅ¿¡¼­ inserted Å×ÀÌºí¿¡¼­ À̸§°ú ³ªÀ̸¦ Á¶»çÇÏ¿© 18¼¼ ¼öÇè»ýÀ̸é UPDATE ¸í·ÉÀ¸·Î ÇØ´ç ȸ¿øÀÇ ¿¹Ä¡±ÝÀ» µÎ ¹è·Î ´Ã·Á ÁØ´Ù. INSERT Æ®¸®°Å¿¡¼­ UPDATE ¸í·ÉÀ» ó¸®ÇÏ¿´À¸¹Ç·Î ÁßøÀÌ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ Æ®¸®°Å¸¦ Á¤ÀÇÇØ º¸ÀÚ.

 

CREATE TRIGGER TR_MoneyChange

ON tMember

AFTER UPDATE

AS

DECLARE @name CHAR(20)

IF UPDATE(money)

BEGIN

     SELECT @name = member FROM inserted;

     PRINT @name + 'ÀÇ ¿¹Ä¡±ÝÀÌ °»½ÅµÇ¾ú½À´Ï´Ù. ºÎÁ¤ÀÌ ¾Æ´ÑÁö È®ÀÎÇØ º¸½Ê½Ã¿À';

END;

 

½ÅÀÔ È¸¿øÀÌ µé¾î ¿À¸é INSERT Æ®¸®°Å°¡ ¹ß»ýÇÏ¸ç ¼öÇè»ýÀÏ °æ¿ì ¿¬À̾î UPDATE Æ®¸®°Å°¡ ¹ß»ýÇÑ´Ù. SQL Server´Â µðÆúÆ®·Î 32´Ü°è±îÁö ÁßøÀ» Çã¿ëÇÏÁö¸¸ Àç±Í´Â Çã¿ëÇÏÁö ¾Ê´Â´Ù. Áßø Çã¿ëÀº ¼­¹öÀÇ nested triggers ¿É¼ÇÀ¸·Î, Àç±Í Çã¿ëÀº µ¥ÀÌÅͺ£À̽ºÀÇ recursive triggers ¿É¼ÇÀ¸·Î Á¶Á¤ÇÑ´Ù.

DDL Æ®¸®°Å´Â ¼­¹ö³ª µ¥ÀÌÅͺ£À̽ºÀÇ À̺¥Æ®¿¡ ´ëÇØ ¹ß»ýÇÑ´Ù. ´ÙÀ½ Æ®¸®°Å´Â ¸ðµç ¼­¹ö¿¡¼­ µ¥ÀÌÅͺ£À̽º°¡ »ý¼º ¹× Æı«µÇ´Â ½ÃÁ¡À» °¨ÁöÇÑ´Ù.

 

CREATE TRIGGER NewDataBase

ON ALL SERVER

AFTER CREATE_DATABASE, DROP_DATABASE

AS

PRINT '»õ·Î¿î DB°¡ »ý¼º ¶Ç´Â Æı«µÇ¾ú½À´Ï´Ù.';

 

¿øÇÑ´Ù¸é ÇØ´ç µ¿ÀÛÀ» ÇÏÁö ¸øÇϵµ·Ï ·Ñ¹éÇϰųª »õ·Î »ý¼ºÇÑ DB¿¡ ´ëÇÑ ÃʱâÈ­ ÀÛ¾÷À» ÇÒ ¼öµµ ÀÖ´Ù. ´ÙÀ½ ¸í·ÉÀ¸·Î »õ·Î¿î µ¥ÀÌÅͺ£À̽º¸¦ »ý¼ºÇß´Ù°¡ Æı«ÇØ º¸ÀÚ.

 

CREATE DATABASE NewDB

DROP DATABASE NewDB

 

µÎ ¹ø ¸ðµÎ ¸Þ½ÃÁö°¡ Ãâ·ÂµÈ´Ù. DDL Æ®¸®°Å¸¦ »èÁ¦ÇÒ ¶§´Â À̸§»Ó¸¸ ¾Æ´Ï¶ó Æ®¸®°ÅÀÇ ¹üÀ§µµ ÁöÁ¤ÇØ¾ß ÇÑ´Ù.

 

DROP TRIGGER NewDataBase ON ALL SERVER

 

ÀÌ·¸°Ô ÇÏ¸é ¿ø·¡´ë·Î µ¹¾Æ¿Â´Ù. ÀÏ¹Ý °³¹ßÀÚ°¡ DDL Æ®¸®°Å¸¦ ¾µ °æ¿ì´Â ÈçÄ¡ ¾ÊÀ¸¸ç °¡±ÞÀûÀ̸é Á¦¾à Á¶°ÇÀ» ÅëÇØ »ç°í¸¦ ¹æÁöÇÏ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù.