Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用于登录的存储过程未按预期工作_Sql_Sql Server - Fatal编程技术网

Sql 用于登录的存储过程未按预期工作

Sql 用于登录的存储过程未按预期工作,sql,sql-server,Sql,Sql Server,我有3个表,用户、角色和用户角色 CREATE TABLE [Web].[Users] ( [Employee_ID] [Nvarchar] (10) NOT NULL PRIMARY KEY, [Username] [nvarchar] (25) NOT NULL, ) GO CREATE TABLE [Web].[Roles] ( [Role_ID] [Int] NOT NULL IDENTITY PRIMARY KEY, [Roles] [nvarcha

我有3个表,用户、角色和用户角色

CREATE TABLE [Web].[Users]
(
    [Employee_ID] [Nvarchar] (10) NOT NULL PRIMARY KEY,
    [Username] [nvarchar] (25) NOT NULL,
) 
GO

CREATE TABLE [Web].[Roles]
(
    [Role_ID] [Int] NOT NULL IDENTITY PRIMARY KEY,
    [Roles] [nvarchar] (25) NOT NULL,
) 
GO

CREATE TABLE [Web].[User_Roles]
(
    [Employee_ID] [Nvarchar](10) NOT NULL,
    [Role_ID] [int] NOT NULL,
    CONSTRAINT FK_Employee_ID 
        FOREIGN KEY (Employee_ID) REFERENCES [Web].[Users] (Employee_ID) 
                ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT FK_Role_ID 
        FOREIGN KEY (Role_ID) REFERENCES [Web].[Roles] (Role_ID),
    CONSTRAINT pk_User_Roles PRIMARY KEY (Employee_ID, Role_ID)
); 
它的工作方式是,当您登录时,它根据
Users
表中的
Employee\u ID
检查您的用户名,然后转到
User\u Roles
表,并将从
Users
表中获得的
Employee\u ID
User\u Roles
表相匹配。然后它从
User\u Roles
表中获取
Role\u ID
,并将
Role\u ID
Roles
表中的角色相匹配

我正在尝试编写一个执行检查的存储过程,到目前为止我已经接近完成,但我觉得我遗漏了一些东西。希望我能得到帮助。这就是我目前所拥有的

CREATE PROCEDURE [Web].[Get_User_Roles]
    @Username NVARCHAR(25)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @Employee_ID Nvarchar, @Role_ID INT

    SELECT @Employee_ID = @Employee_ID, @Role_ID = @Role_ID
    FROM [Web].[Users] 
    WHERE @Employee_ID = @Employee_ID AND @Role_ID = @Role_ID 

    IF @Employee_ID IS NOT NULL
    BEGIN
        IF NOT EXISTS (SELECT @Employee_ID FROM [Web].Users 
                       WHERE @Username = Username)
        BEGIN
            SELECT 
                @Employee_ID [Employee_ID],
                (SELECT @Role_ID FROM User_Roles
                 WHERE @Role_ID = @Role_ID) [Roles]-- User Valid
        END
        ELSE 
        BEGIN
            SELECT -2 [@Username], '' [Roles]--User not activated
        END
    END
    ELSE
    BEGIN
        SELECT -1 [@Username], '' [Roles]-- User invalid
    END
END

如有任何改进,我们将不胜感激。我把表格代码放在上面,这样就可以使用了。我将在本节以及中间部分再次询问我的最终结果。它的工作方式是,当您登录时,它将根据用户表中的员工ID检查您的用户名,然后转到用户角色表,并将从用户表中获得的员工ID与用户角色表中的员工ID进行匹配。然后,它从User_Roles表中获取Role_ID,并将Role_ID与Roles表中的角色相匹配。我正在尝试创建一个执行检查的存储过程,到目前为止,我已经很接近了,但我觉得我遗漏了一些东西。希望我能得到帮助。这就是我目前所拥有的

首先,这部分根本不起作用:

CREATE PROCEDURE [Web].[Get_User_Roles]
    @Username NVARCHAR(25)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @Employee_ID Nvarchar, @Role_ID INT

    SELECT @Employee_ID = @Employee_ID, @Role_ID = @Role_ID
    FROM [Web].[Users] 
    WHERE @Employee_ID = @Employee_ID AND @Role_ID = @Role_ID 

    IF @Employee_ID IS NOT NULL
    BEGIN
        IF NOT EXISTS (SELECT @Employee_ID FROM [Web].Users 
                       WHERE @Username = Username)
        BEGIN
            SELECT 
                @Employee_ID [Employee_ID],
                (SELECT @Role_ID FROM User_Roles
                 WHERE @Role_ID = @Role_ID) [Roles]-- User Valid
        END
        ELSE 
        BEGIN
            SELECT -2 [@Username], '' [Roles]--User not activated
        END
    END
    ELSE
    BEGIN
        SELECT -1 [@Username], '' [Roles]-- User invalid
    END
END
        select @Employee_ID = @Employee_ID, @Role_ID = @Role_ID
    from [Web].[Users] WHERE @Employee_ID = @Employee_ID and @Role_ID = @Role_ID 
您在WHERE语句中将变量与其自身进行比较,将变量相互分配,并且在[Web].[Users]表中没有角色ID。试试下面的方法

SELECT Employee_ID, Roles
FROM  [Web].[Users] A
INNER JOIN  [Web].[User_Roles] B
 ON A.[Employee_ID] = B.[Employee_ID]
INNER JOIN [Web].[Roles] C
 ON b.[Role_ID] = C.[Role_ID]
WHERE [Username] = @Username

如果用户使用该用户名,此代码将返回员工id和角色,否则返回空数据集。

仍然不太清楚要输出什么,但我认为应该是这样的。如果用户没有角色,则在UserStatus列中返回-2。否则,它将在该列和角色中返回1。调用此函数时,应该检查是否返回了行。如果它不返回任何行,则用户不存在

select UserStatus = case when ur.Role_ID is null then -2 else 1 end
    , r.Roles
from Web.Users u
left join Web.User_Roles ur on ur.Employee_ID = u.Employee_ID
left join Web.Roles r on r.Role_ID = ur.Role_ID
where u.Username = @Username

选择@Employee\u ID=@Employee\u ID、@Role\u ID=@Role\u ID
?这句话的目的是什么?它只是将
@Employee\u ID
的值设置为
@Employee\u ID
的值;这是毫无意义的,因为它是
@Employee\u ID
。我被告知需要设置它,以便在存储过程中将这两个值放在一起。返回
选择@Employee\u ID=@Employee\u ID,@Role\u ID=@Role\u ID=@Role\u ID from[Web].[用户]其中@Employee\u ID=@Employee\u ID=@Employee\u ID和@Role\u ID=@Role\u ID
实际上毫无意义。这是为了达到什么目的?不,你没有被错误地告知,你的编码是错误的。您正在检查变量的值是否等于无意义变量的值。您应该检查变量的值是否等于表中某列的值。您在发布的代码中有许多挑战。每次引用变量时,它都不是您想要做的。你有一个没有大小的varchar。这件事需要彻底重建。@SeanLange我想很明显我的编码不正确,所以我请求帮助修复它。我只是按照你的建议做了一些改变。我马上就要编辑了。也许可以使用左连接,这样就可以清楚地知道缺少了什么?@Hogan我想你只想抓取那些实际附加了一些角色的用户。但是,如果用户没有角色是可以接受的,我们可以使用左连接。@Alex是正确的。我们只需要具有角色的用户。如果没有角色,则不接受登录。这就是我提取原始代码的地方。这可能对你有帮助。我的输出取决于用户输入的有效用户名。然后检查用户名和员工ID,然后检查员工ID和角色ID,然后检查角色ID和角色。在所有这些检查之后,它会弹出带有角色的有效用户名或无效用户或没有角色的有效用户。sql的第一行对我来说就足够了。他们接收明文密码并将其以明文形式存储在表中。这一逻辑有着可悲的缺陷。如果用户有多个角色,则该示例中的代码将只返回一个角色。你可以找到更好的例子来说明如何做这类事情。