задейства Програмиране

След този урок, вие ще:

създаване на тригери, които осъществяват бизнес логиката в базата данни;

използването на псевдо вмъкната и заличава;

Използвайте нормалните функции на системата в тригери.

Очаквано време урок - около 40 минути.

При удар Началните прояви на вмъкване, обновяване или изтриване създава псевдо един или повече (известен също като логически маса). Можем да разгледаме таблицата като логична регистъра на операциите за събития. Има два вида на логическите таблици: Вмъкнати са и изтрити. Вмъква създаден като резултат от добавяне или актуализиране на събития. Това е набор от записи добавят или променят.

UPDATE-тригер създава логически маса изтрити. Това е първоначалната комплекта от записи, в същото състояние, в което е било преди операцията за актуализация. Следващият пример създава спусък, който показва съдържанието и изтрити добавя след случай актуализацията Автори в таблицата:

CREATE TRIGGER dbo.updatetables

SELECT "Описание" = вмъкнатата таблица: "

SELECT * ОТ добавя

SELECT "Описание" = "изтритите таблица:"

SELECT * FROM изтрит

Зареденият таблица:

Прав Денби Оукланд, Калифорния 94009

Изтритите таблица:

Прав Дийн Оукланд, Калифорния 94B09

След изпълнение на спусъка за актуализация Автори маса (спусък таблицата) осигурява запис на актуализация. При задействане на спусъка да хвърли назад модификациите на масата на авторите. ако съответните действия са програмирани в спусъка. Връщане на сделката също предвижда Вмъквайте и изтривайте задейства.

При задействане на спусъка, за да премахнете набор от изтритите записи, поставени в логична маса изтрити. Вмъкнати маса не участва в събитието изтриете.

Забележка: В предишния пример, на SELECT изявление се използва само с илюстративна цел. Никога не използвайте в тригери оператори, които връщат резултат, ако не сте сигурни какво резултатът ще бъдат обработвани от приложението, което е причинило спусъка на огън.

Сега, след като сте се научили целите на джапанки, и се срещна с разнообразие от видове, описваме отчети синтактичните за създаване и модифициране на тригери. Функции и системни команди простират спусъците могат да позволят да се опише бизнес логика в тях.

Конструкции UPDATE (columnname) и (COLUMNS_UPDATED ())

Долната структура - UPDATE (imya_spgolbtsa) и (COLUMNS_UPDATED ()) - са важни компоненти операторите CREATE TRIGGER и да променят спусъка. Тези конструкции са разрешени за включване в UPDATE- и поставете-тригери, и те могат да бъдат разположени навсякъде в CREATE TRIGGER изявление или ALTER задейства.

Дизайн АКО UPDATE (COLUMN_NAME) определя дали колона COLUMN_NAME вмъкване или обновяване на събитието. Ако искате да посочите повече от една колона, трябва да споделят своя дизайн UPDATE (COLUMN_NAME). Например, следните проверки код фрагмент дали допълнение или актуализация проведени в колони и FIRST_NAME LAST_NAME. и изпълнява някакво действие на тези колони, в резултат на събития, вмъкване или обновяване на:

АКО UPDATE (first_name) OR UPDATE (LAST_NAME)

-- Ако някоя от колоните се актуализира.

-- прегазен него никакви действия.

Разсрочено резолюция име позволява липсата на колона на таблицата се, името на колона, посочено в параметъра. в момента на свързване с задейства маса. Въпреки това е необходимо, че тази колона са съществували към момента на спусъка. За повече информация за разсрочено резолюция име е описано в tlave 8.

Ако заместим стойността вместо името на колона. клауза UPDATE ще се върне TRUE. Design (COLUMNS_UPDATED ()) също така проверява дали колоната е актуализиран. Вместо това, вярно или невярно структура (COLUMNS_UPDATED ()) връща маска на VARBINARY битов тип. описва колоните, в които добавянето или актуализирането извършени.

Напиши дизайн (COLUMNS_UPDATED ()) по-трудно от UPDATE (COLUMN_NAME), но това ви дава възможност да се определи точно кои от тестваните колоните добавени или актуализирани данни. Проверими колони се определени с маска, която представлява броя (последователност) на всяка колона в таблицата. В таблицата по течението показва първите осем колони и възложени им маската.

Следният код ще позволи да се провери дали данните са добавени или актуализирани в колони 4 и 6:

IF (COIUMNS_ U PDATEDO 40)> 0

