使用SQL存储过程从不同的表中删除多个记录

时间:2015-06-12 00:41:10

标签: sql-server stored-procedures

我正在尝试创建一个每5分钟左右执行一次存储过程的SQL代理作业,但我对部分SQL语法感到茫然。我正在使用表单身份验证,我需要选择在过去15分钟内未处于活动状态并且还被标记为临时的所有用户。为此,我将从表LastActivityDate中抓取aspnet_Users并从表IsTemp抓取UserProfile。选择后,我需要从我的数据中删除此用户的所有痕迹。以下是我的问题所需表格的基本结构:

    aspnet_Users(uniqueidentifier UserId PK)
    aspnet_Membership(uniqueidentifier UserId FK)
    UserProfile(int UserProfileID PK, uniqueidentifier aspnetUserID FK, int IsTemp)
    UserFriend(int UserFriendID PK, int UserProfileID FK)
    Image(int ImageID PK, int UserProfileID FK)
    Message(int MessageID, int UserProfileID FK)

这是我到目前为止所拥有的:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE PROCEDURE [dbo].[CleanUpUserProfiles] 
        -- Add the parameters for the stored procedure here
    AS
    BEGIN
        SET NOCOUNT ON;

        SELECT *
        FROM [UserProfile]
        WHERE IsTemp = 1

        SELECT *
        FROM [aspnet_Users]
        WHERE LastActivityDate < DATEADD(mi, -15, CURRENT_TIMESTAMP)

        SELECT *
        FROM [UserProfile]
        WHERE IsTemp = 1

        DELETE FROM [Message]
        WHERE ??? = @???

        DELETE FROM [Image]

        DELETE FROM [UserFriend]

        DELETE FROM [UserProfile]

        DELETE FROM [aspnet_Membership]

        DELETE FROM [aspnet_Users]

    END
    GO

我知道我需要一个变量来保存aspnet_Users中的所选用户,以便知道要删除哪些用户,但我不知道该怎么做。其次,我只需要从IsTemp = 1中选择UserProfile的用户。我如何在我的select语句中包含它?我也明白,我需要两个SELECT的陈述。一个选择UserID用于删除UserProfileUserFriendImageMessage,另一个用于选择uniqueidentifier我将在aspnet_Usersaspnet_Membership中使用。请记住,除了基本的存储过程创建之外,我还没有处理过SQL。非常感谢任何帮助。

如果有人对我为什么要这样做感到好奇......我允许用户通过在进入我的服务时只创建一个用户名来保持匿名。这些用户将是临时的,如果有人出现并希望在几天后使用相同的用户名,我不想禁止他们这样做。我也不想挂在不必要的数据上,感觉很脏。

1 个答案:

答案 0 :(得分:3)

试试这个..首先获取您必须删除的UserID's并将其存储在Temp表中。

Select a.UserID into #UserToDelete from aspnet_users a
inner join UserProfile b on a.UserID = b.aspnetUserID
where IsTemp=1 and LastActivityDate < DATEADD(mi, -15, CURRENT_TIMESTAMP)

现在从所有交易表中删除所有这些用户。

DELETE FROM [Message] where UserProfileID in (select userid from #UserToDelete)
DELETE FROM [Image] where UserProfileID in (select userid from #UserToDelete)   
DELETE FROM [UserFriend] where UserProfileID in (select userid from #UserToDelete)  
DELETE FROM [UserProfile] where aspnetUserID in (select userid from #UserToDelete)
DELETE FROM [aspnet_Membership] where userID in (select userid from #UserToDelete)
DELETE FROM [aspnet_Users] where userID in (select userid from #UserToDelete)