ms sql сервер дэх триггерүүдийн жишээ. Триггер (мэдээллийн сан). DDL триггер ба тэдгээрийн хэрэглээ

гох:

<Определение_триггера>::= (CREATE | ALTER) TRIGGER trigger_name ON (хүснэгтийн_нэр | харах_нэр) ( ( ( FOR | ДАРААХ | ОРОНД ) ( [ УСТГАХ] [,] [ INSERT] [,] [ ШИНЭЧЛЭХ] ) [ ХАВСРАЛТАЙ ] [ БИШ ХУВИАЛТ ] AS sql_statement[...n] ) | ( ( | ДАРААХ | ОРОНД ) ( [,] ) [ ХАВСРАЛТАЙ] [ ХУВУУЛАХГҮЙ] ШИНЭЧЛЭГДСЭН БОЛ(баганын_нэр) [ (БА | ЭСВЭЛ) UPDATE( баганын_нэр)] [...n] | IF (COLUMNS_UPDATES() (процессын_бит_оператор) бит_маскийг өөрчлөх) (харьцуулах_бит_оператор) бит_маск [...n]) sql_оператор [...n] ) )

Триггерийг зөвхөн одоогийн өгөгдлийн санд үүсгэх боломжтой боловч триггер доторх бусад мэдээллийн санд, тэр дундаа алсын сервер дээр байрлах мэдээллийн санд хандах боломжтой.

CREATE |-ийн аргументуудын зорилгыг харцгаая ӨӨРЧЛӨЛТ ТЭМДЭГЛЭГЧ.

Өгөгдлийн сангийн нэр нь өвөрмөц байх ёстой. Үүнээс гадна та эзэмшигчийн нэрийг зааж өгч болно.

Таныг WITH ENCRYPTION аргументыг зааж өгөх үед сервер гох кодыг шифрлэдэг бөгөөд администратор зэрэг хэн ч түүнд хандах эсвэл унших боломжгүй болно. Шифрлэлт нь программистын оюуны өмч буюу худалдааны нууц болох хувийн мэдээлэл боловсруулах алгоритмыг нуухын тулд ихэвчлэн ашиглагддаг.

Триггерийн төрлүүд

IN SQL серверТриггерүүдийн зан төлөвийг тодорхойлдог хоёр параметр байдаг:

  • ДАРАА. Триггерийг дуудсан командууд амжилттай дууссаны дараа ажиллана. Хэрэв ямар нэг шалтгааны улмаас тушаалуудыг амжилттай гүйцэтгэж чадахгүй бол триггер ажиллахгүй. Хэрэглэгчийн хүсэлтийг гүйцэтгэсний үр дүнд өгөгдлийн өөрчлөлт, триггерийн гүйцэтгэл нь нэг гүйлгээний биед явагддаг гэдгийг тэмдэглэх нь зүйтэй: хэрэв гохыг буцаах юм бол хэрэглэгчийн өөрчлөлтийг мөн үгүйсгэх болно. Та үйлдл бүрийн дараа хэд хэдэн триггерийг тодорхойлж болно (INSERT, UPDATE, DELETE). Хэрэв танд хүснэгтэд олон AFTER триггер байгаа бол та sp_settriggerorder системийн хадгалагдсан процедурыг ашиглан аль триггер эхэлж, аль нь сүүлд ажиллахыг зааж өгч болно. Анхдагч байдлаар, SQL Server-д бүх триггерүүд нь триггерийн дараа байдаг.
  • ОРОНД . Гүйцэтгэх командын оронд гохыг дууддаг. AFTER триггерээс ялгаатай нь ONSTEAD OF триггерийг хүснэгт болон харагдацын аль алинд нь тодорхойлж болно. INSERT, UPDATE, DELETE үйлдэл бүрд зөвхөн нэг ОРНО гохыг тодорхойлж болно.

Триггерүүд нь хариу үйлдэл үзүүлэх командын төрлөөр ялгагдана.

Гурван төрлийн өдөөгч байдаг:

  • INSERT TRIGGER – INSERT командыг ашиглан өгөгдөл оруулах оролдлого хийх үед идэвхждэг.
  • UPDATE TRIGGER – UPDATE командыг ашиглан өгөгдлийг өөрчлөх оролдлого хийх үед идэвхждэг.
  • DELETE TRIGGER – DELETE командыг ашиглан өгөгдлийг устгах оролдлого хийх үед идэвхждэг.

