从 3 table 中获取删除的值并放入 1 table

Get deleted values from 3 tables and put in 1 table

我有三张表

最终用户可以从 ASP 的下拉列表中 select 一个 top2000jaar,它会将其值发送到存储过程,存储过程必须删除 [LIJST] 中的所有值] 其中 top2000jaar 等于已 selected 的值,但需要一个触发器,当该歌曲 ID 不再存在于 [LIJST] 中时,它会从 [SONG] 中删除 song.songid = lijst.songid 的行, 因此如果 [artiest] 中的艺术家在 [song] 中没有更多歌曲,则该艺术家也应该被删除。

所有删除的数据都应该放在[logtable]中

我尝试了一种我认为可行的方法,但没有。

预期输出应该是这样的:

<- 31-dec-13 打错了,是 2013

这是创建的触发器,我在 google 上找到了一些答案,但没有用:

ALTER TRIGGER [dbo].[TRGremoveSong]
ON [dbo].[Lijst]
AFTER DELETE AS

Begin
DELETE FROM song where songid not in (Select songid from lijst)
END
begin
INSERT INTO logtable
   SELECT 
       *
   FROM deleted
 end

您只需将逻辑添加到存储过程即可完成所有这些操作,如下所示:

DECLARE @LIJSTID_TO_DELETE INT = 123
DECLARE @SongID INT
DECLARE @ArtistID INT

-- SET the songid for the row you're going to delete
SELECT @SongID = songid 
FROM LIJST 
WHERE top2000jaar = @LIJSTID_TO_DELETE

-- first deletion
DELETE FROM LIJST 
WHERE top2000jaar = @LIJSTID_TO_DELETE

IF @@ROWCOUNT > 0
    INSERT INTO LOGTABLE.... -- deleted LIJST values

-- set the artist id for the song you are going to delete
SELECT @ArtistID = artiestid
FROM Song 
WHERE songid = @SongID

-- delete the linked song (could use cascade delete if required)
DELETE FROM Song
WHERE songid = @SongID

IF @@ROWCOUNT > 0
    INSERT INTO LOGTABLE.... -- deleted song values

-- Delete the artist if their songs no longer exist
IF NOT EXISTS (SELECT * FROM Song WHERE artiestid = ArtistID )
BEGIN
    DELETE FROM Artiest
    WHERE artiestid = @ArtistID 

    IF @@ROWCOUNT > 0
        INSERT INTO LOGTABLE.... -- deleted artiest values
END

@@ROWCOUNT 只是 returns 受前一条语句影响的行数,因此它只会在删除一行时记录。

我相信使用它作为你的触发器应该可以完成这项工作,这只会填充实际已删除的内容,因此如果没有删除艺术作品,它将在歌曲旁边显示为 null 等。

ALTER TRIGGER [dbo].[TRGremoveSong]
ON [dbo].[Lijst]
AFTER DELETE AS

Begin
   INSERT INTO logtable
   SELECT  sng.titel, art.naam, sng.jaar, positie, top2000jaar
   FROM deleted d
   Outer Apply
   (Select titel, jaar, artiestid from song where not exists (Select * from lijst where songid = d.songid) and songid = d.songid) sng
   Outer Apply
   (Select naam from artiest where not exists (Select * from song where artiestid = sng.artiestid and songid <> d.songid) and artiestid = sng.artiestid) art

DELETE FROM song s where not exists (Select * from lijst where songid = s.songid)
DELETE FROM artiest a where not exists (Select * from song where artiestid = a.artiestid)
End

这是一个 SQLFiddle 示例,其中第 9 首歌曲已被删除,这是该艺术家的最后一首歌:http://sqlfiddle.com/#!6/4405b/1/0

以下将显示删除时的所有字段:

ALTER TRIGGER [dbo].[TRGremoveSong]
ON [dbo].[Lijst]
AFTER DELETE AS

Begin
   INSERT INTO logtable
   SELECT  sng.titel, art.naam, sng.jaar, positie, top2000jaar
   FROM deleted d
   Outer Apply
   (Select titel, jaar, artiestid from song where songid = d.songid) sng
   Outer Apply
   (Select naam from artiest where artiestid = sng.artiestid) art

DELETE FROM song s where not exists (Select * from lijst where songid = s.songid)
DELETE FROM artiest a where not exists (Select * from song where artiestid = a.artiestid)
End

这是用于此的 SQLFiddle:http://sqlfiddle.com/#!6/fd6171/1/0