Tôi muốn tạo trình kích hoạt trước khi xóa. Khi tôi xóa một bản ghi từ một bảng mà bản ghi phải được chèn vào một bảng lịch sử. Làm thế nào tôi có thể làm điều này trong SQL Server?Cách tạo trình kích hoạt trước khi xóa trong SQL Server?
Trả lời
Trong trường hợp này, có thể bạn nên thực hiện kích hoạt "sau" thông thường hơn. Đây là cách tiếp cận phổ biến nhất đối với loại tình huống này.
Something như
CREATE TRIGGER TRG_AUD_DEL
ON yourTable
FOR DELETE
AS
INSERT INTO my_audit_table (col1, col2, ...)
SELECT col1, col2...
FROM DELETED
Điều gì sẽ xảy ra là, khi một kỷ lục (hoặc hồ sơ!) Sẽ bị xóa khỏi bảng của bạn, hàng bị xóa sẽ được chèn vào my_audit_table
Các DELETED
bảng là một bảng ảo chứa (các) bản ghi như chúng đã ngay trước khi xóa.
Ngoài ra, lưu ý rằng trình kích hoạt chạy như một phần của giao dịch ngầm trên lệnh xóa, vì vậy nếu xóa của bạn không thành công và quay lại, trình kích hoạt cũng sẽ quay trở lại.
Bạn cũng có thể sử dụng INSTEAD OF DELETE
CREATE TRIGGER dbo.SomeTableYouWhatToDeleteFrom
ON dbo.YourTable
INSTEAD OF DELETE
AS
BEGIN
-- Some code you want to do before delete
DELETE YourTable
FROM DELETED D
INNER JOIN dbo.YourTable T ON T.PK_1 = D.PK_1
END
INSTEAD OF DELETE không thể được sử dụng như tôi đã xóa thác được kích hoạt trên bảng. – user1374263
FWIW, bạn có thể thay đổi tất cả các phím xóa các phím nước ngoài sang các khóa ngoại bằng và xử lý các xóa từ bên trong trình kích hoạt này, điều này sẽ làm cho nó rõ ràng ở một nơi mọi thứ đang xảy ra do xóa. – Tony
Nó có thể được thực hiện trong bước sau để giả sử trong ví dụ này tôi đang sử dụng bảng customer:
CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25) ,
LAST_UPDATED DATETIME,
PRIMARY KEY (ID)
);
Tạo Lịch sử:
CREATE TABLE CUSTOMERS_HIST( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25) , LAST_UPDATED DATETIME, PRIMARY KEY (ID) );
Trigger trên bảng nguồn như dưới đây về sự kiện xóa:
CREATE TRIGGER TRG_CUSTOMERS_DEL ON CUSTOMERS FOR DELETE AS INSERT INTO CUSTOMERS_HIST (ID, NAME, AGE, ADDRESS, LAST_UPDATED) SELECT ID, NAME, AGE, ADDRESS, LAST_UPDATED FROM DELETED
- 1. Làm thế nào để xóa kích hoạt trong SQL Server?
- 2. Làm cách nào để tạo trình kích hoạt bị tắt trong SQL Server 2005?
- 3. SQL Server 2005 - xoá trình kích hoạt bảng?
- 4. Trình kích hoạt SQL Server - thứ tự thực hiện
- 5. Sự cố khi tạo trình kích hoạt trong Oracle 11g
- 6. Cách xác thực trước khi kích hoạt chèn trong sqlite
- 7. tạo trình kích hoạt cho Sau khi chèn, sau khi cập nhật và sau khi xóa trong SQL
- 8. Trình kích hoạt máy chủ lưu trong SQL Server ở đâu?
- 9. Cách tạo kích hoạt MySQL trong phpmyadmin
- 10. Tạo trình kích hoạt SQL có điều kiện trong SQLite
- 11. Tạo trình kích hoạt trong Oracle Express
- 12. Trình kích hoạt không đồng bộ trong SQL Server 2005/2008
- 13. SQL Server 2005: T-SQL tạm thời vô hiệu hóa trình kích hoạt
- 14. Xác định khóa chính cũ trong Trình kích hoạt SQL
- 15. Đặt lại AutoIncrement trong SQL Server sau khi xóa
- 16. Kích hoạt SQL trên Truncate
- 17. Tạo trình kích hoạt PostgreSQL bằng cách sử dụng JDBC
- 18. postgres - kích hoạt trước khi giao dịch cam kết
- 19. Làm cách nào để chỉnh sửa giá trị của INSERT trong trình kích hoạt trên SQL Server?
- 20. Cập nhật trình kích hoạt T-SQL
- 21. Cột DateCreated hoặc Modified - Entity Framework hoặc sử dụng trình kích hoạt trên SQL Server
- 22. Làm thế nào để viết trình kích hoạt để hủy bỏ xóa trong MYSQL?
- 23. Làm cách nào để lấy ID cha mẹ ở trẻ sau khi xóa trình kích hoạt?
- 24. SQL: Xóa bản ghi trùng lặp trong SQL Server
- 25. xóa kích hoạt trong thạch anh
- 26. Trình kích hoạt có được khôi phục nếu giao dịch không thành công trong SQL Server không?
- 27. Trình kích hoạt MS SQL Server để cập nhật xếp hạng mục và số phiếu bầu
- 28. Cách di động nào nhất để kiểm tra xem trình kích hoạt có tồn tại trong SQL Server không?
- 29. Cuộc gọi kích hoạt trong tầng xóa
- 30. cách kích hoạt UISearchDisplayController với thuật ngữ được đặt trước?
Cảm ơn bạn đã trả lời, nó hoạt động tốt – user1374263
Ghi nhận rằng đối với rollback để làm việc trên một lỗi mà một khối try/catch có thể cần thiết trong vòng trigger [(ví dụ)] (http://dba.stackexchange.com/questions/57909) có thể phụ thuộc vào nguyên nhân gây ra lỗi. – crokusek
Điểm tốt, nhưng hãy nhớ rằng chỉ áp dụng cho RAISEERROR. Lỗi kết thúc báo cáo thông thường (ví dụ: vi phạm PK, v.v.) sẽ dẫn đến việc khôi phục giao dịch ngầm với bắt đầu bên ngoài trình kích hoạt. –