Барилга байгууламж [ УСТГАХ] [,] [ INSERT] [,] [ ШИНЭЧЛЭХ]Тэгээд FOR | ДАРАА | ) ([,]-ийн орондгох ямар тушаалд хариу өгөхийг тодорхойлох. Үүнийг үүсгэх үед дор хаяж нэг командыг зааж өгөх ёстой. Зөвшөөрөгдсөн өдөөгч үүсгэх, хоёр эсвэл бүх гурван тушаалд хариулах.

WITH APPEND нь төрөл бүрийн олон триггер үүсгэх боломжийг олгодог.

At өдөөгч үүсгэхХУУЛГАХГҮЙ аргументын тусламжтайгаар хүснэгтүүдийг хуулбарлах механизмаар өөрчилж байх үед ажиллахыг хориглоно.

AS sql_operator[...n] бүтэц нь өдөөгчийг эхлүүлэх үед гүйцэтгэх SQL хэллэг, командуудын багцыг тодорхойлдог.

Триггер дотор хэд хэдэн үйлдлийг хийхийг хориглоно гэдгийг анхаарна уу, тухайлбал:

  • мэдээллийн сан үүсгэх, өөрчлөх, устгах;
  • сэргээх нөөц хуулбармэдээллийн сан эсвэл гүйлгээний бүртгэл.

Эдгээр командуудыг гүйцэтгэхийг зөвшөөрөхгүй, учир нь гохыг гүйцэтгэсэн гүйлгээг буцаах тохиолдолд буцаах боломжгүй. Энэхүү хориг нь үүсгэсэн триггерүүдийн үйл ажиллагаанд ямар нэгэн байдлаар нөлөөлөхгүй байх магадлалтай. Жишээлбэл, хүснэгтийн мөрийг өөрчилсний дараа гүйлгээний бүртгэлийн нөөцлөлтийг сэргээх шаардлагатай нөхцөл байдлыг олоход хэцүү байдаг.

Триггер програмчлал

Бичлэг нэмэх, өөрчлөх, устгах командуудыг гүйцэтгэх үед сервер нь хоёр тусгай хүснэгт үүсгэдэг. оруулсанТэгээд устгасан. Эдгээр нь гүйлгээ дуусахад оруулах эсвэл устгах мөрүүдийн жагсаалтыг агуулдаг. Оруулсан болон устгасан хүснэгтүүдийн бүтэц нь триггерийг тодорхойлсон хүснэгтүүдийн бүтэцтэй ижил байна. Триггер бүр өөрийн оруулсан болон устгасан хүснэгтүүдийг үүсгэдэг тул өөр ямар ч триггер тэдгээрт хандах боломжгүй. Өдөөгчийг гүйцэтгэхэд хүргэсэн үйлдлийн төрлөөс хамааран оруулсан болон устгасан хүснэгтүүдийн агуулга өөр байж болно.

  • INSERT команд – оруулсан хүснэгт нь хэрэглэгчийн хүснэгтэд оруулахыг оролдсон бүх мөрүүдийг агуулна; устгасан хүснэгтэд нэг мөр байхгүй болно; гох ажиллагаа дууссаны дараа оруулсан хүснэгтийн бүх мөрүүд эх хүснэгт рүү шилжих болно;
  • DELETE команд – устгасан хүснэгт нь хэрэглэгчийн устгахыг оролдсон бүх мөрийг агуулна; гох нь мөр бүрийг шалгаж, устгахыг зөвшөөрсөн эсэхийг тодорхойлох боломжтой; оруулсан хүснэгтэд мөр байхгүй болно;
  • UPDATE командыг гүйцэтгэх үед устгасан хүснэгт нь амжилттай дууссаны дараа устгагдах хуучин мөрийн утгуудыг агуулна.

Сүүлийн шинэчлэлт: 2017 оны 11-р сарын 09-ний өдөр

Триггер гэдэг нь хүснэгт эсвэл харагдац дээр тодорхой үйлдэл хийх, тухайлбал өгөгдөл нэмэх, өөрчлөх, устгах, өөрөөр хэлбэл INSERT, UPDATE, DELETE командуудыг гүйцэтгэх үед автоматаар дуудагддаг хадгалагдсан процедурын тусгай төрөл юм.

Триггерийн албан ёсны тодорхойлолт:

CREATE TRIGGER trigger name ON (хүснэгт_нэр | харах_нэр) (Дараа | ОРОНД) sql_илэрхийлэл

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

Триггер бүр нь тодорхой хүснэгт эсвэл харагдацтай холбоотой бөгөөд тэдгээрийн нэрийг ON гэсэн үгний дараа заасан байдаг.

Дараа нь гох төрлийг тохируулна. Бид хоёр төрлийн аль нэгийг ашиглаж болно:

    ДАРАА: Үйлдэл дууссаны дараа гүйцэтгэнэ. Зөвхөн хүснэгтэд зориулагдсан.

    ОРНО: үйлдлийн оронд гүйцэтгэсэн (энэ нь үнэндээ үйлдэл - нэмэх, өөрчлөх, устгах - огт хийгддэггүй). Хүснэгт болон харагдацад зориулж тодорхойлсон

Триггерийн төрлийн дараа гох нь тодорхойлогдсон үйлдлийн заалт гарч ирнэ: INSERT, UPDATE эсвэл DELETE.

AFTER триггерийн хувьд та үүнийг нэгэн зэрэг хэд хэдэн үйлдэлд ашиглаж болно, жишээ нь UPDATE болон INSERT. Энэ тохиолдолд үйлдлүүдийг таслалаар заана. Та гохын оронд зөвхөн нэг үйлдлийг тодорхойлж болно.

Дараа нь AS гэдэг үгийн дараа SQL илэрхийллийн багц гарч ирдэг бөгөөд энэ нь гохын үндсэн хэсгийг бүрдүүлдэг.

Триггер үүсгэцгээе. Бидэнд дараах тодорхойлолт бүхий productsdb мэдээллийн сан байна гэж бодъё.

ӨГӨГДЛИЙН САН БҮТЭЭГДЭХҮҮН бүтээгдэхүүнdb; GO USE productdb; CREATE TABLE бүтээгдэхүүн (Id INT IDENTITY PRIMARY KEY, Бүтээгдэхүүний нэр NVARCHAR(30) NULL БУС, Үйлдвэрлэгч NVARCHAR(20) NULL, ProductCount INT DEFAULT 0, Үнэ MONEY NULL биш);

Өгөгдөл нэмэх, шинэчлэх үед асах гохыг тодорхойлъё:

productdb-г ашиглах; ОРСОНЫ ДАРАА БҮТЭЭГДЭХҮҮНИЙГ ИНСЕРТ_ШИНЭЧЛҮҮЛЭХ, ШИНЭЧЛЭХ БҮТЭЭГДЭХҮҮНИЙГ ТОХИРУУЛАХ Үнэ = Үнэ + Үнэ * 0.38 ХААНА Id = (СОНГОХ Id FROM оруулсан)

Бүтээгдэхүүний хүснэгтэд бүтээгдэхүүний талаарх мэдээллийг хадгалдаг гэж бодъё. Гэхдээ бүтээгдэхүүний үнэд нэмэгдсэн өртгийн албан татвар, авлигын албан татвар гэх мэт янз бүрийн нэмэлт хураамжууд багтдаг. Өгөгдлийг нэмж байгаа хүн татварын суурьтай эдгээр бүх нарийн ширийн зүйлийг мэдэхгүй байж магадгүй бөгөөд тэр цэвэр үнийг тодорхойлдог. Триггер ашиглан бид бүтээгдэхүүний үнийг тодорхой хэмжээгээр тохируулах боломжтой.

Ингэснээр гох нь Бүтээгдэхүүний хүснэгт дээрх INSERT эсвэл UPDATE үйлдэл дээр ажиллах болно. Өдөөгч нь өөрөө бүтээгдэхүүний үнийг өөрчлөх бөгөөд нэмсэн эсвэл өөрчилсөн бүтээгдэхүүнийг авахын тулд бид энэ бүтээгдэхүүнийг Id-ээр олно. Гэхдээ ийм бүтээгдэхүүний ID ямар утгатай байх ёстой вэ? Баримт нь өгөгдөл нэмэх эсвэл өөрчлөх үед оруулсан завсрын хүснэгтэд хадгалагддаг. Энэ нь автоматаар үүсгэгддэг. Үүнээс бид нэмсэн/өөрчлөгдсөн бүтээгдэхүүний талаарх мэдээллийг авах боломжтой.

Бүтээгдэхүүний хүснэгтэд бүтээгдэхүүн нэмсний дараа бодит байдал дээр бүтээгдэхүүн нь нэмэх үед тодорхойлсон үнээс арай өндөр үнэтэй байх болно.

Өдөөгчийг устгаж байна

Триггерийг арилгахын тулд та DROP TRIGGER командыг ашиглах ёстой:

DROP TRIGGER бүтээгдэхүүнүүдийг_INSERT_UPDATE

Өдөөгчийг идэвхгүй болгож байна

Бид гохыг түр зогсоохыг хүсч байгаа ч үүнийг бүрмөсөн устгахыг хүсэхгүй байна. Энэ тохиолдолд үүнийг DISABLE TRIGGER командыг ашиглан түр идэвхгүй болгож болно:

Бүтээгдэхүүн дээрх TRIGGER Products_INSERT_UPDATE-г ИДЭВЭРЛЭХ

Танд гох хэрэгтэй үед ENABLE TRIGGER командыг ашиглан идэвхжүүлж болно:

Бүтээгдэхүүн дээрх TRIGGER Products_INSERT_UPDATE-г идэвхжүүлнэ үү

Триггернь өгөгдлийн сангийн процедуртай төстэй дэд програм бөгөөд хүснэгтэд бичлэгийг өөрчлөх, устгах, нэмэх үед DBMS автоматаар дуудагддаг. Програмаас триггер рүү хандах, тэдгээрт параметр дамжуулах, үр дүнг хүлээн авах боломжгүй. Ихэнх тохиолдолд өдөөгчийг мэдээллийн сан дахь лавлагааны бүрэн бүтэн байдал, каскадын үйлдлийг хадгалахад ашигладаг. Хүснэгтийг зарлах үед үүсдэг шаталсан устгах, шинэчлэх үйлдлүүдийг тодорхойлдог лавлагааны үзүүлэлтүүдийг мөн триггерээр дамжуулан хэрэгжүүлдэг боловч эдгээр триггерүүдийн текстийг засварлах боломжгүй.

Триггерүүдийн зорилго

Өөрчлөлтөөс урьдчилан сэргийлэх (жишээ нь нэхэмжлэхийг илгээсний дараа өөрчлөхөөс сэргийлэх).
. Өөрчлөлтийг бүртгэх (жишээлбэл, хуучин өгөгдлийн хуулбарыг хадгалах).
. Өөрчлөлтөд аудит хийх (жишээлбэл, өөрчлөлтөд оролцсон хэрэглэгчид болон үүрэг ролийн бүртгэл хөтлөх).
. Өөрчлөлтүүдийг авах (жишээ нь, бүх өөрчлөлтүүд нь үйлчлүүлэгчийнх биш, харин серверийн цагийн дагуу хийгдсэн эсэхийг шалгаарай).
. Бизнесийн дүрмийг хэрэгжүүлэх.
. Өгөгдлийн хуулбар (жишээ нь, дараагийн хувилбарт өөр мэдээллийн сан руу илгээгдэх бүх өөрчлөлтийн бүртгэлийг хадгалах).
. Бүтээмж нэмэгдсэн (жишээлбэл, гүйлгээний дэлгэрэнгүй бүрийн дараа үлдэгдлийг шинэчлэх, асуулга хурдасгах).

Өдөөгчийг зарлах

ТРИГГЕР ҮҮСГЭ {ӨМНӨ| ДАРАА} {УСТГАХ|ОРУУЛАХ|ШИНЭЧЛЭХ [OF ]} АСААЛТТАЙ ЛАВЛАГАА {ХУУЧИН {[ROW]|ХҮСНЭГТ [AS] } ШИНЭ {ROW|ХҮСНЭГТ} [AS] }] [ТУС БҮР {МЭДЭГДЭЛ|МӨН [ХЭЗЭЭ ]}]
[АТОМЫГ ЭХЛҮҮЛЭХ]

[ТӨГСГӨЛ]

Түлхүүр үгс

. ӨМНӨ| ДАРАА– гох эхлэх цаг – өмнө | шинэчлэх үйлдлийн дараа.
. УСТГАХ|ОРУУЛАХ|ШИНЭЧЛЭХ= өдөөгч үйл явдал.
. МӨРӨӨ БҮРТ– мөр бүрийн хувьд (шугам гох, дараа нь ХЭЗЭЭ).
. МЭДЭГДЭЛ БҮРДЭЭ– бүх багийн хувьд (анхдагчаар хүчинтэй).
. ЛАВЛАГАА– хуучин болон |-д 4 хүртэлх нэр өгөх боломжийг танд олгоно эсвэл шинэ мөрүүд болон | эсвэл триггерээр хандах боломжтой хүснэгтүүд.

Триггер хязгаарлалт

