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

Xóa bản ghi trong thay vì xóa trình kích hoạt

Phương pháp này sẽ thực hiện thủ thuật. Một trình kích hoạt thay vì sẽ thực hiện bất kỳ điều gì bạn chỉ định thay vì thực hiện xóa tự động. Điều này có nghĩa là bạn phải thực hiện xóa thủ công trong đó nếu không bản ghi sẽ không bị xóa. Nó sẽ không chạy đệ quy. Nó chỉ có thể được thực hiện trên một bảng mà không bật tính năng xóa theo tầng. Về cơ bản, mẹo là bạn tham gia vào bảng gốc trên trường id để lấy dữ liệu từ trường mà bạn không có quyền truy cập trong bảng giả đã xóa.

create table dbo.mytesting (test_id int, sometext text)
go
create table dbo.myaudit (test_id int, sometext text)
go
insert into dbo.mytesting
values (1, 'test')
go

Create Trigger audit_Table_Deletes on dbo.mytesting INSTEAD OF delete  
as 
if @@rowcount = 0 return; 
Insert into dbo.myaudit (test_id, sometext) 
Select d.test_id, t.sometext from deleted d 
join dbo.mytesting t on t.test_id = d.test_id

Delete dbo.mytesting where test_id in (select test_id from deleted)
go

delete dbo.mytesting where test_id = 1
select * from dbo.mytesting
select * from dbo.myaudit 
Go 

drop table dbo.mytesting
drop table dbo.myaudit

Nếu bạn có thể thay đổi trường thành varchar (max) hoặc nvarchar (max) thì đó là giải pháp tốt nhất. Văn bản và ntext không được dùng nữa và sẽ bị xóa hoàn toàn khỏi SQL Server trong phiên bản tiếp theo.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách sử dụng mệnh đề Where trong SQL ngắn mạch

  2. Cách tốt để sử dụng bí danh bảng trong câu lệnh Cập nhật?

  3. Lỗi SQL:Cú pháp không chính xác gần từ khóa 'Người dùng'

  4. Cách hiển thị dữ liệu từ cơ sở dữ liệu vào hộp văn bản và cập nhật nó

  5. CHÈN SỐ LƯỢNG LỚN với cột nhận dạng (tăng tự động)