Стойност 40 - е резултат от сумиране на маската 8 до колоната 4 и маската 32 до колона 6. проверки Expression дали стойността (COLUMNS_UPDATED ()) е по-голяма от 0. С други думи, условието е изпълнено, ако най-малко една или и двете на колоната се актуализират. Ако определите състоянието (COLUMNS_UPDATED () 40) = 40, проверката за актуализация се извършва и в двете колони. Ако има актуализация само в една от колоните, условията не са изпълнени.

За да тествате деветте или повече колони, използвайте функцията за подниз, който ви позволява да определите тригер маска, за да бъде проверен. Например, следния код, за да проверите дали деветата колона се актуализира:

IF ((подниз (COLUMNS_UPDATED (), 2,1) = 1))

Подниз функция причинява структурата (COLUMNS_UPDATED ()> отидете на втория октет на колоната и да се провери дали в първата колона на втората октет (застроена си пореден номер е 9) бе актуализиран. За тази колона връща стойност от тип VARBINARY. Равно на 1. В таблиците показани по-долу? Илюстрира принципа подниз действия функция, необходими за потвърждаване на колоните 9 до 16.

IF ((подниз (COLUMNS_UPDATED (), 2, у) = Z))

За да се провери на няколко колони, за модифициране на обекта, просто добавите маска малко за всеки от тях. Например, за да се провери колони 14 и 16, трябва да бъдат определени за експресия Z 160 (128 + 32).

Функции и системни команди

За изпълнение на бизнес логиката в тригери са различни функции и системни команди. Спусъкът често се използва функция @@ ROWCOUNT. Тя връща броя на редовете, които са засегнати от прилагането на предишната оператор Transact-SQL. INSERT задейства пожари по време на събитието, актуализират или изтриват, дори и да не се променя всеки един ред. Следователно, за изхода на тригера при липса на изменение на таблицата е командата система ВРЪЩАНЕ.

Ако допуснете грешка понякога се изисква да се покаже съобщение, описващо своите каузи. За да се покаже съобщение за грешка, използващи система команда RAISERROR на. персонализирани съобщения за грешки, създадени със система съхранена процедура sp_addmessage или изходящите съобщения, вградени в RAISERROR командата система повикване. За повече информация относно система съхранена процедура sp_addmessage контакт на SQL Server Books Online. В спусъци, написани на Transact-SQL език, също понякога се използва система команда ROLLBACK сделката. Това води до намаление на цените на всички задейства пакета. Когато една фатална грешка, тъй като има намаление на цените, но косвено. Ако целта е да се предизвика по приключване на сделката инча така или иначе (освен когато сделката стане по време на фатална грешка), кода на спусъка не може да включва система за командване на операциите по ROLLBACK.

Предпазни мерки за използването на Transact-SQL

Кодът на спусъка използва SELECT отчети и печат, и да се определят стойности на променливи. Въпреки това, използването на тези оператори, за да се върнете с резултатите, тихи и безопасни стойности. Обикновено спусък е прозрачно за потребителя или прилагането. Но ако приложението не е програмиран да се справят стойности за връщане, например, в резултат на определени SELECT декларация, може да се появи неизправност в заявлението. Въпреки това, използването на SELECT изявление като доставчик на стойност не е съвсем приемливо за състояние, проверка на оператора. Например, можете да използвате SELECT декларация за проверка на наличието на определена стойност и да се върне, че стойността на оператора, ако е налице за по-нататъшна обработка. За да зададете стойности на променливите, които ще бъдат включени в тези FTC др ogrammy спусъка команда SET NOCOUNT ON.

Джапанките не са разрешени след Transact-SQL изрази:

  • ALTER, създавате, DROP, възстановяване и натоварване на база данни;
  • LOAD и възстановяване на дневник;
  • ДИСК преоразмеряване и ДИСК INIT;
  • Преконфигурира.

Тригери ви позволяват да изпълнява всякакви действия на масата или да видите, а не (вместо-тригери) или след (СЛЕД-тригери) извършване на вписване, актуализиране или изтриване. Тригери позволяват да се решават различни проблеми.

§ Изчисляване на междинните резултати, както и други изчислени стойности. Базата данни се променя непрекъснато, докато добавяне, изтриване и промяна на данните в таблиците. В някои случаи графата "данните в една таблица може да се изчисли въз основа на променените данни в друга таблица. Тригери са идеално средство за прилагане изчислени колони. Фиг. 9-3 показва спусък, който се използва за актуализиране на цената на дребно на стоки в таблицата с Инвентаризация при промяна на средната цена на едро Закупуване на маса.

Следваща тригер, прикрепен към закупуване маса. Той изчислява средната цена optopuyu за стоките на склад, тя увеличава с 30%, и актуализира колона стойност retail_price в таблицата с Опис:

CREATE TRIGGER Retail_Price_Update

СЛЕД INSERT, UPDATE, DELETE AS

Ако съществуват (SELECT item_num ОТ поставена)

(SELECT (SUM (pur.total_cost) / SUM (pur.qty_ordered) * 1,30)

От закупуването на PUR ВЪТРЕШЕН УЧАСТВА добавя добавки

ON PUR. item_num = добавки. item_num)

От инвентара инв, поставена добавки

КЪДЕ инв. item_num - ин. it'3m_num

ELSE Ако не съществува (Изберете item_ium от изтрити)

(SELECT (SUM (pur.total_cost) / SUM (pur.qty_ordered)

От закупуването на PUR INNER се присъединят изтрит дел

ON pur.item_num = del.iteT_num)

От инвентара инв, изтрити дел

КЪДЕТО inv.item_num = del.item_nurn

RAISERROR ( "В продажната цена не е била коригирана за продукта. ', 16,1)

Спусъкът се прилага декларация SET NOCOUNT ON, така че, когато на праговите пожарите и актуализира данните в таблицата с Инвентаризация. SELECT резултати отчет не се показват. На следващо място, проверка за съществуването на маси бяха вмъкнати или изтрита. Ако някоя от тези таблици, няма записи, след като се използва система командни RAISERROR задейства отпечатъци стандартно съобщение, че стойността на цената не се е променила. SysMessages Системата на маса също може да добавите персонализирано съобщение означава sp_addmessage процедура. и след това, вместо на текстови съобщения, създадени, за да се посочи брой.

§ Създаване на записи от проверките. От съображения за сигурност или просто да следите операциите, извършени на една маса (или таблици), можете да създадете тригер в база данни. Тя събира данни в таблицата, написана, модифицирани или изтрити от друга таблица или изглед.

§ Обадете външни действия. Спусъкът е позволено да се уточни действия, които надхвърлят стандартната обработка на база данни. Така например, в урок 2 показахме един пример за използване в спусъка xp_sendmail удължен съхранена процедура. който изпраща имейл съобщение, когато се появи спусъка.

§ Прилагане на комплекс за защита на целостта на данните. Понякога на стандарта за защита на мерки интегритет на данните не са достатъчни. Например, една каскада изтриване операция може да изтривате записи от други таблици, а просто отстраняване би нарушило референтна цялост между масите. Въпреки това отстраняване каскада може да бъде нежелателно. Тогава вместо да изтривате записи от съответните таблици използва вместо флопа и изтритите записи са поставени в друга таблица за по-късна проверка. Когато изтриване на записи използва вместо спусък, а след това реализира изтриване операция с помощта на каскадни референтна цялост няма да успее. За извършване на една и съща задача, трябва да програмирате операция в каскадата изтриване спусъка.

В това упражнение ще създадете и проверка на спусъка, който записва стойността на 1 в колона Продадени Книги маса от базата данни за BookShopDB. Можете също така да програмирате допълнителна обработка, която води Продадени колона в първоначалното му състояние, поставяйки я на 0, ако клиентът се връща на книгата.

4 Създаване на INSERT спусък за маса BookOrders

  1. Отворете Запитване анализатор и се свържете с локалния сървър.
  2. В прозореца на редактора на прозореца Заявка, влиза и изпълнява следния код:

CREATE TRIGGER dbo.update_book_status

ОТ bookorders БО ВЪТРЕШЕН на присъединяване добавя и

ON bo.orderid = i.orderid)

CREATE TRIGGER изявление създава спусъка име Update_Book_Status и го връзва за BookOrders маса от базата данни BookShopDB. Това спусъка се активира, когато данните се добавя към BookOrders на масата и актуализации Продадени поле стойност със съответния номер в таблица TitlelD Книги.

4 Добавка за задействане на премахването на преработка и актуализиране на таблици с данни BookOrders

1. В прозореца на редактора на прозореца Заявка, влиза и изпълнява следния код:

ALTER TRIGGER dbo.update_book_status

СЛЕД вмъкване, изтриване

Ако съществуват (SELECT * ОТ поставена)