Хэрэглэгч:Muug1: Засвар хоорондын ялгаа

Content deleted Content added
Хуудас үүсгэв: "== Процедур == '''Stored procedure''' гэдэг нь жижигхэн хэмжээний програмыг хэлдэг бөгөөд ганцхан Select..."
 
No edit summary
Мөр 1: Мөр 1:
== Процедурын талаар ==
== Процедур ==
'''Stored procedure''' гэдэг нь жижигхэн хэмжээний програмыг хэлдэг бөгөөд ганцхан Select командаас эхлээд олон мянган мөр кодтой байж болдог.
'''Stored procedure''' гэдэг нь жижигхэн хэмжээний програмыг хэлдэг бөгөөд ганцхан Select командаас эхлээд олон мянган мөр кодтой байж болдог.
Процедурыг ашиглан хүснэгтэд бичлэг нэмэх, устгах, SELECT, UPDATE , Insert into гэх мэт өгөгдлийн санд хийдэг бүх үйлдлийг бичиж болохоос гадна мөн давталтуудыг хийж болно. Курсор ашиглаж хүснэгт бүрийн бичлэг, мөрүүдэд хандах мөн үйлдэл хийх боломжтой болдог.
Процедурыг ашиглан хүснэгтэд бичлэг нэмэх, устгах, SELECT, UPDATE , Insert into гэх мэт өгөгдлийн санд хийдэг бүх үйлдлийг бичиж болохоос гадна мөн давталтуудыг хийж болно. Курсор ашиглаж хүснэгт бүрийн бичлэг, мөрүүдэд хандах мөн үйлдэл хийх боломжтой болдог.

08:08, 19 Дөрөвдүгээр сар 2017-ий байдлаарх засвар

Процедурын талаар

Stored procedure гэдэг нь жижигхэн хэмжээний програмыг хэлдэг бөгөөд ганцхан Select командаас эхлээд олон мянган мөр кодтой байж болдог. Процедурыг ашиглан хүснэгтэд бичлэг нэмэх, устгах, SELECT, UPDATE , Insert into гэх мэт өгөгдлийн санд хийдэг бүх үйлдлийг бичиж болохоос гадна мөн давталтуудыг хийж болно. Курсор ашиглаж хүснэгт бүрийн бичлэг, мөрүүдэд хандах мөн үйлдэл хийх боломжтой болдог.

Ерөнхий бичигдэх хэлбэр:

DELIMITER $$
CREATE PROCEDURE Procedure_Name()
BEGIN 

	(давталт болон өгөгдлийн санд хийж болдог бүх үйлдлүүдийг хийж болно.)

END $$
DELIMITER;

Процедурыг ашигласнаар:

Өгөгдлийн сангийн боловсруулалтыг маш хурдан болгох боломжтой бөгөөд процедураар дамжуулж параметрүүдийг авч болдог.

Процедурыг устгахдаа:

DROP PROCEDURE Procedure_Name;

Процедурыг устгахдаа утга(аргумент) байгаа эсэхийг үл хамаарна. Анхааруулга: () хаалт бичих шаардлагагүй.

Процедурыг дуудахад:

Ямар нэгэн аргумент авдаггүй бол
CALL Procedure_name;
Ямар нэгэн аргумент авдаг бол	
CALL 
	Procedure_name(‘argument_name’);

Хувьсагч зарлах:

Var_name DATATYPE(size);
DEFAULT def_value;

Тайлбар:

       DATATYPE - төрөл
       size - хэмжээ
       DEFAULT def_value - хувьсагчид утга олгоно

Хувьсагчид утга олгоход:

DECLARE Var_name DATATYPE(size);
SET Var_name = value;

Тайлбар:

Set – гэсэн түлхүүр үгийн тусламжтай хувьсагчид утга олгох.

Жишээлбэл:

	DECLARE count int DEFAULT 0;
	SET count = 25;

Параметр ашиглах:

Параметр ашиглан програмын үр дүнд гарсан хувьсагчийг дахин ашигладаг. Параметрийн гурван төрөл байдаг.

in – Процедур луу утга дамжуулдаг. Тухайн процедур дотроо хүчинтэй.

out – Процедур дотор өөрчлөгдсөн үр дүнг авна.

