SQL Server:需要记录处理建议

时间:2016-05-20 01:12:11

标签: sql-server token

我在尝试成功跟踪发送到服务器的令牌时遇到问题。令牌用于Android应用程序中的GCM通知。

场景是这样的:当用户安装应用程序时,我创建一个GCM令牌,将其存储在共享首选项中并将其发送到我的服务器进行存储,以便稍后发送通知。这部分很容易。将令牌存储在我的服务器和应用程序用户手机上没问题。我可以向未在应用中注册帐户的最终用户发送常规通知。

如果用户注册了帐户并登录了他们的帐户,我会更新并将用户ID与令牌相关联。当我想向单个应用用户发送特定通知时,这有助于我。到目前为止仍然很容易。

这是我的表和存储过程,用于更新

demoCroque

这是我遇到问题的/home/Escritorio/demoCroque存储过程。我是第一次安装应用程序,现在我有一个令牌。好东西..然后我注册并登录,现在我有一个用户ID令牌。很棒...然后我买了一部新手机并下载了应用程序。生成并存储了新令牌,问题是当我登录并尝试更新新创建的令牌时,我已经在表中存储了用户ID。我不确定UID是否是最好的方法。

我不确定是否应该以不同方式设置我的表格。我知道我想确保我可以跟踪没有错误的令牌。我想我可能需要一些删除语句,在存储过程中的某些地方,不确定。

非常感谢任何帮助或建议。

2 个答案:

答案 0 :(得分:2)

这可能更简洁。它使用RETURN而不是SELECT立即退出,为意外状态抛出错误。它还假定USTAMPISTAMP已定义默认值。不确定为什么要添加3小时,但您可能需要查看时区感知数据类型。

CREATE PROCEDURE [dbo].[spGCMupdate]
@T VARCHAR(255),
@U VARCHAR (128)
AS
BEGIN
    -- If this is a new user against existing token, update it
    UPDATE NOTIFICATION
    SET 
    USTAMP = DATEADD(HH, 3, GETDATE()),
    USER = @U
    WHERE TOKEN = @T
    AND (USER IS NULL OR USER <> @U)

    IF @@ROWCOUNT > 0
        RETURN 1 

    -- If this is an existing user against a different token 
    -- change the token
    UPDATE NOTIFICATION
    SET 
    USTAMP = DATEADD(HH, 3, GETDATE()),
    TOKEN = @T
    WHERE USER = @U
    AND TOKEN <> @T

    IF @@ROWCOUNT > 0
       RETURN 2

    -- Completely new
    INSERT INTO NOTIFICATION(TOKEN, UID)
    SELECT @T, @U
    WHERE NOT EXISTS (
        SELECT * FROM NOTIFICATION
        WHERE TOKEN = @T
        AND USER = @U

    IF @@ROWCOUNT > 0
       RETURN 3


    IF EXISTS (
        SELECT * FROM NOTIFICATION
        WHERE TOKEN = @T
        AND USER = @U
        )
        RETURN 4 -- Already exists. No change

    THROW 60000 ,'Unexpected State encountered'
END

答案 1 :(得分:0)

感谢Nick的建议。它帮助我提出了一个解决方案。我不知道这是不是最好的解决方案,但它似乎满足了所有的要求,这是我今晚能想到的最好的,也许有一些睡眠,我会想出更好的东西。我相信还有改进的余地。

CREATE PROCEDURE [dbo].[spGCMupdate]
@T VARCHAR(255),
@U VARCHAR (128),
@RESULT TINYINT OUTPUT
AS
BEGIN
    DECLARE @PAIR int
        SET @PAIR = (SELECT COUNT(TOKEN) FROM NOTIFICATION WHERE TOKEN = @T AND UID = @U)

    IF (@PAIR = 1) -- the Token and Userid are already paired no update required
           BEGIN
           SET @RESULT = '1' -- all good
           END
    ELSE IF (@PAIR = 0) -- attempt to pair
               BEGIN
           UPDATE NOTIFICATION SET UID = @U, USTAMP = DATEADD(HH, 3, GETDATE()) WHERE UID IS NULL AND TOKEN = @T  --add uid to token
               END
        ELSE IF (@@ROWCOUNT = 0)
               BEGIN
           UPDATE NOTIFICATION SET TOKEN = @T, USTAMP =  DATEADD(HH, 3, GETDATE()) WHERE UID = @U -- handle a token update
               END  
    IF (@@ROWCOUNT=0 AND @PAIR =0)  -- Last Resort
           BEGIN
           DELETE FROM NOTIFICATION WHERE TOKEN = @T OR UID = @U -- delete Token and User Id 
           INSERT INTO NOTIFICATION(TOKEN, UID, USTAMP, ISTAMP) VALUES (@T, @U, DATEADD(HH, 3, GETDATE()), DATEADD(HH, 3, GETDATE())) --Insert new pair
               END
    IF (@@ROWCOUNT > 0)
               BEGIN 
               SET @RESULT = '1'
               END
        ELSE IF (@@ROWCOUNT=0 AND @PAIR =0)  
               BEGIN 
               SET @RESULT = '0'
               END

    SELECT @RESULT
END