Я пытаюсь назвать оператор IF на своем триггере, таким образом, он не заархивирует истекшие файлы. (Я только хочу сохранить файлы, которые были удалены, но не истекли),
Моя ошибка является многослойным идентификатором "d. ExpiryDate" не мог быть связан.
Мой код:
ALTER TRIGGER [dbo].[ArchiveDB]
ON [dbo].[TBL_Content]
AFTER DELETE
AS
BEGIN
declare @ContentID int
set @ContentID = (select ContentID from deleted)
IF (d.ExpiryDate > getDate() )
begin
insert into ArchiveBackup.dbo.TBL_Deleted_Content
(ContentID, StartDate, ExpiryDate, Title... etc)
select
d.ContentID,d.StartDate,d.ExpiryDate,d.Title... etc
from deleted as d
end
END
Спасибо за справку!
Вам нужно будет указать SQL Server, где найти ExpiryDate, например:
if ((select ExpiryDate from deleted) > getdate())
Имейте в виду, что триггер может быть вызван в случаях, когда несколько строк были удалены. Возможно, лучше было бы полностью заменить if
на запрос:
insert into ArchiveBackup.dbo.TBL_Deleted_Content
(ContentID, StartDate, ExpiryDate, Title... etc)
select
d.ContentID,d.StartDate,d.ExpiryDate,d.Title... etc
from deleted as d
where ExpiryDate > getdate()
Или, что еще лучше, написать хранимую процедуру, которая удаляет строки, вместо того, чтобы удалять их непосредственно из таблицы. Хранимые процедуры легче понять и поддерживать, чем триггеры.
Я считаю, что это именно то, что вам нужно, так как это будет правильно обрабатывать случаи, когда вы удаляете более одной строки за раз, а также проверять условие, которое вы хотите для каждой строки.
ALTER TRIGGER [dbo].[ArchiveDB]
ON [dbo].[TBL_Content]
AFTER DELETE
AS
BEGIN
insert into ArchiveBackup.dbo.TBL_Deleted_Content (ContentID, StartDate, ExpiryDate, Title... etc)
select
d.ContentID,d.StartDate,d.ExpiryDate,d.Title... etc
from
deleted as d
where
d.ExpiryDate > getDate()
END
Нигде нет таблицы или представления с псевдонимом d
- неудивительно, что он не может их найти!
В этом случае вам необходимо использовать полное имя таблицы:
ALTER TRIGGER [dbo].[ArchiveDB]
ON [dbo].[TBL_Content] AFTER DELETE
AS BEGIN
declare @ContentID int
set @ContentID = (select ContentID from deleted)
IF (deleted.ExpiryDate > getDate() )
BEGIN
insert into ArchiveBackup.dbo.TBL_Deleted_Content
(ContentID, StartDate, ExpiryDate, Title... etc)
select
d.ContentID,d.StartDate,d.ExpiryDate,d.Title... etc
from deleted as d
END
END
Псевдоним d
объявляется и используется только внутри BEGIN ... END
блок - он не за пределами этого блока! Вы можете использовать псевдоним таблицы только в заявлении, которое его объявляет - он не виден глобально.