sql-server - 使用 SQL 存储过程从不同表中删除多条记录

标签 sql-server stored-procedures

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

    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 中选择的用户,以便知道要删除哪些用户,但我不知道该怎么做。其次,我只需要从 UserProfile 中选择具有 IsTemp = 1 的用户。我如何将其包含在我的选择语句中?我还知道我需要两个 SELECT 语句。一个选择UserID用于删除UserProfile, UserFriend, Image, and Message,另一个用于选择我将在 aspnet_Usersaspnet_Membership 中使用的 uniqueidentifier。请记住,除了基本的存储过程创建之外,我没有过多地处理 SQL。非常感谢任何帮助。

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

最佳答案

试试这个.. 首先获取您必须删除的 UserID 并将它们存储在 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)

关于sql-server - 使用 SQL 存储过程从不同表中删除多条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30793653/

相关文章:

mysql - SQL Diff 工具显示 2 个不同数据库服务器上 2 个相同存储过程的差异的原因是什么

mysql - 如何限制mysql存储过程中传递的日期数据

sql-server - Delphi Firedac SQL Server : no error raised when update fails because record is locked

sql - 生成唯一 ID 与多个表共享 SQL 2008

oracle - 如何扩展 Liquibase 以生成带有存储过程、函数和触发器的更改日志?

sql-server - 撇号和 SQL Server FT 搜索

sql - 调试发现错误 "Error converting data type varchar to real"

sql-server - BETWEEN 与日期实际上在 SQL SERVER 2008 中是否有效

python - SQLalchemy 并发连接速度慢

sql-server - 总结区间数据的最佳方法是什么?