Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách thực thi một trình kích hoạt chỉ khi một cột cụ thể được cập nhật (SQL Server)

Trong SQL Server, bạn có thể tạo trình kích hoạt DML chỉ thực thi mã khi một cột cụ thể được cập nhật.

Trình kích hoạt vẫn kích hoạt, nhưng bạn có thể kiểm tra xem một cột cụ thể đã được cập nhật hay chưa và sau đó chỉ chạy mã khi cột đó đã được cập nhật.

Bạn có thể thực hiện việc này bằng cách sử dụng UPDATE() hoạt động bên trong trình kích hoạt của bạn. Hàm này chấp nhận tên cột làm đối số của nó. Nó trả về một boolean.

Ví dụ

Đây là bảng:

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

Và đây là trình kích hoạt:

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;

Trong ví dụ này, tôi tạo một bảng có tên t1 và một trình kích hoạt được gọi là trg_t1 .

Tôi sử dụng IF cùng với UPDATE() chức năng kiểm tra xem có hay không c1 cột đã được cập nhật.

Khi trình kích hoạt chạy, nó sẽ chỉ thực thi mã tiếp theo nếu điều kiện đó là đúng.

Kích hoạt trình kích hoạt

Hãy chèn một hàng, nhưng chúng tôi sẽ chỉ chèn một giá trị vào c1 cột.

INSERT INTO t1 (c1) 
VALUES (1);

SELECT * FROM t1;

Kết quả:

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

Như mong đợi, trình kích hoạt đã kích hoạt và cột c3 cũng đã được cập nhật.

Điều này xảy ra vì tôi đã bao gồm INSERT đối số trong định nghĩa trình kích hoạt của tôi (tức là tôi đã chỉ định AFTER INSERT, UPDATE có nghĩa là trình kích hoạt được kích hoạt bất cứ khi nào dữ liệu được chèn hoặc cập nhật). Nếu tôi chỉ chỉ định AFTER UPDATE , nó sẽ không kích hoạt khi tôi chèn dữ liệu - nó sẽ chỉ kích hoạt bất cứ khi nào tôi cập nhật dữ liệu hiện có.

Hãy nhớ rằng bảng được xác định bằng DEFAULT 0 , vì vậy cột c2 được đặt mặc định là 0.

Bây giờ chúng ta hãy cập nhật c1 cột.

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

SELECT * FROM t1;

Kết quả:

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

Một lần nữa, c3 cột đã được cập nhật cùng với c1 .

Bây giờ chúng ta hãy cập nhật c2 (cột này không được bao gồm trong trình kích hoạt).

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

SELECT * FROM t1;

Kết quả:

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

Vì vậy, lần này, c2 đã được cập nhật nhưng c3 đã không. Đó là vì c1 cột không được cập nhật và trình kích hoạt của chúng tôi chỉ cập nhật c3 khi c1 được cập nhật.

Điều tương tự sẽ xảy ra nếu chúng tôi chèn một hàng mà không chỉ định c1 trong INSERT tuyên bố.

Điều gì sẽ xảy ra nếu tôi cập nhật cột có cùng giá trị?

Nếu bạn cập nhật một cột có cùng giá trị, thì UPDATE() hàm sẽ trả về true.

Đây là một ví dụ.

Từ các ví dụ trước, chúng tôi biết rằng cột c1 chứa giá trị 2 .

Hãy cập nhật rõ ràng cột đó với cùng một giá trị:1

UPDATE t1 
SET c1 = 2
WHERE id = 1;

SELECT * FROM t1;

Kết quả:

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

Vì vậy, bây giờ c3 đã tăng lên, ngay cả khi giá trị cho c1 vẫn vậy.

Hãy làm lại lần nữa, nhưng lần này hãy đặt nó thành chính nó (tức là thay đổi c1 = 1 thành c1 = c1 ).

UPDATE t1 
SET c1 = c1
WHERE id = 1;

SELECT * FROM t1;

Kết quả:

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

Xin nhắc lại, c3 đã tăng lên.

Nỗ lực cập nhật không thành công

Điều quan trọng cần lưu ý là UPDATE() hàm chỉ cho biết liệu một INSERT hoặc UPDATE cố gắng được thực hiện trên một cột cụ thể của bảng hoặc dạng xem. Nó sẽ vẫn trả về true nếu nỗ lực không thành công.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đi với trình điều khiển SQL Server không thể kết nối thành công, đăng nhập không thành công

  2. 3 cách sử dụng TẤT CẢ trong SQL Server

  3. Tôi có thể phân cách bằng dấu phẩy nhiều hàng thành một cột không?

  4. Làm cách nào để bạn sao lưu và khôi phục cơ sở dữ liệu dưới dạng bản sao trên cùng một máy chủ?

  5. Thu thập số lượng từ một truy vấn SQL