SQL тригери: Основното ръководство

Тригерите са обекти на база данни в SQL Server. Технически, те са определен клас извиквания на функции, които отговарят на специфични операции в базата данни.

Това основно ръководство ще ви даде задълбочена информация за SQL Triggers, която може да бъде доста полезна във вашата професия. Да започваме!

Какво представляват SQL тригерите?

Думата „тригер“ описва изявление, че сървърът автоматично изпълнява заявката всеки път, когато съдържанието в базата данни бъде променено.

Тригерът е група от специално наименувани SQL заявки, които се съхраняват в пространството на паметта. Това е специфичен тип извикване на функция, което се извиква незабавно при всяко събитие в базата данни. Всеки тригер има таблица, присвоена към него.

Например, тригер може да се активира всеки път, когато се добави нова колона към определена таблица или ако конкретни записи се променят.

Според Microsoft Developer Network тригерите са определен клас съхранени процедури. В изявление за тригер ние първоначално дефинираме кога тригерът трябва да бъде стартиран и след това предоставяме действието, което трябва да се предприеме, след като тригерът е активиран.

Синтаксис:

CREATE TRIGGER trigger_name
BEFORE/AFTER
INSERT/UPDATE/DELETE
ON tableName
FOR EACH ROW SET operation [trigger_body];

Обяснение на всеки параметър

  • CREATE TRIGGER trigger_name – Използва се за конструиране на тригер или за промяна на името на съществуващ тригер.
  • ПРЕДИ/СЛЕД – Тази заявка се използва за определяне на времето за изпълнение на тригера (преди или след определено събитие).
  • INSERT/UPDATE/DELETE – Това описва действието, което искаме да предприемем върху масите.
  • ON tableName – Тук дефинираме името на таблицата, за да настроим тригер.
  • ЗА ВСЕКИ РЕД – Това изявление се отнася до задействане на ред, което означава, че задействанията ще се изпълняват всеки път, когато ред бъде променен.
  • trigger_body – Указва действието, което трябва да се предприеме, когато тригерът е активиран.

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

Тригерите се използват най-вече за регулиране на внедряването на код, когато се случи събитие. Казано по друг начин, използването на тригери е идеалният избор, ако изисквате конкретен кодов фрагмент да се изпълнява постоянно в отговор на определено събитие.

