[SQL Server Exam Preparation - 12 -Oct] - Bonus задачата

[SQL Server Exam Preparation - 12 -Oct] - Bonus задачата

mbencheva avatar mbencheva 55 Точки

[SQL Server Exam Preparation - 12 -Oct] - Bonus задачата

Здравейте, 

По условие имаме:

Create a table with the same structure as table Accounts and name it AccountLogs. Then create a trigger that logs the deleted records from table Accounts into table AccountLogs. Post in judge only the create trigger statement.

Може ли някой да ми обясни логиката да трием записите от "EmployeesAccounts" в тригера?

(то едва ли не ако го нямаме тригер, не можем да трием записи от Accounts?).

Може би е тъп въпрос, ама не намирам отговор :-)

Благодаря предварително, 

Мария

Тагове:
0
Databases Basics
Rextor92 avatar Rextor92 150 Точки

Командата, която получаваме в judge е просто DELETE, следователно операцията не минава, защото нарушаваме FK ограничение към таблица EmployeesAccounts. Може да предотвратим това с CASCADE DELETE, което принципно... може да ти затрие хиляди записи в някоя голяма база данни с много навързани таблици.

Тригера FOR DELETE съответно също не работи - той се изпълнява след изтриване на реда в таблицата, а изтриването е невъзможно. Ако използваме INSTEAD OF DELETE обаче всичко е точно: взимаме AccountID от временната deleted таблица, трием записите с това AccountID в таблица EmployeesAccounts, трием го в Accounts и го вписваме в AccountLogs. Така предотвратяваш някакви неочаквани ефекти от CASCADE DELETE, предполагам : гарантираш, че ако имаш повече от 1 ниво надолу (като връзки между таблиците) няма да изтриеш всичко.

За колегата, който искаше работещ код във фейсбук - ето моето решение.

CREATE TRIGGER AccountLoggerTrigger
    ON [Accounts]
    INSTEAD OF DELETE
AS
  BEGIN
	DECLARE @id INT
	SELECT @id = [AccountID] FROM deleted

	DELETE FROM [dbo].[EmployeesAccounts]
		WHERE [EmployeesAccounts].[AccountID] = @id
  	DELETE FROM [dbo].[Accounts]
  		WHERE [AccountID] = @id
    INSERT INTO AccountLogs([AccountID], [AccountNumber], [StartDate], [CustomerID])
      SELECT d.[AccountID], d.[AccountNumber], d.[StartDate], d.[CustomerID]
        FROM Deleted d
  END

 

0
14/10/2016 16:50:56