inout – Процедурт хадгалагдсан утгаа өөрчилж буцаадаг.

Триггер

Триггертэй ажиллах

isql нь триггер болон алдааг үүсгэх, өөрчлөх, устгах боломжтой.

Триггерийг байгуулах

Триггерийг CREATE TRIGGER командаар байрлуулах бөгөөд тэр нь толгой (header) болон их бие (body) гэсэн хоёр хэсгээс бүрдэнэ.

Триггерийн толгой нь дараах зүйл агуулна :
1. Мэдээллийн санд давтагдашгүй триггерийн нэр
2. Триггерт холбоотой хүснэгтийн нэр
3. Триггер ажиллах үйлдлийн нэр
4. Локал хувьсагчуудыг нэр ба тодорхойлолтууд
5. BEGIN, END оператораар хязгаарлагдсан командууд. Командууд нь триггерийн хийх үйлдлүүдийг заана. Их бие нь дотроо өөр блок хэрэглэж 
    болох ба блокуудын үеийн тоог маш олон байж болно.

Чухал

Триггер доторх командуудыг цэг таслалаар хязгаарладаг болохоор триггер өөрийг нь хязгаарлах өөр тэмдэгт оруулах шаардлагатай. isql -д үүний тулд CREATE TRIGGER-ын өмнө SET TERM команд хэрэглэж хязгаарлагч тэмдэгтийг өөрчилдөг. Триггерийн их бие дууссаны дараа дахин SET TERM хэрэглэж хязгаарлагчийн хэвийн байдалд (цэг таслал)-д оруулна.

Триггерийг байгуулах синтакс

CREATE TRIGGER name FOR table
[ACTIVE | INACTIVE]
{BEFORE | AFTER}  {DELETE | INSERT | UPDATE}
[POSITION number]
AS
<trigger_body>

<trigger_body> = 
[<variable_declaration_list>]
<block>

<variable_declaration_list> =
DECLARE VARIABLE variable datatype;
[DECLARE VARIABLE variable datatype; . . .]

<block> =
BEGIN
<compound_statement>
[<compound_statement> . . .]
END

<compound_statement> =
{<block> | statement;}
Триггерийг байгуулах командын аргумент
Аргумент Тайлбар
name Триггерийн нэр. Мэдээллийн сандаа давтагдашгүй байна
table Триггерийг тодорхойлсон хүснэгт буюу харах хүснэгтийн нэр
ACTIVE or INACTIVE Трансакцийн төгсгөлд триггерийн хийх үйлдлийг заана:

ACTIVE: (суурь-default) Триггер биелэгдэнэ

INACTIVE: Триггер биелэгдэхгүй

BEFORE or AFTER Заавар байх ёстой. Триггерийн ажиллах мөчийг заана:

BEFORE: заасан явдлын (үйлдлийн) өмнө

AFTER: заасан явдлын (үйлдлийн) дараа

DELETE or INSERT or UPDATE Триггер ажиллах явдал (үйлдэл)
POSITION number Адил триггерүүдийн биелэгдэх дэс дарааллын дугаар.

number - 0-оос 32767-гийн хоорондох тоо. Бага дугаартай триггер эхэлж биелэгдэнэ. Суурь (default) утга нь 0 (тэг) - хамгийн түрүүнд нь ажиллана.

Ижил нөхцөлтэй, адилхан дугаартай триггерүүд санамсаргүй дарааллаар биелэгдэнэ.

DECLARE VARIABLE

var <datatype>

Триггерт ашиглагдах локал хувьсагчууд. Хувьсагч болгоны

өмнө DECLARE VARIABLE командыг бичиж цэг таслалаар

хооронд нь хязгаарлана.

var - локал хувьсагчийн нэр. Триггер дотроо давтагдашгүй.

<datatype> - хувьсагчийн төрөл

statement InterBase-ын процедур ба триггерийн хэлний команд.

BEGIN, END хоёроос бусад командууд цэг таслалаар хязгаарлагдана

terminator SET TERM командаар заасан триггерийн төгсгөлийг

тодорхойлсон тэмдэг. Зөвхөн isql ашиглана.

InterBase-ын процедур ба триггерийн хэл