Триггер бие нь дараах мэдэгдлийг агуулж болохгүй.
. Өгөгдлийн сангийн объектыг (хүснэгт, домэйн гэх мэт) тодорхойлох, устгах, өөрчлөх.
. Гүйлгээ боловсруулах (COMMIT, ROLLBACK)
. Өгөгдлийн санд холбогдох болон салгах (ХОЛБООТОЙ, ХОЛБООГҮЙ)

Хэрэглээний онцлог
. Триггер нь бусад бүх (мэдэгдэл) бүрэн бүтэн байдлын шалгалтыг хийсний дараа хийгддэг бөгөөд туршилтын шалгуур нь нэлээд төвөгтэй үед хэрэг болно. Хэрэв мэдэгдлийн шалгалтууд шинэчлэлтийн үйлдлээс татгалзвал триггерүүд гүйцэтгэгдэхгүй. Триггер нь гүйлгээний нөхцөлд ажилладаг боловч FK хязгаарлалт нь тийм биш юм.
. Хэрэв гох нь үндсэн хүснэгтэд нэмэлт өөрчлөлт оруулдаг бол энэ нь ихэвчлэн рекурсив гүйцэтгэлд хүргэдэггүй, гэхдээ үүнийг тодруулах хэрэгтэй. SQL Server 2005 нь OPTION (MAXRECURSIV 3) түлхүүр үгийг ашиглан 255 хүртэлх түвшний рекурсийг тодорхойлох боломжийг олгодог.
. Том хоёртын багана (BLOB) боловсруулах үед триггерүүд ихэвчлэн хийгддэггүй.
. Өгөгдлийг шинэчлэх бүрд DBMS нь триггер гэж нэрлэгддэг автоматаар үүсгэдэг гэдгийг санах нь зүйтэй виртуал хүснэгтүүд, өөр өөр DBMS-д өөр өөр нэртэй байдаг. InterBase болон Oracle-д - Эдгээр нь Шинэ ба Хуучин юм. SQL серверт - Оруулсан ба устгасан. Түүнээс гадна өгөгдөл өөрчлөгдөхөд хоёулаа үүсдэг. Эдгээр хүснэгтүүд нь шинэчлэгдсэн хүснэгттэй ижил нэр, домэйнтэй ижил тооны баганатай. SQL Server 2005 DBMS нь OUTPUT Inserted.ID,... INTO @ түлхүүр үгийг ашиглан өгөгдөл оруулах ёстой түр хүснэгтийг багтаасан хүснэгтийг зааж өгөх боломжийг олгодог.
. Хэд хэдэн DBMS-д хэд хэдэн үйлдлийн триггерийг нэгэн зэрэг зарлахыг зөвшөөрдөг. Төрөл бүрийн үйлдэлд янз бүрийн хариу үйлдэл үзүүлэхийн тулд Oracle нь холбогдох төрлийн шинэчлэлтийн хувьд Үнэнийг буцаадаг Устгах, оруулах, шинэчлэх предикатуудыг өгдөг.
. Oracle DBMS дээр та шинэчлэлтийн триггерүүдийн баганын жагсаалтыг (Шинэчилсэний дараа) зааж өгч болох бөгөөд энэ нь зөвхөн эдгээр баганын утгууд өөрчлөгдөх үед триггер дуудагдах болно.
. Триггер үйл явдал бүрт олон триггер зарлаж болно (Oracle-д нэг хүснэгтэд 12 триггер байдаг) ихэвчлэн тэдгээрийг ажиллуулах дарааллыг үүсгэсэн дарааллаар нь тодорхойлдог. InterBase зэрэг зарим DBMS-д эхлүүлэх дарааллыг нэмэлт POSITION түлхүүр үг ашиглан зааж өгдөг. Ерөнхийдөө триггерийг эхлээд команд тус бүрд, дараа нь мөр бүрт гүйцэтгэх ёстой.
. Триггерүүдийг бие биендээ суулгаж болно. Тиймээс SQL Server нь 32 үүрлэх түвшинг зөвшөөрдөг (та үүрлэх түвшинг тодорхойлохын тулд @@NextLevel глобал хувьсагчийг ашиглаж болно).

Триггерүүдийн сул тал

Нарийн төвөгтэй байдал. Мэдээллийн сан дахь өгөгдөл дээр зарим үйлдлийг байрлуулах нь түүнийг зохион бүтээх, хэрэгжүүлэх, удирдахад хүндрэл учруулдаг.
. Далд функциональ байдалхэрэглэгчээс. Зарим функцууд нуугдсан үед програмыг шинэчлэхэд хэцүү байдаг.
. Гүйцэтгэлд үзүүлэх нөлөө. Цөөн тооны өдөөгчтэй бол өгөгдөл боловсруулах хугацаа нэмэгддэг.

Өдөөгчийг засах, устгах

Өдөөгчийг арилгахын тулд DROP TRIGGER мэдэгдлийг ашиглана уу
. Триггерийг өөрчлөхийн тулд ALTER TRIGGER... хэллэгийг ашиглана уу.
. Өдөөгчийг идэвхгүй болгож байна
Зарим тохиолдолд, жишээлбэл, багц ачаалах үед өдөөгчийг идэвхгүй болгох шаардлагатай. Хэд хэдэн DBMS нь холбогдох чадавхийг хангадаг. Oracle болон SQL Server дээр ALTER TRIGGER мэдэгдэлд InterBase-д INACTIVE|ACTIVE гэсэн түлхүүр үгс нь DISABLE|ENABLE байна.

Аж үйлдвэрийн серверүүдийн онцлог

1) InterBase/Firebird

ТРИГГЕР ҮҮСГЭ ТӨЛӨӨ {ИДЭВХТЭЙ|ИДЭВХГҮЙ} {ӨМНӨ| ДАРАА} {INSERT|УСТГАХ|ШИНЭЧЛЭХ} [БАЙРЛАЛ ]
AS [Хувьсагчийг зарлах [()]]
ЭХЛЭХ

ТӨГСГӨЛ

Жишээ:

Үйлчлүүлэгчид зориулсан триггер BF_Del_Cust-ийг бий болгох
1-Р БАЙРЫГ УСТГАХ ӨМНӨ ИДЭВХТЭЙ БАЙНА AS
ЭХЛЭХ
Orders.CNum=Customer.CNum;
ТӨГСГӨЛ;

2) SQL сервер

ТРИГГЕР ҮҮСГЭ АСААЛТТАЙ [ШИНЖИЛГЭЭТЭЙ] {ТӨЛӨӨ|Дараа|ын оронд} {INSERT|ШИНЭЧЛЭХ|Устгах}
AS

B1 АШИГЛАХ;
ЯВ
ОРУУЛСАН, ШИНЭЧЛҮҮЛСЭНИЙ ДАРАА хэрэглэгч дээр InUpCust1-ийг триггер үүсгэх
AS RAISEERROR('Хэрэглэгчийн хүснэгт өөрчлөгдсөн');

Нэмэлт төрлийн өдөөгч

Oracle болон SQL Server нь шинэчлэгдээгүй байгаа харагдацыг триггер үүсгэх (орлуулах) боломжийг олгодог. Энэ зорилгоор түлхүүр үгсийн оронд:

… ГЭЖ ​​ОРУУЛАХЫН ОРОНД ТРИГГЕР ҮҮСГЭ.

Та харагдац ашиглан өгөгдлийг шинэчлэх үйлчлүүлэгчийн оролдлогыг хянах, аливаа үйлдэл хийх, шинэчлэгдээгүй харагдах байдлыг зохицуулах гэх мэт боломжтой.
. SQL Server DBMS нь буцаах триггерээр хангадаг бөгөөд энэ нь бүх үйлдлийг зогсоож, мессеж гаргадаг.

БУЦАХ ТРИГГЕР

“Мэдээллийн сан” хичээлийн лекцийн тэмдэглэл

Сэдэв: Процедур ба өдөөгч хүчин зүйлүүд

(Жишээ нь MS SQL Server ашиглах)

эмхэтгэгч: Л.В.Щеголева

PetrSU, Хэрэглээний математик, кибернетикийн тэнхим

Оршил................................................. ....... ................................................. ............. ......

Өгөгдлийн сангийн бүтцийн тодорхойлолт................................................. ............ ..............

Процедурын тухай ойлголт.................................................. .... .................................................

Процедуртай ажиллах командууд................................................. ................................................

Триггерийн тухай ойлголт................................................ ... ...................................................

Триггертэй ажиллах командууд...................................... ................................................................

Триггерийн хэрэгжилтийн жишээ................................................. ...... ..............

Жишээ 1................................................. ... ...................................................

Жишээ 2................................................. ... ...................................................

Жишээ 3................................................. ... ...................................................

Жишээ 4................................................. ... ...................................................

Жишээ 5................................................. ... ...................................................

PetrSU, Хэрэглээний математик, кибернетикийн тэнхим

Оршил

