Не может заставить оператор IF SQL работать - getting:The многослойный идентификатор “d. ExpiryDate” не мог быть связан

Я пытаюсь назвать оператор 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

Спасибо за справку!

1
задан Spooks 6 July 2010 в 19:30
поделиться

3 ответа

Вам нужно будет указать 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()

Или, что еще лучше, написать хранимую процедуру, которая удаляет строки, вместо того, чтобы удалять их непосредственно из таблицы. Хранимые процедуры легче понять и поддерживать, чем триггеры.

1
ответ дан 2 September 2019 в 23:14
поделиться

Я считаю, что это именно то, что вам нужно, так как это будет правильно обрабатывать случаи, когда вы удаляете более одной строки за раз, а также проверять условие, которое вы хотите для каждой строки.

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
0
ответ дан 2 September 2019 в 23:14
поделиться

Нигде нет таблицы или представления с псевдонимом 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 блок - он не за пределами этого блока! Вы можете использовать псевдоним таблицы только в заявлении, которое его объявляет - он не виден глобально.

1
ответ дан 2 September 2019 в 23:14
поделиться