InterBase-ын процедур ба триггерийн хэл нь хадгалдаг процедур болон триггер бичихэд зориулагдсан програмчлалын төгс хэл юм. Хэл нь дараах зүйлээс бүрдэнэ:

SQL-ын мэдээллийн боловсруулах командууд : INSERT, UPDATE, DELETE ганцаарчилсан (дан-singleton) SELECT.

SQL-ын оператор болон илэрхийлэл, хэрэглэгчийн тодорхойлсон мэдээллийн сервер болон генераторуудын холбоос.

SQL- хэлний бүхэл бололцоо : утга авх оператор, нөхцөл, шалгуурт операторууд, контекстийн хувьсагчууд, event боловсруулах командууд, алдааны командууд.

Хадгалдаг процедур, триггер хоёр өөр өөр үүрэг зорилготой хэдий ч хоёулаа энэ хэлийг ашигладаг. Харин процедур ба триггерийн хэлийг хэрэглэхдээ дараах хязгаарлалттай: Триггерийн хувьд контекстийн хувьсагчууд (context variables) давтагдашгүй байх ёстой

Хадгалдаг процедурын хувьд хариу эргүүлж өгдөг SUSPEND, EXIT командууд, оролт, гаралтын параметрүүд давтагдашгүй байна.

Процедур ба триггерийн хэлний өргөтгөлүүд (extension)
Комманд Тайлбар
BEGIN . . . END Нэгэн зэрэг хийгдэх командуудыг заана. BEGIN үг нь

хэсгийн эхлэлийг заана, END нь - төгсгөл бөгөөд энэ хоёр үгийн хооронд командуудыг цэг-таслалаар хязгаарлаж бичнэ.

variable = expression Утга авх команд нь expression-ны утгыг variable-д өгнө.

variable нь локал хувьсагч, оролт, гаралтын параметр.

/* comment_text */ Програмистын бичсэн тайлбар, comment_text нь дурын

тооны мөрөөс бүрдэж болно.

EXCEPTION exception_name Exception-ыг дуудна. Exception нь хэрэглэгчийн

тодорхойлсон алдаа бөгөөд WHEN командад хэрэглэгдэнэ.

EXECUTE PROCEDURE

proc_name [var[,var...]]

[RETURNING_VALUES var[,var]]

proc_name нэртэй хадгалдаг процедурыг нэрийн дараа

заасан оролтын параметртэй ажиллуулж,

RETURNING_VALUES -д заасан гаралтын параметрүүдийг

буцааж өгнө. Оролт, гаралтын параметрүүд давтагдаж

болохгүй. Үндсэн (nested) процедур болон рекурс ашиглаж болно.

FOR <select_statement> DO

<compound statement>

<select_statement>-д заасан мөр болгонд DO-гийн дараах үйлдлийг хийнэ.

<select_statement> нь ердийн SELECT команд бөгөөд

INTO дэд командыг сүүлийн мөрөндөө заавал агуулж байх ёстой.

<compound statement> Нэг команд буюу BEGIN, END - ээр хязгаарласан хэсэг команд
IF (<condition>) THEN <compound statement>

[ELSE <compound statement>]

<condition> нөхцөлийн шалгаад зөв бол THEN-ны дараах командыг биелүүлнэ. Буруу бол, хэрвээ ELSE үг байвал түүний дараах командыг хийнэ.

<condition> нь логик илэрхийлэл (TRUE, FALSE, UNKNOWN), ихэнхдээ хоёр оператораас бүрдэнэ

NEW.column INSERT ба UPDATE командад баганын шинэ утгыг илэрхийлсэн контекстийн хувьсагч.
OLD.column UPDATE ба DELETE командад баганын хуучин утгыг илэрхийлсэн контекстийн хувьсагч.
POST_EVENT event_name event_name нэртэй event-ыг дуудна
NEW.column INSERT ба UPDATE командад баганын шинэ утгыг илэрхийлсэн контекстийн хувьсагч.
WHILE (<conditon>) DO

<compound statement>

<condition> -нд заасан илэрхийлэл зөв (TRUE) байгаа нөхцөлд

DO-гийн дараачийн командыг илэрхийлэл буруу болтол биелүүлнэ.

SET TERM -ыг isql -д ашиглах

