调用另一个存储过程的存储过程按部分名称过滤列,然后将第二个SP的返回数与列数

时间:2016-12-07 21:25:57

标签: sql sql-server stored-procedures

目标是获取用户拥有的密码数量,并将其与公司规则进行比较。如果它超过了它们允许的数量,我们插入新的(带有日期)并删除最后一个(或删除最后一个然后插入新的。我老实说已经找到了我想去的方式)。< / p>

我有两个存储过程:Delete_Oldest_Password_And_DateNumber_Of_Passwords

Delete_Oldest_Password_And_Date来电Number_Of_Passwords,因为我需要这笔金额。

我很确定我的存储过程的开头是好的。这是下半场,从@Temp_Password_Table开始。

CREATE Procedure Delete_Oldest_Password_And_Date
    @ua_pk uniqueidentifier
AS
    DECLARE @Temp_Table table
    (
        numberOfPasswords INT
    )

    INSERT INTO @Temp_Table
    EXEC Number_Of_Passwords @ua_pk
    SELECT *    
    FROM
        @Temp_Table

    DECLARE @Temp_Password_Table table
    (
    password varchar(max)
    )

    SELECT *
    FROM User_Passwords
    WHERE User_Passwords.ua_fk = @ua_pk
    AND up_Password LIKE '%Password%'

GO

GRANT EXEC ON Delete_Oldest_Password_And_Date TO WEB

GO

我还没有担心删除。我更担心的是首先获得正确的信息。

请记住,User_Passwords是每人动态的。计划(我尚未完成此部分)是让最新的列进入名为“up_Password1”的列,然后进入第二个最新的列“up_Password2”等。

1 个答案:

答案 0 :(得分:1)

这里是一个将检查用户拥有的密码数量的proc,并将删除最旧的密码,直到有Max#ofPasswords-1,从而设置插入的新密码仍然是遵循历史密码数量的策略。 proc假设如下表:

CREATE TABLE dbo.User_Passwords(
    ua_fk UNIQUEIDENTIFIER,
    password_hash NVARCHAR(100),
    start_date DATETIME,
    end_date DATETIME)

Password_hash可以是您决定存储密码列的任何内容(请不要在此处以明文形式存储实际密码)。

CREATE Procedure Delete_Oldest_Password_And_Date
    @ua_pk uniqueidentifier
AS
    DECLARE @numberOfPasswords INT,
            @MaxPasswordNum INT = 10

    SELECT @numberOfPasswords = COUNT(*)    
    FROM User_Passwords
    WHERE ua_fk = @ua_pk

    IF @numberOfPasswords >= @MaxPasswordNum
    BEGIN
        WITH T
        AS (SELECT TOP (@numberOfPasswords - (@MaxPasswordNum-1)) *
            FROM   User_Passwords
            WHERE  ua_fk = @ua_pk
            ORDER BY end_date ASC)
        DELETE FROM T; 
    END

GO