IN Энэхүү гарын авлагад процедур, триггер үүсгэх командын жишээг өгсөн болно

-тай тэдний ажлын тодорхойлолт.

Бүх тушаалууд нь MS SQL Server синтакс дээр бичигдсэн байдаг.

Бүтэцийг нь тайлбарласан мэдээллийн сангийн жишээнүүдийг өгсөн болно

1-р хэсэг.

PetrSU, Хэрэглээний математик, кибернетикийн тэнхим

1 Өгөгдлийн сангийн бүтцийн тодорхойлолт

tblFaculty хүснэгт нь их сургуулийн факультетуудын талаархи мэдээллийг агуулдаг.

Нэр

Тодорхойлолт

шинж чанар

Факультетийн үнэмлэх

Факультетийн нэр

Деканы бүтэн нэр

Деканы оффисын дугаар

Деканы оффисын утасны дугаар

Факультетийн оюутнуудын тоо

tblStudent хүснэгт нь нэг хичээлийн жилд их сургуулийн оюутнуудын талаарх мэдээллийг агуулдаг.

Аттрибутын нэр

Тодорхойлолт

Оюутны үнэмлэх

Оюутны нэр

Тэтгэлэг

tblGroup хүснэгт нь нэг хичээлийн жилд их сургуулийн оюутны бүлгүүдийн талаарх мэдээллийг агуулдаг.

Аттрибутын нэр

Тодорхойлолт

Бүлгийн ID

Дарга

Бүлгийн дугаар

Тэнхим

tblSubject хүснэгтэд факультетийн оюутнуудын нэг хичээлийн жилд судалсан хичээлүүдийн талаархи мэдээллийг агуулсан болно.

Аттрибутын нэр

Тодорхойлолт

Зүйлийн ID

Зүйлийн нэр

Лекцийн цагийн тоо

Дадлага хийх цагийн тоо

Тэнхим

"Мэдээллийн сан" хичээлийн лекцийн тэмдэглэл (Процедур ба триггерүүд)

PetrSU, Хэрэглээний математик, кибернетикийн тэнхим

tblRoom хүснэгт нь их сургуулийн анги танхимын мэдээллийг агуулдаг.

tblSchedule хүснэгт нь оюутны бүлгүүдийн хуваарийн талаарх мэдээллийг агуулдаг.

Аттрибутын нэр

Тодорхойлолт

Тодорхойлогч

Үзэгчид

Долоо хоногийн өдөр

Багшийн бүтэн нэр

PetrSU, Хэрэглээний математик, кибернетикийн тэнхим

2 Процедурын тухай ойлголт

Процедур гэдэг нь DBMS-ийн дотоод хэлээр бичигдсэн, мэдээллийн санд бие даасан объект хэлбэрээр хадгалагдсан программ юм. Ийм процедурыг ихэвчлэн хадгалагдсан, хавсаргасан процедур гэж нэрлэдэг. Процедурыг програмын програмаар дуудаж болно. Процедурууд нь мэдээллийн сангийн сервер дээр хийгддэг. Процедурууд нь алдааны мэдээг оруулаад параметр болон буцах утгыг агуулж болно.

Процедурыг ашиглахын давуу талууд:

мэдээллийн хандалтын төвлөрсөн хяналт;

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

систем дэх сүлжээний урсгалыг бууруулдагМэдээлэл солилцохын оронд зөвхөн процедурын нэр болон түүний параметрүүдийг дамжуулснаар “клиент-сервер” ба сервер дээр процедурыг гүйцэтгэдэг;

олон функцийг хэрэглэгчээс нууж байна тусгай төхөөрөмжөгөгдлийн бие даасан байдлыг хангадаг мэдээллийн сан;

өгөгдлийн аюулгүй байдлыг сайжруулахын тулд хэрэглэгч дуудлага хийх эрхтэй байж болно

журам боловч энэ журмаар дуудагдсан өгөгдлийг өөрчлөхгүй; Сул тал: журмын хэрэгжилтэд стандарт дутмаг.

PetrSU, Хэрэглээний математик, кибернетикийн тэнхим

MS SQL Server дээрх процедуруудтай ажиллах 3 тушаал

Процедурыг бий болгох

ЖУРАМ ҮҮСГЭ<имя процедуры>

[@<имя параметра> <тип данных> , ...]

ЭХЛЭХ

<операторы>

MS SQL Server дээрх бүх хувьсагчийн нэр тэмдэгтээр эхлэх ёстой

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

ГҮЙЦЭТГЭХ<имя процедуры> [{@<имя переменной> | <значение параметра>}, ...]

Процедурыг арилгах

УНАХ ЖУРАМ<имя процедуры>

Уг процедур нь @id процедурын оролтын параметр болох тэнхимд элссэн оюутны тоог тоолж, @total_sum параметрт энэ утгыг буцаана.

Процедур үүсгэх prStudentsOfFaculty @id int, @total_sum int гаралт AS

@total_sum = 0-г тохируулна уу

@total_sum = (Тооцоог сонгоно уу(*) tblStudent, tblGroup Хаана (tblStudent.GroupId = tblGroup.GroupId) болон (tblGroup.FacultyId = @id)) Төгсгөл

PetrSU, Хэрэглээний математик, кибернетикийн тэнхим

4 Триггерийн тухай ойлголт

Хүснэгтэд гох (дүрэм) хавсаргасан бөгөөд хүснэгтэд шинэчлэлт хийх (хүснэгтийн бичлэг нэмэх, устгах, өөрчлөх) үед мэдээллийн сангийн удирдлагын систем автоматаар дуудагддаг.

MS SQL серверт триггерийг хэрэгжүүлэх онцлог

MS SQL сервер дээр:

гохыг үйлдлийг гүйцэтгэсний дараа эсвэл гүйцэтгэсэн үйлдлийн оронд дуудаж болно;

үйлдлийг гүйцэтгэх ёстой бүх хүснэгтийн бичлэгийн хувьд гох нэг удаа дуудагдана;

Тиймээс, өөрчилсөн бүртгэлүүд нь гохыг дуудах үед автоматаар үүсгэгдэх хоёр хүснэгтэд хадгалагдана.

o Оруулсан хүснэгт – өөрчлөгдсөн эсвэл нэмсэн хүснэгтийн бичлэгүүдийг агуулсан;

o Устгасан хүснэгт – өөрчлөлт хийхээс өмнөх буюу устгагдсан хүснэгтийн бичлэгүүдийг агуулсан;

Insert үйлдэлд тодорхойлсон триггерийн биед зөвхөн хүснэгт боломжтой

Устгах үйлдэлд тодорхойлсон триггерийн биед зөвхөн хүснэгт боломжтой

Шинэчлэх үйлдэлд тодорхойлсон триггерийн биед хоёр хүснэгтийг ашиглах боломжтой

Оруулсан болон устгасан;

Ижил үйл явдалд зориулж хэдэн ч триггер үүсгэж болох бөгөөд тэдгээрийг санамсаргүй дарааллаар дууддаг (магадгүй тэдгээрийг үүсгэсэн дарааллаар нь).

PetrSU, Хэрэглээний математик, кибернетикийн тэнхим

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

Бүтээл

ТРИГГЕР ҮҮСГЭ<имя триггера>АСААЛТТАЙ<имя таблицы>

( FOOR | ДАРААХ | ОРОНД )

[INSERT] [,] [ШИНЭЧЛЭХ] [,] [УСТГАХ] AS

МЭДЭГДЭХ @<имя переменной> <тип данных>, ...

ЭХЛЭХ<операторы>

Устгах

DROP TRIGGER<имя триггера>

PetrSU, Хэрэглээний математик, кибернетикийн тэнхим

6 Триггерийн хэрэгжилтийн жишээ

Сэдвийн талбайн хязгаарлалт:Оюутны тэтгэлгийг өмнөх тэтгэлгийн 5%-иас илүү нэмэгдүүлэх боломжгүй.

TRIGGER tgrStudentGrantUpdate үүсгэх

ШИНЭЧЛСЭНИЙ ДАРАА tblStudent ON

@Grant_old float, @Grant_new float, @Id int;

@Grant_old = Устгагдсанаас Grant сонгоно уу

Оруулсан хэсгээс @Grant_new = Grant, @Id = StudentId-г сонгоно уу

IF (@Grant_new - @Grant_old > 0.05 * @Grant_old)

ШИНЭЧЛЭХ tblStudent SET Грант = 1.05 * @Grant_old

WHERE StudentId = @Id

tblStudent хүснэгтэд tgrStudentGrantUpdate триггер үүсгэгдсэн. Өгөгдлийг өөрчлөх ажиллагаа дууссаны дараа гох асах болно.

IN Триггер нь локал гурван хувьсагчийг тодорхойлдог: хуучин оюутны тэтгэлгийг хадгалах @Grant_old (бодит төрөл), шинэ оюутны тэтгэлгийг хадгалах @Grant_new (бодит төрөл), оюутны танигчийг хадгалах @Id (бүхэл тоон төрөл).