Триггерийн команд болгон цэг таслалаар хязгаарлагддаг болохоор триггерийг өөрийн хязгаарладаг тэмдэгт хэрэгтэй болно. iql -д үүний тулд CREATE TRIGGER командын өмнө SET TERM гэдэг үгийг хэрэглэж хязгаарлагчийг өөр тэмдэгтээр солино. Триггер дууссаны дараа дахин SET TERM -ыг ашиглан хязгаарлагчийг буцааж цэг таслал болгоно. SET TERM энэ хоёр үгний хооронд ёул зай байх ёстой. SET TERM -ыг өөрийн хэрэглэж байгаа (current) тэмдэгтээр хязгаарлана.

Триггер дахь синтакс (үг, үсгийн) алдаанууд

CREATE TRIGGER - командад үг үсгийн алдаа байвал InterBase нь энэ тухай мэдээлнэ.

Жишээ

Statement failed, SQLCODE = -104
Dynamic SQL Error
-SQL error code = - 104
-Token unknow - line 4, char 9
-tmp

Мөрний дугаар нь командын файлын эхлэлээс биш гагцхүү CREATE TRIGGER командын эхлэлээс хойших дугаар.

Триггерийн толгой

CREATE TRIGGER командын AS операторын өмнө орсон бүх зүйл нь триггерийн толгой юм. Толгой нь заавал триггерийн нэр, холбогдох хүснэгтийн юм уу харах хүснэгтийн нэртэй байна. Хүснэгт буюу харах хүснэгт нь триггерээс өмнө байгуулагдсан байх ёстой. Дараахь операторууд нь триггерыг ажиллах нөхцөл, мөчийг тодорхойлно:

Триггерийн статус ACTIVE, INACTIVE триггерийг ажиллах эсэхийг заана. Суурь статус нь ACTIVE - триггер нөхцөл мөч нь бий болсон үед биелэгдэнэ. Туршилтын үед ALTER TRIGGER -аар статусыг INACTIVE болгож болно.

Триггерийн биелэгдэх мөч BEFORE, AFTER нь триггерийг хэзээ ажиллах вэ гэдгийг заана. BEFORE нь үйлдлийн өмнө хийгдэнэ, AFTER нь үйлдлийн дараа.

Триггерийн үйлдэл INSERT, DELETE, UPDATE нь триггер ямар үйлдэл болоход ажиллах вэ гэдгийг заана. Дээрх гурван үйлдлийн аль нэг нь заавал заагдсан байх ёстой. Нэг үйлдэл дээр олон өөр нэртэй триггер байж болно.

Биелэгдэх дэс дарааллын дугаар POSITION number гэдэг нь адил үйлдэл дээр тодорхойлогдсон триггерүүдийн эхэлж ажиллах дарааллыг заана. Дугаар нь 0-оос 32767 хүртэл бүхэл тоо, суурь утга нь тэг, бага дугаартай триггер эхэлж ажиллана, адил дугаартай триггерүүд санамсаргүй дарааллаар ажиллана.

Доорх жишээнд дарааллын дугаарыг яаж заахыг үзүүлнэ
CREATE TRIGGER A FOR ACCOUNTS BEFORE UPDATE POSITION 5 AS . . .
CREATE TRIGGER B FOR ACCOUNTS BEFORE UPDATE POSITION 0 AS . . .
CREATE TRIGGER C FOR ACCOUNTS AFTER  UPDATE POSITION 5 AS . . .
CREATE TRIGGER D FOR ACCOUNTS AFTER  UPDATE POSITION 3 AS . . .

Триггерийн их бие

CREATE TRIGGER командын AS операторын хойно орсон бүх зүйлийг триггерийн их бие гэнэ. Их бие нь BEGIN ба END -н хооронд байрласан InterBase-ын процедур ба триггерийн хэлний командуудаас бүрдэнэ.

InterBase-ын процедур ба триггерийн хэлний онцлог командууд нь :

Утга өгөх команд (локал хувьсагчуудад утга өгнө)

Нөхцөлт командууд - IF . . . THEN, WHILE . . . DO, FOR SELECT . . . DO

Хадгалдаг процедур дуудах EXECUTE PROCEDURE команд

Алдааны мэдээлэл өгдөг, алдаа боловсруулдаг тодорхой алдаа заадаг WHEN команд

