Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да изпълните тригер само когато се актуализира конкретна колона (SQL сървър)

В SQL Server можете да създадете DML тригери, които изпълняват код само когато се актуализира конкретна колона.

Тригерът все още се задейства, но можете да тествате дали конкретна колона е била актуализирана или не и след това да изпълните код само ако тази колона е била актуализирана.

Можете да направите това, като използвате UPDATE() функция във вашия спусък. Тази функция приема името на колоната като свой аргумент. Връща булева.

Пример

Ето таблицата:

CREATE TABLE t1 (
    id int IDENTITY(1,1) NOT NULL,
    c1 int DEFAULT 0,
    c2 int DEFAULT 0,
    c3 int DEFAULT 0
);

И ето спусъка:

CREATE TRIGGER trg_t1
ON t1
AFTER INSERT, UPDATE
AS
IF ( UPDATE (c1) )
BEGIN
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted)
END;

В този пример създавам таблица, наречена t1 и тригер, наречен trg_t1 .

Използвам IF оператор заедно с UPDATE() функция за тестване дали c1 колоната беше актуализирана.

Когато тригерът се изпълни, той ще изпълни следващия код само ако това условие е вярно.

Задействайте спусъка

Нека вмъкнем ред, но ще вмъкнем само стойност в c1 колона.

INSERT INTO t1 (c1) 
VALUES (1);

SELECT * FROM t1;

Резултат:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 1    | 0    | 1    |
+------+------+------+------+

Както се очакваше, тригерът се задейства и колоната c3 също беше актуализиран.

Това се случи, защото включих INSERT аргумент в дефиницията на моето задействане (т.е. посочих AFTER INSERT, UPDATE което означава, че тригерът се задейства всеки път, когато се вмъкват или актуализират данни). Ако бях посочил само AFTER UPDATE , нямаше да се задейства, когато вмъкнах данни – ще се задейства само всеки път, когато актуализирам съществуващи данни.

Не забравяйте, че таблицата е дефинирана с DEFAULT 0 , така че колоната c2 е нула по подразбиране.

Сега нека актуализираме c1 колона.

UPDATE t1 
SET c1 = c1 + 1
WHERE id = 1;

SELECT * FROM t1;

Резултат:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 2    | 0    | 2    |
+------+------+------+------+

Отново c3 колоната беше актуализирана заедно с c1 .

Сега нека направим актуализация на c2 колона (тази колона не е включена в тригера).

UPDATE t1 
SET c2 = c2 + 1
WHERE id = 1;

SELECT * FROM t1;

Резултат:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 2    | 1    | 2    |
+------+------+------+------+

Така че този път, c2 беше актуализиран, но c3 не беше Това е така, защото c1 колоната не е актуализирана и нашият тригер актуализира само c3 когато c1 се актуализира.

Същото нещо би се случило, ако бяхме вмъкнали ред, без да посочим c1 в INSERT изявление.

Ами ако актуализирам колоната със същата стойност?

Ако актуализирате колона със същата стойност, UPDATE() функцията ще върне true.

Ето един пример.

От предишните ни примери знаем, че колоната c1 съдържа стойност на 2 .

Нека изрично актуализираме тази колона със същата стойност:1

UPDATE t1 
SET c1 = 2
WHERE id = 1;

SELECT * FROM t1;

Резултат:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 2    | 1    | 3    |
+------+------+------+------+

Така че сега c3 се е увеличила, въпреки че стойността за c1 е все същото.

Нека го направим отново, но този път да го зададем за себе си (т.е. променете c1 = 1 до c1 = c1 ).

UPDATE t1 
SET c1 = c1
WHERE id = 1;

SELECT * FROM t1;

Резултат:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 2    | 1    | 4    |
+------+------+------+------+

Отново c3 се увеличи.

Неуспешни опити за актуализиране

Важно е да се отбележи, че UPDATE() функцията просто показва дали INSERT или UPDATE опит е направено върху определена колона на таблица или изглед. Той пак ще върне true, ако опитът е бил неуспешен.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Кога трябва да използвам променлива на таблица срещу временна таблица в sql сървър?

  2. как да направите данните си хоризонтални

  3. Как да инсталирате SQL Server на Mac

  4. Как да извлека десетични знаци при закръгляване на средна стойност в SQL

  5. Изтрийте данни чрез функция с таблично значение в SQL Server