Триггер дуудагдах үед DBMS нь өөрчилсөн бичлэгүүдийг өөрчлөхөөс өмнө агуулсан Устгасан, өөрчлөгдсөний дараа өөрчилсөн бичлэгүүдийг агуулсан Inserted гэсэн хоёр хүснэгтийг үүсгэдэг.

IN Триггерийн үндсэн хэсэгт юуны түрүүнд оюутны тэтгэлгийн утгыг өөрчлөлт оруулахын өмнө Устгасан хүснэгтээс, өөрөөр хэлбэл хуучин тэтгэлэг, дараа нь оюутны тэтгэлгийн утгыг Inserted хүснэгтээс олж авна. өөрчлөлтүүд хийгдсэн, өөрөөр хэлбэл, шинэ тэтгэлэг. Оруулсан хүснэгтээс шинэ тэтгэлэг авахын зэрэгцээ оюутны таних тэмдэгийг мөн татаж авдаг. Оюутны үнэмлэхийг Устгасан хүснэгтээс хялбархан гаргаж авах боломжтой.

Дараа нь триггерийн биед тэтгэлгийн өөрчлөлтийн хэмжээг шалгана. Хэрэв тэтгэлэг 5% -иас дээш өөрчлөгдсөн бол өдөөгч нь өгөгдөлд тохируулга хийдэг - энэ нь оюутны тэтгэлгийн өмнөх дүнтэй харьцуулахад тэтгэлгийг ердөө 5% -иар нэмэгдүүлдэг. Энэ үйлдлийг tblStudent хүснэгтэд харгалзах оюутанд зориулж Update үйлдлийг дуудаж гүйцэтгэнэ.

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

SQL хэлний стандарт дахь триггерийн тодорхойлолт

Триггер нь хадгалагдсан процедурын нэг төрөл юм. Хүснэгт дээр өгөгдөл боловсруулах хэл (DML) оператор ажиллах үед тэдгээрийг гүйцэтгэдэг. Өгөгдлийн бүрэн бүтэн байдлыг шалгах, мөн гүйлгээг буцаах зорилгоор өдөөгчийг ашигладаг.

Триггер нь SQL-ийн эмхэтгэсэн процедур бөгөөд гүйцэтгэл нь доторх тодорхой үйл явдлуудаас шалтгаалдаг. харилцааны суурьөгөгдөл. Өгөгдлийн сангийн хэрэглэгчдэд триггер ашиглах нь ихэнх тохиолдолд маш тохиромжтой байдаг. Гэсэн хэдий ч тэдгээрийг ашиглах нь ихэвчлэн I/O үйл ажиллагаанд нэмэлт нөөцийн зардал шаарддаг. Хадгалсан процедур эсвэл хэрэглээний программуудыг ашиглан ижил үр дүнд (илүү бага зардалтай) хүрэх боломжтой бол триггер ашиглах нь практик биш юм.

Триггерүүд нь өгөгдлийн сангийн мэдээллийн бүрэн бүтэн байдлыг хадгалахад ашигладаг тусгай SQL сервер хэрэгсэл юм. Бүрэн бүтэн байдлын хязгаарлалт, дүрэм журам, өгөгдмөл нь хүссэн функцийн түвшинд үргэлж хүрч чаддаггүй. Тэдний найдвартай байдал, бодит байдлыг хангахын тулд өгөгдлийн баталгаажуулалтын нарийн төвөгтэй алгоритмуудыг хэрэгжүүлэх шаардлагатай байдаг. Нэмж дурдахад заримдаа та хүснэгтийн утгын өөрчлөлтийг хянах хэрэгтэй бөгөөд ингэснээр холбогдох өгөгдлийг шаардлагатай бол өөрчлөх боломжтой болно. Триггерийг дүрэм журам, стандарт утгууд гэх мэт бүх үйлдлийг гүйцэтгэсний дараа хүчин төгөлдөр болох шүүлтүүрийн нэг төрөл гэж үзэж болно.

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

Зөвхөн мэдээллийн сангийн эзэмшигч л гох үүсгэгч үүсгэж болно. Энэхүү хязгаарлалт нь хүснэгтийн бүтцэд санамсаргүй өөрчлөлт хийх, бусад объектыг тэдгээрт холбох арга гэх мэтээс зайлсхийх боломжийг олгодог.

Гох нь маш хэрэгтэй бөгөөд нэгэн зэрэг аюултай хэрэгсэл юм. Тиймээс, хэрэв түүний үйлдлийн логик буруу байвал та мэдээллийн санг бүхэлд нь устгах боломжтой тул триггерийг маш болгоомжтой засах хэрэгтэй.

Тогтмол горимоос ялгаатай нь гох нь тохиолдох бүрдээ далд байдлаар хийгддэг. өдөөгч үйл явдал, үүнээс гадна, энэ нь ямар ч маргаангүй. Үүнийг идэвхжүүлэхийг заримдаа гох асаах гэж нэрлэдэг. Өдөөгчийг ашигласнаар дараах зорилгод хүрнэ.

  • Оруулсан өгөгдлийн үнэн зөвийг баталгаажуулах, хүснэгтэд тавьсан бүрэн бүтэн байдлын хязгаарлалтыг ашиглахад хэцүү, эсвэл боломжгүй бол өгөгдлийн бүрэн бүтэн байдлын нарийн төвөгтэй хязгаарлалтуудыг хэрэгжүүлэх;
  • тодорхой арга замаар хэрэгжсэн хүснэгтийг шинэчлэх үед тодорхой үйлдэл хийхийг сануулсан анхааруулга өгөх;
  • оруулсан өөрчлөлт, түүнийг хийсэн хүмүүсийн талаарх мэдээллийг бүртгэх замаар аудитын мэдээллийг хуримтлуулах;
  • хуулбарлах дэмжлэг.

CREATE TRIGGER командын үндсэн форматыг доор харуулав.

<Определение_триггера>::= ӨМНӨ | ДАРАА<триггерное_событие>АСААЛТТАЙ<имя_таблицы> <тело_триггера>

үйл явдлуудыг өдөөххүснэгтэд мөр оруулах, устгах, шинэчлэхээс бүрдэнэ. Сүүлчийн тохиолдолд өдөөгч үйл явдалТа хүснэгтийн тодорхой баганын нэрийг зааж өгч болно. Өдөөх цагийг ашиглан тодорхойлно түлхүүр үгсӨМНӨ (түүнтэй холбоотой үйл явдлуудыг гүйцэтгэхээс өмнө гохыг асаана) эсвэл ДАРАА (тэдгээрийг гүйцэтгэсний дараа).

Триггерийн гүйцэтгэсэн үйлдлүүд нь тухайн үйл явдалд хамрагдсан мөр бүрт (МӨӨР БҮРД) эсвэл үйл явдал тус бүрд зөвхөн нэг удаа (МӨР БҮРД) тодорхойлогддог.

Зориулалт <список_старых_или_новых_псевдонимов> хуучин эсвэл гэх мэт бүрэлдэхүүн хэсгүүдийг хэлнэ шинэ мөр(ХУУЧИН/ШИНЭ) хуучин эсвэл шинэ ширээ(ХУУЧИН ШИРЭЭ / ШИНЭ ШИРЭЭ). Үйл явдал оруулахад хуучин утгууд, үйл явдлыг устгахад шинэ утгууд хамаарахгүй нь тодорхой байна.

Зөв хэрэглэвэл өдөөгч нь маш хүчирхэг механизм болж чаддаг. Тэдний гол давуу тал нь стандарт функцууд нь мэдээллийн санд хадгалагдаж, шинэчлэгдэх бүрт тогтмол идэвхждэг. Энэ нь програмуудыг ихээхэн хялбарчилж чадна. Гэсэн хэдий ч триггерийн сул талуудыг дурдах нь зүйтэй.

  • нарийн төвөгтэй байдал: зарим функцийг өгөгдлийн санд шилжүүлэхэд түүнийг зохион бүтээх, хэрэгжүүлэх, удирдах ажил илүү төвөгтэй болдог;
  • Далд функц: Зарим функцийг мэдээллийн сан руу зөөж, нэг буюу хэд хэдэн триггер болгон хадгалах нь заримдаа зарим функцийг хэрэглэгчээс нуухад хүргэдэг. Энэ нь түүний үйл ажиллагааг тодорхой хэмжээгээр хялбарчилж байгаа хэдий ч харамсалтай нь энэ нь хүсээгүй, хүсээгүй, хортой гаж нөлөө үүсгэж болзошгүй тул энэ тохиолдолд хэрэглэгч мэдээллийн санд болж буй бүх үйл явцыг хянах боломжгүй болно;
  • Гүйцэтгэлийн нөлөөлөл: Өгөгдлийн сангийн төлөвийг өөрчлөх команд бүрийг гүйцэтгэхийн өмнө DBMS нь гох нөхцөлийг шалгаж, энэ командын хувьд гох асаах эсэхийг тодорхойлох ёстой. Ийм тооцоог хийх нь DBMS-ийн ерөнхий гүйцэтгэлд нөлөөлдөг бөгөөд ачаалал ихтэй үед түүний бууралт ялангуяа мэдэгдэхүйц болдог. Мэдээжийн хэрэг, триггерүүдийн тоо нэмэгдэхийн хэрээр ийм үйл ажиллагаатай холбоотой нэмэлт зардал нэмэгддэг.