Баганын хуучин ба шинэ утгыг илэрхийлэх NEW ба OLD контекстийн хувьсагч.

Давтагдашгүй утга гаргах генератор.

Тайлбар

Контекстийн хувьсагчаас бусад бүх командуудыг триггер болон процедурын аль алинд нь хэрэглэнэ.

“Хадгалдаг процедуртай ажиллах”-аас дэлгэрэнгүй харна уу?

NEW and OLD Context variable
NEW and OLD Context variable

Триггер нь контекстийн хоёр хувьсагч ашигладаг NEW ба OLD. NEW нь INSERT ба UPDATE командад баганын шинэ утгыг илэрхийлсэн контекстийн хувьсагч, OLD нь UPDATE ба DELETE командад баганын хуучин утгыг илэрхийлсэн контекстийн хувьсагч юм.

  • Контекстийн хувьсагчийн синтакс
NEW.column
OLD.column

column нь дурын баганын нэр. Контекстийн хувьсагчийг ердийн хувьсагчийн хэрэглэхтэй адил.

Баганын шинэ утгыг зөвхөн үйлдлийн өмнө өөрчилж болно. Хэрвээ триггер INSERT-ын дараа (AFTER) гэж тодорхойлогдсон бол NEW-ийн утгыг өөрчлөх нь ямар нөлөө үзүүлэхгүй. Доорх жишээнд EMPLOYEE хүснэгтийн триггер нь өөрчлөлт орсны дараа шинэ ба хуучин утгуудын жишээ байна. Хэрвээ salary баганад өөрчлөлт орсон бол SALARY_HISTORY хүснэгтэд бичилт нэмнэ.

SET TERM !! ;
CREATE TRIGGER SAVE_SALARY_CHANGE FOR EMPLOYEE
AFTER UPDATE AS
BEGIN
IF (OLD.salary <> NEW.salary) THEN
INSERT INTO SALARY_HISTORY
(EMP_NO,CHANGE_DATE,UPDATER_ID,OLD_
SALARY,PERCENT_CHANGE)
VALUES (OLD.emp_no, now, USER, OLD.salary,
 (NEW.salary - OLD.salary) * 100 / OLD.salary);
END !!
SET TERM ; !!

Тайлбар: SQL-ын командаас бусад тохиолдолд контекстийн хувьсагчид цэг тэмдэгтийг ашиглахгүй.

Генераторыг ашиглах

Генератор гэдэг нь дуудах бүрт автоматаар нэмэгддэг GEN_ID() функц юм. Генераторыг процедур, триггертэй төстэй application-уудад хэрэглэдэг ба unique баганын утгуудыг гаргадаг триггерт голчлон ашигладаг. Генераторыг CREATE GENERATOR ашиглаж үүсгээд SET GENERATOR -аар тохируулдаг. Тохируулга хийгээгүй бол генераторын утга 0-с эхэлнэ. “Language Reference”-с дэлгэрүүлж үзнэ үү. GEN_ID() функцээр генераторыг дуудахаас өмнө CREATE GENERATOR -аар үүсгэсэн байх хэрэгтэй. Синтакс: GEN_ID(genname, step) genname - генераторын нэр step - генераторын утгыг нэмэгдүүлэх алхам, бүхэл тоо байж болохоос гадна бүхэл тоо гаргадаг илэрхийлэл байж болно. Дараах жишээнд CUSTOMER хүснэгтэд утга нэмэхээс(insert) өмнө шинэ үйлчлүүлэгчийн дугаарыг гаргахад GEN_ID() функцийг ашиглаж байна:

SET TERM !!;
CREATE TRIGGER SET_CUST_NO FOR CUSTOMER
BEFORE INSERT AS
BEGIN
     NEW.cust_no = GEN_ID(CUST_NO_GEN, 1);
END!!
SET TERM ;!!

Триггерийг өөрчлөх

Триггерийг өөрчлөхдөө ALTER TRIGGER ашиглана. Триггерийг зөвхөн үүсгэсэн хүн өөрчилнө. ALTER TRIGGERS ашиглаж зөвхөн дараах зүйлүүдийг өөрчилж болно:

  • Зөвхөн толгой (Энд: event, триггерийн дугаар, trigger activation status)
  • Зөвхөн их бие (AS -аас хойш орсон)
  • Толгой ба их бие . Энэ тохиолдолд хуучин мэдээлэл нь шинэ мэдээллээр солигдоно.