По-долу са някои предимства от използването на тригери в операции на SQL бази данни.

  • Извършва допълнителни проверки при вмъкване, актуализиране или изтриване на данни от засегнатата таблица.
  • Намалява времето за реакция, което спомага за увеличаване на изчислителните разходи.
  • Позволява кодирането на сложни параметри по подразбиране, които са недостъпни от първоначалните ограничения.
  • Референтната цялост е ключово основно свойство на системите за релационни бази данни. Това означава, че данните, съхранявани в системата от бази данни, трябва винаги да са точни за всяка транзакция и всяка операция.

      Как да използвате Google Fidget Spinner

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

    Комбинация от тригерни аргументи

    За всяка таблица можем да посочим шест различни типа тригери. Това са комбинацията от аргументи на Trigger, включени в SQL Triggers на ниво ред.

    ПРЕДИ INSERT: Тези тригери изпълняват действието върху редовете, преди да извършат каквито и да било операции INSERT в указаната таблица или в базата данни.

    СЛЕД ВМЪКВАНЕ: Изпълнява действието върху редове непосредствено след всяка дейност INSERT в базата данни.

    ПРЕДИ АКТУАЛИЗАЦИЯ: С тези тригери се изпълнява функция върху редовете, преди да се извърши действие UPDATE върху базата данни.

    СЛЕД АКТУАЛИЗАЦИЯ: Изпълнява действието върху редове, непосредствено следващи всяка дейност по АКТУАЛИЗАЦИЯ на база данни или конкретна таблица.

    ПРЕДИ ИЗТРИВАНЕ: Изпълнява определена операция върху редове дори преди базата данни или таблицата да бъдат подложени на действие ИЗТРИВАНЕ.

    СЛЕД ИЗТРИВАНЕ: Тези тригери изпълняват действието върху редовете след всяка транзакция ИЗТРИВАНЕ.

    Видове SQL тригери

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

    DML тригери – DML означава език за манипулиране на данни. Изпълнението на код в отговор на модификация на данни е възможно с помощта на DML тригери. Този тригер се активира, когато се изпълняват DML команди като INSERT, UPDATE и DELETE. Те се наричат ​​още „тригери на ниво таблица“.

    DDL тригери – DDL означава език за дефиниране на данни. DDL тригерите ни позволяват да изпълняваме код в отговор на промени в схемата на базата данни, като добавяне или изтриване на таблици или сървърни събития, като например когато потребител се регистрира. Те се наричат ​​„тригери на ниво база данни“.

    Тези тригери могат да бъдат активирани, когато определени DDL оператори като CREATE, ALTER или DROP се изпълняват в активната база данни. Те също могат да се използват за наблюдение и управление на дейностите, които се изпълняват.

    LOGON Triggers – Всеки път, когато възникне събитие LOGON (Стартиране, влизане, излизане, изключване), незабавно се извикват тригери за влизане. Те се извършват само след процес на удостоверяване на потребителя дори преди потребителската транзакция да бъде инициирана. Тригерите за LOGON няма да се задействат, ако оторизацията е неуспешна.

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

    CLR тригери – CLR означава Common Language Runtime. CLR тригерите наистина са уникално подмножество от тригери, изградени предимно на CLR в рамките на .NET технологията. Тези тригери са полезни, ако тригерът трябва да извърши много изчисления или трябва да се свърже с обект, различен от SQL.

      Sortd ви дава интерфейс, базиран на списък, за да организирате имейли [Chrome]

    DML и DDL тригерите наистина могат да бъдат конструирани чрез активиране на кодирането на поддържани CLR тригери в .NET технологии, включително Visual Basic, C# и F-sharp.

    Примерен тригер на SQL Server

    Нека разберем тези тригерни концепции с пример.

    Първо, нека създадем база данни, използвайки SQL изрази.

    CREATE DATABASE testdb;
    use testdb;

    Тук съм дал „testdb“ като име на базата данни. И следващата стъпка е да създадете таблица.

    CREATE TABLE student(
      name varchar(25),
      id int(2),
      maths int(2),
      physics int(2),
      biology int(2),
      social int(2),
      total int(2)
     );

    Създадох таблица за съхраняване на данните за учениците. А ето и командата за описание на структурата на таблицата. Тук „студент“ е името на таблицата, което съм дал.

    DESC student;

    По-долу е структурата на таблицата, която създадох.

    +---------+-------------+------+-----+---------+-------+
    | Field   | Type        | Null | Key | Default | Extra |
    +---------+-------------+------+-----+---------+-------+
    | name    | varchar(25) | YES  |     | NULL    |       |
    | id      | int         | YES  |     | NULL    |       |
    | maths   | int         | YES  |     | NULL    |       |
    | physics | int         | YES  |     | NULL    |       |
    | biology | int         | YES  |     | NULL    |       |
    | social  | int         | YES  |     | NULL    |       |
    | total   | int         | YES  |     | NULL    |       |
    +---------+-------------+------+-----+---------+-------+
    7 rows in set (0.00 sec)

    След като създадете таблица, следващата стъпка е да настроите тригер. Нека опитаме да използваме аргумента BEFORE INSERT.

    Името на тригера, който създадох, е „марки“. Веднага щом таблицата бъде модифицирана с оценките на ученика, тригерът по-долу се опитва автоматично да определи общата оценка на ученика.

    CREATE TRIGGER marks
    BEFORE INSERT
    ON
    student
    FOR EACH ROW
    set new.total=new.maths+new.physics+new.biology+new.social;

    Тъй като от нас се изисква да заменим данни за редове, вместо да работим със старите, дефинирахме „total“, използвайки ново име на клас, и всички следващи изрази са с префикс нови ключови думи след total, използвайки оператора точка. Сега ще добавим стойности към всеки ред и ще видим резултатите. Първоначално общата оценка е 0 за всеки ученик.

    INSERT INTO student VALUES("George",02,99,87,92,91,0);
    INSERT INTO student VALUES("James",03,91,81,94,90,0);
    INSERT INTO student VALUES("Harry",04,86,70,73,88,0);
    INSERT INTO student VALUES("John",05,73,89,78,92,0);
    INSERT INTO student VALUES("Lisa",01,94,75,69,79,0);
    

    В този случай операторът за задействане ще се задейства автоматично, когато данните се вмъкнат в таблицата на ученика. Общите оценки на всеки ученик ще бъдат изчислени от тригера. Сега нека видим дали тригерът се извиква или не с помощта на оператор SELECT.

    SELECT * FROM table_name;

    И ето го крайният резултат.

    mysql> select * from student;
    +--------+------+-------+---------+---------+--------+-------+
    | name   | id   | maths | physics | biology | social | total |
    +--------+------+-------+---------+---------+--------+-------+
    | George |    2 |    91 |      81 |      94 |     90 |   356 |
    | James  |    3 |    86 |      70 |      73 |     88 |   317 |
    | Harry  |    4 |    73 |      89 |      78 |     92 |   332 |
    | John   |    5 |    94 |      75 |      69 |     79 |   317 |
    | Lisa   |    1 |    99 |      87 |      92 |     91 |   369 |
    +--------+------+-------+---------+---------+--------+-------+
    5 rows in set (0.00 sec)

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

    Допълнителни тригерни операции

    Можем да извършваме много операции с помощта на тригери. Някои може да са прости, а други малко сложни, но след като преминем през заявките, е лесно за разбиране. Като използвате Transact-SQL изрази, можете да активирате, деактивирате или изтриете тригерите, като използвате следните команди.

    Запитване, за да проверите дали има конкретен тригер или не

    Тази команда проверява за посочения тригер в цялата база данни.

    SELECT * FROM [sys].[triggers] WHERE [name] = 'Trigger_name'

    Заявка за показване на задействания

    Всички тригери, които са налични в активната база данни, ще бъдат показани от следния оператор.

    SHOW TRIGGERS;

    Заявка за деактивиране на тригера

    Командата по-долу деактивира тригера в работещата база данни.

    DISABLE TRIGGER trigger_name ON DATABASE;

    Можете също да посочите определено име на таблица, за да деактивирате тригер.

    DISABLE TRIGGER trigger_name ON table_name;

    Заявка за активиране на задействане

    Следната команда първо деактивира конкретен тригер, който е дефиниран в указаната таблица в активната база данни, преди да го активира отново.

    ALTER TABLE table_name DISABLE TRIGGER trigger_name
    
    ALTER TABLE table_name ENABLE TRIGGER trigger_name

    Тригерът трябва да бъде деактивиран, преди да се опитате да го активирате,

      Най-добрите инструменти и софтуер за наблюдение на ИТ инфраструктурата, прегледани през 2020 г

    Заявка за активиране или деактивиране на всички тригери в таблица

    Използвайки горния SQL израз, можем да деактивираме или активираме всички задействания на таблицата наведнъж, като заменим „ВСИЧКИ“ на мястото на конкретно име на задействане.

    ALTER TABLE table_name DISABLE TRIGGER ALL 
    
    ALTER TABLE table_name ENABLE TRIGGER ALL

    Заявка за изтриване или пускане на задействане

    Тригер може да бъде премахнат чрез изтриване на него или на цялата таблица. Всеки свързан тригер също се изтрива при изтриване на таблица.

    DROP TRIGGER [trigger_name];

    Всеки път, когато даден тригер бъде изтрит, свързаните данни се елиминират от таблицата с данни на sys.objects.

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

    • Лесно е да се изградят тригери и самият тригер може да извиква съхранени функции и методи.
    • Потребителите могат да прилагат прост одит с помощта на тригери.
    • За съжаление не можете да създавате ограничения между обекти в системи с бази данни с SQL Server, въпреки че можете да емулирате действието на ограничения чрез използване на тригери.
    • Ограниченията за интегритет могат да бъдат приложени в базите данни с помощта на тригери.
    • Когато се изисква групова проверка, а не ред по ред проверка на нововъведени или променени данни, тригерите могат да бъдат полезни.

    Недостатъци на тригерите

    SQL тригерите може да не са най-добрият избор в някои ситуации поради техните ограничения.

    • Тригерите трябва да бъдат точно документирани.
    • Поради едновременното изпълнение на база данни, което може да не е достъпно за компонентите на приложението, тригерите могат да бъдат предизвикателство за отстраняване на грешки.
    • DML изразите стават по-сложни, когато се използват тригери.
    • Дори незначителен проблем със задействане има потенциал да доведе до логически грешки в изявлението.

    Заключение

    Тригерите са много полезни компоненти на Transact-SQL и SQL и можете да ги използвате и в Oracle. Използването на тригери е от решаващо значение при извикване на съхранени методи. Тези SQL тригери ни позволяват да анализираме графиките на активността и да определим как да реагираме на тях, ако е необходимо. Можем също да проверим за определена таблица, която е свързана с тригер за получаване на данни.

    Рекурсията може да бъде активирана от тригери. Всеки път, когато тригер на таблица изпълни команда на родителската таблица, втората итерация на тригера се задейства и това е известно като рекурсивен тригер. Това помага, докато се опитвате да разрешите корелация на идентичността.

    Освен това тригерите регулират шаблона за актуализиране, който базата данни има право да приема. Много е полезно да се запазят ограниченията за целостта на данните в системата на базата данни, ако не съществуват SQL ограничителни ключове, основно първичен ключ и външен ключ.

    Надявам се, че сте намерили тази статия за полезна, за да научите повече за SQL Triggers.

    Ако искате да научите задълбочено бази данни, ето някои отлични ресурси за изучаване на SQL и NoSQL.