Буруу бичигдсэн өдөөгч нь үхсэн түгжээ зэрэг ноцтой асуудалд хүргэдэг. Өдөөгч нь олон нөөцийг удаан хугацаагаар хааж болох тул хандалтын зөрчлийг багасгахад онцгой анхаарал хандуулах хэрэгтэй.

MS SQL Server орчинд триггерүүдийг хэрэгжүүлэх

MS SQL Server DBMS хэрэгжилт нь дараах триггер үүсгэх эсвэл өөрчлөх операторыг ашигладаг:

<Определение_триггера>::= (CREATE | ALTER) TRIGGER trigger_name ON (хүснэгтийн_нэр | харах_нэр) ( ( ( FOR | ДАРААХ | ОРОНД ) ( [ УСТГАХ] [,] [ INSERT] [,] [ ШИНЭЧЛЭХ] ) [ ХАВСРАЛТАЙ ] [ БИШ ХУВИАЛТ ] AS sql_statement[...n] ) | ( ( | ДАРААХ | ОРОНД ) ( [,] ) [ ХАВСРАЛТАЙ] [ ХУВУУЛАХГҮЙ] ШИНЭЧЛЭГДСЭН БОЛ(баганын_нэр) [ (БА | ЭСВЭЛ) UPDATE( баганын_нэр)] [...n] | IF (COLUMNS_UPDATES() (процессын_бит_оператор) бит_маскийг өөрчлөх) (харьцуулах_бит_оператор) бит_маск [...n]) sql_оператор [...n] ) )

Триггерийг зөвхөн одоогийн өгөгдлийн санд үүсгэх боломжтой боловч триггер доторх бусад мэдээллийн санд, тэр дундаа алсын сервер дээр байрлах мэдээллийн санд хандах боломжтой.

CREATE |-ийн аргументуудын зорилгыг харцгаая ӨӨРЧЛӨЛТ ТЭМДЭГЛЭГЧ.

Өгөгдлийн сангийн нэр нь өвөрмөц байх ёстой. Үүнээс гадна та эзэмшигчийн нэрийг зааж өгч болно.

Таныг WITH ENCRYPTION аргументыг зааж өгөх үед сервер гох кодыг шифрлэдэг бөгөөд администратор зэрэг хэн ч түүнд хандах эсвэл унших боломжгүй болно. Шифрлэлт нь программистын оюуны өмч буюу худалдааны нууц болох хувийн мэдээлэл боловсруулах алгоритмыг нуухын тулд ихэвчлэн ашиглагддаг.

Триггерийн төрлүүд

SQL серверт триггерүүдийн үйлдлийг тодорхойлох хоёр сонголт байдаг:

  • ДАРАА. Триггерийг дуудсан командууд амжилттай дууссаны дараа ажиллана. Хэрэв ямар нэг шалтгааны улмаас тушаалуудыг амжилттай гүйцэтгэж чадахгүй бол триггер ажиллахгүй. Хэрэглэгчийн хүсэлтийг гүйцэтгэсний үр дүнд өгөгдлийн өөрчлөлт, триггерийн гүйцэтгэл нь нэг гүйлгээний биед явагддаг гэдгийг тэмдэглэх нь зүйтэй: хэрэв гохыг буцаах юм бол хэрэглэгчийн өөрчлөлтийг мөн үгүйсгэх болно. Та үйлдл бүрийн дараа хэд хэдэн триггерийг тодорхойлж болно (INSERT, UPDATE, DELETE). Хэрэв танд хүснэгтэд олон AFTER триггер байгаа бол та sp_settriggerorder системийн хадгалагдсан процедурыг ашиглан аль триггер эхэлж, аль нь сүүлд ажиллахыг зааж өгч болно. Анхдагч байдлаар, SQL Server-д бүх триггерүүд нь триггерийн дараа байдаг.
  • ОРОНД . Гүйцэтгэх командын оронд гохыг дууддаг. AFTER триггерээс ялгаатай нь ONSTEAD OF триггерийг хүснэгт болон харагдацын аль алинд нь тодорхойлж болно. INSERT, UPDATE, DELETE үйлдэл бүрд зөвхөн нэг ОРНО гохыг тодорхойлж болно.

Триггерүүд нь хариу үйлдэл үзүүлэх командын төрлөөр ялгагдана.

Гурван төрлийн өдөөгч байдаг:

  • INSERT TRIGGER – INSERT командыг ашиглан өгөгдөл оруулах оролдлого хийх үед идэвхждэг.
  • UPDATE TRIGGER – UPDATE командыг ашиглан өгөгдлийг өөрчлөх оролдлого хийх үед идэвхждэг.
  • DELETE TRIGGER – DELETE командыг ашиглан өгөгдлийг устгах оролдлого хийх үед идэвхждэг.

