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

SQL Trigger không thể thực hiện INSTEAD OF DELETE nhưng được yêu cầu cho ntext, cột hình ảnh

Bạn không thể truy cập các trường TEXT, NTEXT hoặc IMAGE từ INSERTED hoặc DELETED. Tuy nhiên, bạn có thể truy cập chúng từ bảng cơ sở bằng cách kết hợp với INSERTED. Điều này chỉ hoạt động đối với CHÈN và CẬP NHẬT vì trong XÓA, hàng cơ sở không còn tồn tại.

Để đạt được những gì bạn cần, trong một trình kích hoạt khác, hãy sao chép khóa chính và các cột TEXT, NTEXT và IMAGE vào một bảng phụ.

Ví dụ

create table C1(
   accountNo int identity primary key,
   someColumn nvarchar(10),
   someNtext ntext
)

create table C1_side(
   accountNo int primary key,
   someNtext ntext
)

create trigger trgC1_IU  on C1 AFTER INSERT, UPDATE
as
BEGIN
   -- Ensure side row exists
   insert C1_side(accountNo, someNtext)
   select accountNo from INSERTEd
   where not exists (select 1 from C1_side where C1_side.accountNo = inserted.accountNo)

   -- Copy NTEXT value to side row
   update C1_side
   set someNtext = c1.someNtext
   from C1_side inner join C1 on C1_side.accountNo = C1.accountNo
   inner join INSERTED on INSERTED.accountNo = C1.accountNo
   -- Could improve by checking if the column was updated for efficiency

END

Bây giờ, trong trình kích hoạt DELETE của bạn, bạn có thể tham gia DELETED đến C1_side để đọc giá trị trước đó của cột ntext. Lưu ý rằng bạn sẽ phải điền các giá trị ban đầu cho bảng phụ của mình, cho các hàng đã tồn tại trong C1.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DataTable tải rất chậm

  2. FixedLenNullInSource trong sp_help có nghĩa là gì?

  3. nhận ID bản ghi SQL mới

  4. 2 cách tạo cơ sở dữ liệu trên máy chủ được liên kết bằng T-SQL

  5. Các cách khắc phục lỗi máy chủ SQL phát hiện lỗi I / O dựa trên tính nhất quán logic