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

Có thể xác định rõ ràng liệu một lệnh DML có được phát hành từ một thủ tục được lưu trữ hay không?

Sử dụng CONTEXT_INFO (Transact-SQL) . Trong quy trình, hãy đặt một giá trị để cảnh báo trình kích hoạt không ghi lại bất kỳ thứ gì:

--in the procedure doing the insert/update/delete

DECLARE @CONTEXT_INFO  varbinary(128)
SET @CONTEXT_INFO =cast('SkipTrigger=Y'+REPLICATE(' ',128) as varbinary(128))
SET CONTEXT_INFO @CONTEXT_INFO

--do insert/update/delete that will fire the trigger

SET CONTEXT_INFO 0x0 

Trong trình kích hoạt, hãy kiểm tra CONTEXT_INFO và xác định xem bạn có cần làm gì không:

--here is the portion of the trigger to retrieve the value:

IF CAST(CONTEXT_INFO() AS VARCHAR(128))='SkipTrigger=Y'
BEGIN
    --log your data here
END

đối với bất kỳ ai chỉ thực hiện chèn / cập nhật / xóa giả mạo, họ sẽ không đặt CONTEXT_INFO và trình kích hoạt sẽ ghi lại thay đổi. Bạn có thể thích thú với giá trị bạn đặt vào CONTEXT_INFO, như tên bảng hoặc @@ SPID, v.v. nếu bạn cho rằng mã giả mạo cũng sẽ cố gắng sử dụng CONTEXT_INFO.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết nối với SQL Server LocalDB bằng JDBC

  2. Cách kiểm tra xem datetime có phải là thứ bảy hay chủ nhật trong SQL Server 2008 không

  3. Khi nào chúng ta phải sử dụng NVARCHAR / NCHAR thay vì VARCHAR / CHAR trong SQL Server?

  4. unsigned right shift '>>>' Toán tử trong máy chủ sql

  5. Việc chuyển đổi giá trị varchar đã làm tràn một cột int