Барилга байгууламж [ УСТГАХ] [,] [ INSERT] [,] [ ШИНЭЧЛЭХ]Тэгээд FOR | ДАРАА | ) ([,]-ийн орондгох ямар тушаалд хариу өгөхийг тодорхойлох. Үүнийг үүсгэх үед дор хаяж нэг командыг зааж өгөх ёстой. Зөвшөөрөгдсөн өдөөгч үүсгэх, хоёр эсвэл бүх гурван тушаалд хариулах.

WITH APPEND нь төрөл бүрийн олон триггер үүсгэх боломжийг олгодог.

At өдөөгч үүсгэхХУУЛГАХГҮЙ аргументын тусламжтайгаар хүснэгтүүдийг хуулбарлах механизмаар өөрчилж байх үед ажиллахыг хориглоно.

AS sql_operator[...n] бүтэц нь өдөөгчийг эхлүүлэх үед гүйцэтгэх SQL хэллэг, командуудын багцыг тодорхойлдог.

Триггер дотор хэд хэдэн үйлдлийг хийхийг хориглоно гэдгийг анхаарна уу, тухайлбал:

  • мэдээллийн сан үүсгэх, өөрчлөх, устгах;
  • мэдээллийн сан эсвэл гүйлгээний бүртгэлийн нөөцлөлтийг сэргээх.

Эдгээр командуудыг гүйцэтгэхийг зөвшөөрөхгүй, учир нь гохыг гүйцэтгэсэн гүйлгээг буцаах тохиолдолд буцаах боломжгүй. Энэхүү хориг нь үүсгэсэн триггерүүдийн үйл ажиллагаанд ямар нэгэн байдлаар нөлөөлөхгүй байх магадлалтай. Жишээлбэл, хүснэгтийн мөрийг өөрчилсний дараа гүйлгээний бүртгэлийн нөөцлөлтийг сэргээх шаардлагатай нөхцөл байдлыг олоход хэцүү байдаг.

Триггер програмчлал

Бичлэг нэмэх, өөрчлөх, устгах командуудыг гүйцэтгэх үед сервер нь хоёр тусгай хүснэгт үүсгэдэг. оруулсанТэгээд устгасан. Эдгээр нь гүйлгээ дуусахад оруулах эсвэл устгах мөрүүдийн жагсаалтыг агуулдаг. Оруулсан болон устгасан хүснэгтүүдийн бүтэц нь триггерийг тодорхойлсон хүснэгтүүдийн бүтэцтэй ижил байна. Триггер бүр өөрийн оруулсан болон устгасан хүснэгтүүдийг үүсгэдэг тул өөр ямар ч триггер тэдгээрт хандах боломжгүй. Өдөөгчийг гүйцэтгэхэд хүргэсэн үйлдлийн төрлөөс хамааран оруулсан болон устгасан хүснэгтүүдийн агуулга өөр байж болно.

  • INSERT команд – оруулсан хүснэгт нь хэрэглэгчийн хүснэгтэд оруулахыг оролдсон бүх мөрүүдийг агуулна; устгасан хүснэгтэд нэг мөр байхгүй болно; гох ажиллагаа дууссаны дараа оруулсан хүснэгтийн бүх мөрүүд эх хүснэгт рүү шилжих болно;
  • DELETE команд – устгасан хүснэгт нь хэрэглэгчийн устгахыг оролдсон бүх мөрийг агуулна; гох нь мөр бүрийг шалгаж, устгахыг зөвшөөрсөн эсэхийг тодорхойлох боломжтой; оруулсан хүснэгтэд мөр байхгүй болно;
  • UPDATE команд - гүйцэтгэх үед устгасан хүснэгт нь гох амжилттай дууссаны дараа устгагдах хуучин мөрийн утгуудыг агуулна. Шинэ мөрийн утгуудыг оруулсан хүснэгтэд оруулсан болно. Эдгээр мөрүүд нь триггер амжилттай хэрэгжсэний дараа эх хүснэгтэд нэмэгдэх болно.

Өдөөгч амжилттай дууссаны дараа хэдэн мөр өөрчлөгдөх талаар мэдээлэл авахын тулд @@ROWCOUNT; функцийг ашиглаж болно. энэ нь сүүлчийн тушаалаар боловсруулсан мөрийн тоог буцаана. Тодорхой мөрийг өөрчлөх оролдлого хийх үед биш, харин өөрчлөх командыг гүйцэтгэх үед гох нь ажилладаг гэдгийг онцлон тэмдэглэх нь зүйтэй. Ийм нэг тушаал нь олон мөрөнд нөлөөлдөг тул гох нь эдгээр бүх мөрийг боловсруулах ёстой.

Хэрэв гох нь 100 мөр оруулах, өөрчлөх, устгахаас зөвхөн нэг нь тодорхой нөхцлийг хангахгүй байгааг илрүүлбэл ямар ч мөр оруулах, өөрчлөх, устгахгүй. Энэ зан үйл нь гүйлгээний шаардлагаас шалтгаална - бүх өөрчлөлтийг хийх ёстой эсвэл байхгүй.

Триггер нь далд тодорхойлогдсон гүйлгээний хэлбэрээр ажилладаг тул триггер дотор гүйлгээг удирдах командуудыг ашиглаж болно. Тодруулбал, бүрэн бүтэн байдлын хязгаарлалтын зөрчил илэрсэн үед ROLLBACK TRANSACTION командыг ашиглан гохыг зогсоож, хэрэглэгчийн хийх гэж оролдсон аливаа өөрчлөлтийг буцаах шаардлагатай.

Та COLUMNS_UPDATED() функцийг ашиглан өдөөгчийг ажиллуулахад хүргэсэн INSERT эсвэл UPDATE командуудаар өөрчлөгдсөн баганын жагсаалтыг гаргаж болно. Энэ нь хоёртын тоог буцаадаг бөгөөд бит бүр нь хамгийн бага ач холбогдолтой битээс эхлэн хүснэгтийн нэг баганад (хүснэгтийг үүсгэх үед баганын дарааллаар) тохирдог. Хэрэв битийг "1" гэж тохируулсан бол харгалзах баганыг өөрчилсөн байна. Үүнээс гадна багана өөрчлөгдсөнийг UPDATE функцээр (баганын_нэр) тодорхойлно.

Учир нь гохыг арилгахкомандыг ашиглаж байна

DROP TRIGGER (гох_нэр) [,...n]

Триггер ашиглах жишээ энд байна.

Жишээ 14.1.Триггер ашиглах үнэ цэнийн хязгаарлалтыг хэрэгжүүлэх. Гүйлгээний хүснэгтэд нэмсэн бичилтэд борлуулсан бүтээгдэхүүний тоо хэмжээ нь Агуулахын хүснэгтийн үлдэгдлээс багагүй байх ёстой.

Гэрээний хүснэгтэд бичлэг оруулах тушаал нь жишээлбэл, дараах байдалтай байж болно.

Худалдааны ҮНЭ ЦЭВЭРТ ОРУУЛАХ (3,1,-299,"01/08/2002")

Үүсгэсэн триггер нь түүний гүйцэтгэлд дараах байдлаар хариу үйлдэл үзүүлэх ёстой: Хэрэв агуулахын хүснэгтэд бүтээгдэхүүний үлдэгдэл нь оруулсан код бүхий бүтээгдэхүүний борлуулсан тоо хэмжээнээс бага байвал тушаалыг цуцлах шаардлагатай (жишээ нь, бүтээгдэхүүний код = 3). ). Оруулсан бүртгэлд тухайн барааг нийлүүлсэн бол “+”, борлуулсан бол “-” тэмдгээр бүтээгдэхүүний тоо хэмжээг заана. Үзүүлсэн гох нь зөвхөн нэг нэмсэн бичлэгийг боловсруулахаар тохируулагдсан.

CREATE TRIGGER Trigger_ins ON ГҮЙЛГЭЭ ОРУУЛАХ ГЭЖ @@ROWCOUNT=1 БАЙХГҮЙ БОЛ ЭХЭЛНЭ (СОНГОХ * FROM-г ХААНА оруулсан -inserted.quantity<=ALL(SELECT Склад.Остаток FROM Склад,Сделка WHERE Склад.КодТовара= Сделка.КодТовара)) BEGIN ROLLBACK TRAN PRINT "Отмена поставки: товара на складе нет" END END Жишээ 14.1. Утга дээр хязгаарлалтыг хэрэгжүүлэхийн тулд триггер ашиглах.

Жишээ 14.2.Статистик мэдээлэл цуглуулахын тулд триггер ашиглах.

Хэлэлцээрийн хүснэгтэд бичлэг оруулах үйлдлийг боловсруулахын тулд триггер үүсгэ, жишээлбэл, дараах тушаалыг ашиглана:

Худалдааны ҮНЭ ЦЭВЭРТ ОРУУЛАХ (3,1,200,"01/08/2002")

3 кодтой бүтээгдэхүүнийг 1 кодтой хэрэглэгчээс 200 ширхэгээр нийлүүлнэ.

Худалдах, хүлээн авахдаа бараа материалын тоо хэмжээг зохих ёсоор нь тохируулах ёстой. Хэрэв бүтээгдэхүүн хараахан бэлэн болоогүй бол агуулахын хүснэгтэд тохирох бичилтийг оруулах шаардлагатай. Триггер нь зөвхөн нэг нэмсэн мөрийг боловсруулдаг.

ALTER TRIGGER Trigger_ins ON Transaction FOR INSERT AS DECLARE @x INT, @y INT IF @@ROWCOUNT=1 --Гүйлгээний хүснэгтэд бараа хүргэлтийн тухай бүртгэл нэмэгдсэн ЭХЛЭХ --борлуулсан барааны тоо хэмжээ нь дараах байх ёсгүй Агуулахын хүснэгтийн үлдэгдэлээс бага ХЭРВЭЭ БАЙХГҮЙ БОЛ(СОНГОХ * FROM WHERE оруулсан -inserted.quantity< =ALL(SELECT Склад.Остаток FROM Склад,Сделка WHERE Склад.КодТовара= Сделка.КодТовара)) BEGIN ROLLBACK TRAN PRINT "откат товара нет " END --если записи о поставленном товаре еще нет, --добавляется соответствующая запись --в таблицу Склад IF NOT EXISTS (SELECT * FROM Склад С, inserted i WHERE С.КодТовара=i.КодТовара) INSERT INTO Склад (КодТовара,Остаток) ELSE --если запись о товаре уже была в таблице --Склад, то определяется код и количество --товара издобавленной в таблицу Сделка записи BEGIN SELECT @y=i.КодТовара, @x=i.Количество FROM Сделка С, inserted i WHERE С.КодТовара=i.КодТовара --и производится изменения количества товара в --таблице Склад UPDATE Склад SET Остаток=остаток+@x WHERE КодТовара=@y END END Жишээ 14.2. Статистик мэдээлэл цуглуулахын тулд триггер ашиглах.

Жишээ 14.3.Хэлэлцээрийн хүснэгтээс бичлэгийг устгах үйлдлийг боловсруулах триггер үүсгэнэ үү, жишээлбэл, дараах тушаалыг ашиглана уу:

Бүртгэлийг устгах үед код нь тодорхойлогдсон бүтээгдэхүүний хувьд хувьцааны үлдэгдлийг тохируулах шаардлагатай. Триггер нь устгахын тулд зөвхөн нэг бичлэгийг боловсруулдаг.

CREATE TRIGGER Trigger_del ON @@ROWCOUNT=1 ГЭЖ УСТГАХ ГҮЙЛГЭЭ -- нэг бичлэг устсан ЭХЛЭХ МЭДЭГДЭХ @y INT,@x INT --бүтээгдэхүүний код, тоо хэмжээг агуулахын хүснэгтээс устгасан --record-оос тодорхойлно. СОНГОХ @y=Бүтээгдэхүүний код, @ x=Тоо хэмжээ FROM устгагдсан --Агуулах хүснэгтэд --барааны тоо хэмжээг тохируулна. ШИНЭЧЛЭХ Агуулахын багц Үлдсэн=Үлдсэн-@x ХААНА Бүтээгдэхүүний код=@y Төгсгөл Жишээ 14.3. Хүснэгтээс бичлэг устгах үйлдлийг боловсруулах триггер