Триггерийн толгойг өөрчлөх

Триггерийн толгойг өөрчлөхдөө ALTER TRIGGER -ийн триггерийн нэрийн дараа ганц өөрчлөлтийг бичнэ. Илүү байгаа өөрчлөлтүүдийг хийхгүй.

Эхлээд триггерийг идэвхгүй болгоно:

ALTER TRIGGER SAVE_SALARY_CHANGE INACTIVE;

Триггерийн их биеийг өөрчлөх

Триггерийн биеийг өөрчлөхдөө хуучин их бие шинэ тодорхойлолтоор солигдоно. Триггерийн зөвхөн их биеийг өөрчлөх бол ALTER TRIGGER -т триггерийн нэрээс өөр толгойн ганц ч мэдээллийг агуулаагүй байх ёстой.

Триггерийн их биеийг өөрчлөхдөө: Мэдээлэл агуулсан файлыг (data definition file) хуулж хадгална. Үүнтэй адилаар ISQL - extract командаар триггерийг мэдээллийн сангаас файл руу задална. CREATE -г ALTER болгож триггерийн нэр ба AS -н хооронд орших толгойн мэдээллийг арилгана.

Дараах жишээнд SET_CUST_NO триггерийн их биеийг өөрчилж, шинэ үйлчлүүлэгч бүрийн мэдээллийг NEW_CUSTOMER хүснэгтэд нэмдэг болгож байна.

SET TERM !!;
ALTER TRIGGER SET_CUST_NO
BEFORE INSERT AS
BEGIN
      new.cust_no = GEN_ID(CUST_NO_GEN, 1)
      INSERT INTO NEWCUSTOMER(new.cust_no, TODAY)
END!!
SET TERM ;!!

Триггерийг устгах

Триггерийг бүрмөсөн (permanently) устгахдаа DROP TRIGGERS ашиглана. Триггерийг устгахад дараах хязгаарлалтууд байдаг: Триггерийг үүсгэсэн хүн л устгаж болно. Хэрэглэгдэж байгаа триггерийг устгаж чадахгүй. Триггерийг түр зуур арилгах (temporarily remove) шаардлагатай бол ALTER TRIGGER -ийн INACTIVE -г ашиглах хэрэгтэй.

Триггерийг устгах синтакс
DROP TRIGGER name;

name нь оршин байгаа триггерийн нэр. Жишээ:

DROP TRIGGER SET_CUST_NO;

Санамж: CHECK дотор хэрэглэгдэж байгаа триггерийг (a system-defined trigger) устгаж чадахгүй. ALTER TABLE ашиглаж CHECK -г өөрчил.

Триггерийг ашиглах

Триггер нь янз бүрийн зорилгоор ашиглаж болох хүчтэй хэрэгсэл юм. Триггерийг ашиглах янз бүрийн тохиолдлууд байна: Хамааралтай өөрчлөлтүүд хийх. (Correlated updates). Жишээ нь мэдээллийн сан буюу хүснэгтийн өөрчлөлтийн log файл үүсгэх Хүснэгтэд зөвхөн зөв өгөгдлийг оруулах хязгаарлалт хийх. Event ашиглаж мэдээллийн сангийн өөрчлөлтийн талаар мэдээлэх Шат дараалсан өөрчлөлтүүдийг хийх (cascading referencial integrity updates)

Триггер нь хадгалагдсан процедур, exception -уудын адилаар мэдээллийн сангийн нэг хэсэг болон хадгалагдана.ACTIVE байдалд байгаа бол устгах(DROP TRIGGER), идэвхгүй болгох(ALTER TRIGGER INACTIVE) хүртэл идэвхтэй байсаар байна. 

Триггерийг шууд дууддаггүй. Тухайн хүснэгтэд тухайн үйлдэл (action) болох үед триггер автоматаар ажиллана.

  • Анхаар: Тухайн нэг триггер нь өөрийгөө ажиллуулах үйлдэл хийдэг- эсвэл өөрийг нь ажиллуулдаг өөр триггерийг ажиллуулах үйлдэл хийдэг бол төгсгөлгүй үргэлжилсэн үр дүн гарна. Ийм учраас шаардлагагүй бол триггерийн үйлдэл нь өөр триггерийг ажиллуулах нөхцөл болохгүй байх нь чухал юм.

