Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

mbencheva avatar mbencheva 52 Точки

[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 149 Точки

Командата, която получаваме в 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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.