Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изтриване на записи в тригера Вместо изтриване

Този метод трябва да свърши работа. Вместо тригер ще направи каквото посочите, вместо да извърши изтриването автоматично. Това означава, че е от ключово значение да направите изтриването в него ръчно или записът няма да бъде изтрит. Няма да работи рекурсивно. Може да се направи само на маса без активирано каскадно изтриване. По принцип трикът е, че се присъединявате към оригиналната таблица в полето id, за да получите данните от полето, до което нямате достъп в изтритата псевдотаблица.

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

Ако можете да промените полето на varchar(max) или nvarchar(max), това е най-доброто решение. Text и ntext са остарели и трябва да бъдат премахнати изцяло от SQL Server в следващата версия.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какви са предимствата от използването на синтаксиса на конструктора на редове в оператор за вмъкване на T-Sql?

  2. VBA код за добавяне на свързана таблица с първичен ключ

  3. SQL Server 2000 - Свързан сървър

  4. Как да създадете първичен ключ в SQL Server (T-SQL примери)

  5. как да намерите размера на редовете в таблицата