Триггер ба транзакци

Триггер нь үйлдэл хийх үедээ программын транзакцийн контексттэй ажилладаг. Триггер нь дуудаж буй программын (calling program) ажлын нэг хэсэг нь болно. Хэрэв триггер нь транзакцид ажилладаг бол транзакц дууссаны дараа триггерийн үйлдэл мөн дуусна.

Триггер ба нууцлал

Триггер нь процедур ба хэрэглэгчийн нэгэн адилаар хүснэгтийг ашиглах эрхтэй байна. Гэхдээ GRANT TO username гэж бичихийн оронд TO TRIGGER trigger_name гэж бичнэ. REVOKE мөн адил.

Хэрэглэгч триггерийг ажиллуулах үйлдэл хийхэд:

  • триггер тухайн үйлдлийг хийх эрхтэй бол
  • хэрэглэгч тухайн үйлдлийг хийх эрхтэй бол гэсэн тохиолдлуудад триггер үйлдлийг хийх эрхтэй байна.

Жишээ нь: Хэрэв нэг хэрэглэгч A хүснэгт дээр UPDATE хийдэг ба В хүснэгтэд INSERT хийдэг триггерийн ажиллах нөхцөл болдог бол хэрэглэгч INSERT хийх эрхтэй тохиолдолд л триггер нь INSERT хийх эрхтэй болно. Триггер тухайн үйлдлийг хийх эрхгүй бол Interbase SQLCODE алдааны дугаарыг буцаана. Триггер нь WHEN командын тусламжтайгаар алдааг боловсруулж болно. Хэрэв алдааг боловсруулдаггүй бол application -д алдааны мэдээлэл очих ба триггерийн үйлдэл хийгдэхгүй.

Триггерээр event үүсгэх

Триггер нь мэдээллийн санд өөрчлөлт хийгдсэн үед event үүсгэж болно. Жишээ нь:

SET TERM !!;
CREATE TRIGGER POST_NEW_ORDER FOR SALES
AFTER INSERT AS
BEGIN
     POST_EVENT new_order;
END!!
SET TERM;!!
Триггер event-ийн нэрэнд хувьсагч хэрэглэж болно:
POST_EVENT :event_name;

Алдааны мэдээлэл

Exception гэдэг нь хадгалагдсан процедур, триггерээс гарах алдааны мэдээлэл юм. Exception-г CREATE EXCEPTION-аар үүсгэж, ALTER EXCEPTION-аар өөрчилж, DROP EXCEPTION-аар устгана.

  • Хүснэгтэд өөрчлөлт хийхэд хэрэв шинэ цалин нь хуучнаас 50-аас дээш хувиар нэмэгдсэн тохиолдолд гардаг алдааны мэдээлэл байж болох юм. Жишээ нь:
New salary exceeds old by more than 50%. Cannot update record.
  • Чухал: Процедур, триггерийн адилаар exception нь мэдээллийн санд үүс ч, хадгалагдах ба мэдээллийн сангийн аль ч процедур, триггерт ашиглагдаж болно. Exception-г триггерт ашиглахаас өмнө мэдээллийн санд үүс ч, хадгалагдсан байх ёстой.

Триггер дотор алдааны мэдээлэл гаргах

Триггер дотор алдааны мэдээлэл гаргахдаа дараах синтакстай бичнэ:
EXCEPTION name;

name - мэдээллийн сан дээр оршин байгаа алдааны мэдээлэл. Алдааны мэдээлэл гаргахад: Триггерийн үйлдлийг буцааж, ажиллагааг зогсооно. Триггерийг ажиллуулж буй application-д алдааны мэдээллийг буцаана. Хэрэв ISQL командаар триггерийг ажиллуулсан бол дэлгэцэн дээр алдааны мэдээлэл гарна.

  • Чухал: WHEN командаар алдааг боловсруулдаг бол дээрхээс арай ялгаатай байна.

Триггер дотор алдааг боловсруулах