Жишээ 14.4.Дараах командын тусламжтайгаар Deal хүснэгт дэх бичлэгийг өөрчлөх үйлдлийг боловсруулах триггер үүсгэнэ үү.

3-тай тэнцэх кодтой барааны бүх гүйлгээнд барааны тоог 10 нэгжээр бууруулна.

Заасан тушаал нь Хэлэлцээрийн хүснэгтийн хэд хэдэн бүртгэлийг нэгэн зэрэг өөрчлөхөд хүргэж болно. Тиймээс бид нэгээс олон бичлэгийг боловсруулдаг триггерийг хэрхэн үүсгэхийг харуулах болно. Өөрчлөгдсөн бичилт бүрийн хувьд хуучин (өөрчлөгдөхөөс өмнө) бүтээгдэхүүний код нь агуулах дахь бүтээгдэхүүний үлдэгдлийг хуучин (өөрчлөхөөс өмнөх) бүтээгдэхүүний тоо хэмжээ, шинэ (өөрчлөгдсөний дараа) хэмжээгээр бууруулах шаардлагатай. өөрчлөлт) бүтээгдэхүүний кодыг агуулах дахь үлдэгдлийг шинэ (өөрчлөлтийн дараа) үнэ цэнийн үнээр нэмэгдүүлэх. Бүх өөрчлөгдсөн бүртгэлийг боловсруулахын тулд бид бүх хуучин (устгагдсан хүснэгтээс) болон бүх шинэ утгыг (оруулсан хүснэгтээс) хадгалах курсоруудыг нэвтрүүлэх болно.

CREATE TRIGGER Trigger_upd ON Transaction FOR FOR UPDATE DECLARE @x INT, @x_old INT, @y INT, @y_old INT -- курсор шинэ утгуудтай. DECLARE CUR1 CURSO FOR SELECT Product Code, Quantity FROM -- хуучин утгатай курсор ​​БҮТЭЭГДЭХҮҮНИЙГ СОНГОХ БОЛОМЖТОЙ CUR2 КУРСОРЫГ МЭДЛЭХ. Устгасан OPEN CUR1 НЭЭЛТТЭЙ CUR2-с тоо хэмжээ -- хоёр курсороор зэрэгцүүлэн хөдөлгөх. ЭХЛҮҮЛЭХ -- хуучин бүтээгдэхүүний кодын хувьд энэ нь буурна --агуулах дахь тоо хэмжээ ШИНЭЧЛЭХ Агуулахын багц Үлдсэн=Үлдсэн-@y_old ХААНА Бүтээгдэхүүний код=@x_old -- шинэ бүтээгдэхүүний кодын хувьд, хэрэв ийм бүтээгдэхүүн нөөцөд хараахан байхгүй бол, ХЭРЭВ БАЙХГҮЙ БОЛ шинэ бичлэг оруулна (Бүтээгдэхүүний код, үлдэгдэл агуулахаас * СОНГОХ) Агуулах INSERT INTO (Бүтээгдэхүүний код, Үлдсэн) ҮНЭ ЦЭВЭР (@x,@y) ҮГҮЙ БОЛ --үгүй бол шинэ бүтээгдэхүүний код нэмэгдэнэ -- түүний нөөцөд байгаа тоо хэмжээ ШИНЭЧЛЭХ Агуулахын багц Үлдсэн=Үлдсэн+@y ХААНА Бүтээгдэхүүний код=@x CUR1-с ДАРААХ АВАХ @x, @y CUR2-аас ДАРААХ АВАХ @x_old, @y_old Төгсгөл CUR1-ийг ХААХ ТОГТ2 ХААХ CUR2 БУЦАХ CUR12 Жишээ 14.4. Хүснэгт дэх бичлэгийг өөрчлөх үйлдлийг боловсруулах гох

Гүйцэтгэлийн бүртгэлийг агуулах дахь үлдэгдэлтэй нь өөрчлөх үед барааны тоо хэмжээг харьцуулах боломжгүй.

Жишээ 14.5.Энэ дутагдлаа засъя. Алдааны мессеж үүсгэхийн тулд бид триггерийн биед MS SQL Server RAISERROR командыг ашигладаг бөгөөд аргументууд нь мессежийн текст, ноцтой байдлын түвшин, алдааны төлөв юм.

ӨӨРЧЛӨЛТ TRIGGER Trigger_upd гүйлгээг ШИНЭЧЛҮҮЛЭХ БОЛОМЖТОЙ @x INT, @x_old INT, @y INT, @y_old INT,@o INT ЗАРЛАХ CUR1 КУРСОР СОНГОХ Зүйлийн код, Тоо хэмжээ FROM FROM FROM CUROR SELECT CURSOR, Устгах. CUR1-ийг НЭЭХ CUR2-г CUR1-ээс @x, @y CUR2-с ДАРААХ @x_old, @y_old АВАХ @@FETCH_STATUS=0 СОНГОЖ ЭХЛҮҮЛЭХ @o=Үлдсэн агуулахаас ХААНА бүтээгдэхүүний код=@x бол @o<-@y BEGIN RAISERROR("откат",16,10) CLOSE CUR1 CLOSE CUR2 DEALLOCATE CUR1 DEALLOCATE CUR22 ROLLBACK TRAN RETURN END UPDATE Склад SET Остаток=Остаток-@y_old WHERE КодТовара=@x_old IF NOT EXISTS (SELECT * FROM Склад WHERE КодТовара=@x) INSERT INTO Склад(КодТовара,Остаток) VALUES (@x,@y) ELSE UPDATE Склад SET Остаток=Остаток+@y WHERE КодТовара=@x FETCH NEXT FROM CUR1 INTO @x, @y FETCH NEXT FROM CUR2 INTO @x_old, @y_old END CLOSE CUR1 CLOSE CUR2 DEALLOCATE CUR1 DEALLOCATE CUR2 Жишээ 14.5. Хүснэгт дэх бичлэгийг өөрчлөх үйлдлийг боловсруулах триггерийн залруулсан хувилбар

Жишээ 14.6.Жишээн дээр дор хаяж нэгийг нь хэрэгжүүлэх боломжгүй бол бүх өөрчлөлтийг цуцална. Зөвхөн зарим бичлэгийн өөрчлөлтийг цуцалж, үлдсэнийг нь өөрчлөх боломжийг олгодог триггер үүсгэцгээе.

Энэ тохиолдолд гох нь бичлэгийг өөрчилсний дараа гүйцэтгэгдэхгүй, харин өөрчлөх командын оронд.

@k INT, @k_old INT DECLARE @x INT, @x_old INT, @y INT DECLARE @y_old INT,@o INT МЭДЭЭЛЭХ ГЭЖ ШИНЭЧЛЭХИЙН оронд Trigger_upd гүйлгээний триггерийг ӨӨРЧЛӨХ. оруулсан Гүйлгээний код, Бүтээгдэхүүний код, СОНГОХ CUR2 КУРСОР МЭДЭГДЭХ. Устгасан НЭЭЛТТЭЙ CUR1 НЭЭЛТТЭЙ CUR2-ийг CUR1-с ДАРААХ АВАХ @k,@x, @y CUR2-с ДАРААХ АВАХ @k_old,@x_old, @y_old, @ATF=WETCH_ 0 ЭХЛҮҮЛЭХ @ o=Үлдсэн агуулахаас ХЭРЭГСЭН СОНГОХ Бүтээгдэхүүний код=@x ХЭРВЭЭ @o>=-@y ЭХЭЛЛЭЭ RAISERROR("өөрчлөх",16,10) Гүйлгээг шинэчлэх SET тоо хэмжээ=@y, Бүтээгдэхүүний код=@x ХААНА Гүйлгээний код =@k ШИНЭЧЛЭХ Агуулахын багц үлдсэн =Үлдсэн-@y_old ХААНА Барааны код=@x_old БАЙХГҮЙ БАЙВАЛ (* ХААНА агуулахаас СОНГОХ Барааны код=@x) Агуулахад INSERT INTO (Барааны код, Үлдсэн) УТГА (@x,@y) БУСДАА ШИНЭЧЛЭХ Агуулахын багц Үлдсэн=Үлдсэн+@y ХААНА Зүйлийн код=@x Төгсгөл ELSE RAISERROR("бичлэг өөрчлөгдөөгүй",16,10) CUR1-с ДАРААХ АВАХ @k,@x, @y CUR2-с ДАРААХ @k_old ОРОХ, @x_old, @y_old ТӨГСГӨЛ ХААХ CUR1 ХААХ CUR2 ХААХ CUR1 CUR2-г ХААХ Жишээ 14.6. Зөвхөн зарим бичлэгийн өөрчлөлтийг буцаах, үлдсэн хэсэгт өөрчлөлт оруулах боломжийг олгодог гох.