2016-02-24 53 views
0

如果我使用一個INSTEAD OF DELETE類似於我的示例中的觸發器,它是否適用於我刪除記錄的每一行,還是必須指定它?如果沒有,我該怎麼辦?使用選擇不同的?謝謝:)INSTEAD:對於SQL Server 2012中的每一行

ALTER TRIGGER "rdowner"."TriggerDelete" ON "rdowner"."V_MyTable" 
INSTEAD OF DELETE 
AS 
BEGIN TRY 
    DECLARE @idActivity INT 

    SELECT @idActivity = rdowner.V_MyTable.Id, 
    FROM deleted 

    BEGIN 
     myDeleteRoutine 
    END 
END TRY 

BEGIN CATCH 
    SELECT 
      ERROR_NUMBER() AS ErrorNumber, 
      ERROR_SEVERITY() AS ErrorSeverity, 
      ERROR_STATE() as ErrorState, 
      ERROR_PROCEDURE() as ErrorProcedure, 
      ERROR_LINE() as ErrorLine, 
      ERROR_MESSAGE() as ErrorMessage 
END CATCH 

我的觸發需要的@idActivity,時間戳和每個刪除的行的一個varchar變量登錄到另一個表

+4

SQL服務器將觸發** **從來沒有在每個工作」行「 - 它們在每個語句中被稱爲** ONCE **,所以如果你的DELETE語句刪除了50行,你的觸發器被稱爲** ONCE **,並且'Deleted'僞表包含了你需要處理的50行以**基於**的方式 –

+0

是的。寫一個觸發器,不知道絕對的根本。請,你可以做得更好。 – TomTom

+0

@marc_s非常感謝marc,這對我有幫助! – STDLN

回答

0

在此基礎上:

我的觸發需要登錄的@idActivity,時間戳和VARCHAR變量的每一行被刪除到另一個表中

然後BEGIN TRYEND TRY之間,你只需要這樣:

INSERT INTO MyLogTable (ID, Column1,Column2, TimeStampColumn) 
SELECT ID, Column1,Column2,GETDATE() 
FROM DELETED 

同樣的建議改變你的錯誤日誌記錄到一個表或完全刪除

+0

非常感謝尼克,這是我需要的。 – STDLN

0

INSTEAD OF觸發器使我們什麼樣的行動,我們打算請注意,此操作不會影響基表。如果我們執行此刪除,我們將訪問將被刪除的數據。以下是一些可幫助您的示例:

--create basic觸發器:

create trigger trg_insd_test 
on dbo.test1 
instead of delete 
as 
begin 
select 'trigger fired' 
select * from deleted 
end 

--now可以刪除所有行,看看觸發器是如何燒製

delete from test1 

輸出:
即使我嘗試刪除所有行觸發只能觸發一次,我有機會獲得這些都是行刪除
enter image description here

現在可以刪除批次:

delete top(10) from test1 
go 10 

輸出繼電器:
你可以看到觸發每批被觸發
enter image description here

+0

謝謝,這是幫助:) – STDLN