Триггер дотор алдаа, алдааны мэдээллийг WHEN командаар боловсруулж болно. Алдааны мэдээллийг WHEN командаар боловсруулдаг бол application-д мэдээлэл буцахгүй ба триггерийн үйл ажиллагааг заавал таслах албагүй юм. Триггерийн алдааны боловсруулалт (error handling) нь хадгалагдсан процедуртай адилхан ажиллана: WHEN хүртэл хийгдсэн үйлдлүүд нь буцах (undone) бөгөөд WHEN команд ажиллана.

MSSQL датабаазын хүснэгт дээр триггер бичих

  • Insert Trigger
CREATE TRIGGER trigger_insert1
ON table1
FOR INSERT
AS
BEGIN
UPDATE table2
    SET field_total = field_total + inserted.field_name1
END
  • Update Trigger
CREATE TRIGGER trigger_update1
ON table1
INSTEAD OF UPDATE
AS
BEGIN
SELECT t1.*, i.* FROM table1 t1
    JOIN inserted i ON t1.field_id = i.field_id
END
  • Delete Trigger
CREATE TRIGGER trigger_delete1
ON table1
FOR DELETE
AS
BEGIN
INSERT INTO logTableName
    SELECT * FROM deleted
END
  • Trigger Event

deleted - DELETE trigger үед дата нь deleted гэсэн хүснэгт хэлбэрээр байна.

inserted - INSERT, UPDATE trigger үед дата нь inserted гэсэн хүснэгт хэлбэрээр байна.

  • Trigger Time

FOR DELETE – Устгахаас өмнө

FOR INSERT – Нэмэхээс өмнө

FOR UPDATE – Засахаас өмнө

FOR INSERT, UPDATE – Нэмж, Засахаас өмнө

AFTER DELETE – Устгасны дараа

AFTER INSERT – Нэмсний дараа

AFTER UPDATE – Зассаны дараа

AFTER INSERT, UPDATE – Нэмж, Зассаны дараа

INSTEAD OF DELETE – Устгахын оронд

INSTEAD OF INSERT – Нэмэхийн оронд

INSTEAD OF UPDATE – Засахын оронд

INSTEAD OF INSERT, UPDATE – Нэмж, Засахын оронд

Виртуаль хүснэгт

View гэдэг бол SQL тайлангийн үр дүнгийн олонлог дээр суурилсан виртуал хүснэгт юм. View нь бодит хүснэгт шиг мөр ба баганын өгөгдлүүдээс бүрдэнэ. Хүснэгтэд өгөгдөл хадгалж байхад view шаардлагууд хадгалж өгөгдлүүдийг хэрэгцээтэй үед татаж байдагт эдгээрийн гол ялгаа оршино. View нь өгөгдлийн санд нэг буюу хэд хэдэн бодит хүснэгтүүдээс бүрддэг. SQL VIEW үүсгэж, өөрчилж, устгаж болдог. Үүний бичиглэл болон жишээнүүдийг харна уу.

Виртуаль хүснэгт үүсгэх бичиглэл:

CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
  • Тайлбар: View үргэлж сүүлийн үеийн мэдээллийг харуулж байна. Өөрөөр хэлбэл өөрчлөгдөж(update) байна гэсэн үг юм.

Виртуаль хүснэгт үүсгэх жишээ

CREATE VIEW [Current Product List] AS
SELECT ProductID, ProductName
FROM Products
WHERE Discontinued = No;

Дараах байдлаар кверигээ шалгаж болно

SELECT * FROM [Current Product List];

Виртуаль хүснэгтийг өөрчлөх бичиглэл:

CREATE OR REPLACE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

Виртуаль хүснэгтийг өөрчлөх жишээ

CREATE OR REPLACE VIEW [Current Product List] AS
SELECT ProductID, ProductName, Category
FROM Products
WHERE Discontinued = No;

Виртуаль хүснэгтийг устгах бичиглэл:

DROP VIEW view_name;

Ашигласан материал

1. https://docs.microsoft.com/en-us/sql/t-sql/statements/create-procedure-transact-sql

2. https://www.mssqltips.com/sqlservertutorial/161/creating-a-simple-stored-procedure/

3. https://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html

4. https://www.w3schools.com/sql/sql_view.asp