Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 server 权限存储为true/false,检索单行XOR';预计起飞时间_Sql Server_Stored Procedures - Fatal编程技术网

Sql server 权限存储为true/false,检索单行XOR';预计起飞时间

Sql server 权限存储为true/false,检索单行XOR';预计起飞时间,sql-server,stored-procedures,Sql Server,Stored Procedures,很难找到一种表达这个问题的方法,但基本上我要做的是从一个表中查询出一组权限值,该表表示以布尔值(bit)表示的权限,其中权限值为true或false 但是,用户可以直接拥有权限,也可以通过其所在的角色拥有权限,因此,用户可能没有删除其他人评论的权限,但其角色允许删除其他人的评论 因此,我想分析所有用户权限,如果在任何地方设置,则返回true,如果未设置,则返回false。因此,真值将覆盖所有假值 下面是权限表的SQL CREATE TABLE [xyz].[CommentPermissions]

很难找到一种表达这个问题的方法,但基本上我要做的是从一个表中查询出一组权限值,该表表示以布尔值(bit)表示的权限,其中权限值为true或false

但是,用户可以直接拥有权限,也可以通过其所在的角色拥有权限,因此,用户可能没有删除其他人评论的权限,但其角色允许删除其他人的评论

因此,我想分析所有用户权限,如果在任何地方设置,则返回true,如果未设置,则返回false。因此,真值将覆盖所有假值

下面是权限表的SQL

CREATE TABLE [xyz].[CommentPermissions](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Identifier] [uniqueidentifier] NOT NULL,
[IdentifierType] [int] NOT NULL,
[CanEditPermissions] [bit] NOT NULL DEFAULT ((0)),
[CanDeleteContainer] [bit] NOT NULL DEFAULT ((0)),
[CanEditOthersComments] [bit] NOT NULL DEFAULT ((0)),
[CanDeleteOthersComments] [bit] NOT NULL DEFAULT ((0)),
[CanPostComments] [bit] NOT NULL DEFAULT ((0)),
[CanBlockReplies] [bit] NOT NULL DEFAULT ((0)),
[CanReplyToOthers] [bit] NOT NULL DEFAULT ((1)),
[CanDeleteOwnComments] [bit] NOT NULL DEFAULT ((1)),
PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
现在来看一下,Identifier是一个表示用户或角色的guid,由IdentifierType表示,对于用户为0,对于角色为1

现在我已经编写了一个存储过程来连接它,因此我获得了所有用户的权限,包括他们所处的角色

ALTER PROCEDURE [xyz].[comments.getUserPermissions]
@UserId UNIQUEIDENTIFIER
AS
    SET NOCOUNT ON;
    SELECT 
        cp.CanEditPermissions,
        cp.CanDeleteContainer,
        cp.CanEditOthersComments,
        cp.CanDeleteOthersComments,
        cp.CanPostComments,
        cp.CanBlockReplies,
        cp.CanReplyToOthers,
        cp.CanDeleteOwnComments
        FROM [xyz].[CommentPermissions] as cp 
        LEFT OUTER JOIN [security].[Roles] as r on cp.Identifier = r.Id
        LEFT OUTER JOIN [security].[UsersInRoles] as ur on r.Id = ur.RoleId
        WHERE ur.UserId = @UserId or (cp.Identifier = @UserId AND cp.IdentifierType = 0)
RETURN 0
因此,它将角色表和UsersInRoles表上的标识符连接起来,其中UsersInRoles表的UserId等于传递给存储参数的UserId参数,然后我过滤其中ur.UserId等于参数或权限标识符等于用户类型(如果IdentifierType为0)

这有效地给了我用户在评论系统上的所有权限,但是

现在,我如何将这些行XOR在一起(同时尽量避免使用游标)

我现在得到的结果是这样的

我想要做的是,我想要一行,所有这些行基本上都合并在一起,这样1就可以覆盖0。但是,如果没有返回任何行,我希望返回所有0中的1行

更新:----------------- 我现在有了一个可行的解决方案,但我会保留这个选项,以防有人知道更好的方法来执行此操作,但下面是更新的存储过程

    SET NOCOUNT ON;
SELECT      
CONVERT(BIT, MAX(CONVERT(tinyint, cp.CanEditPermissions))) as 'CanEditPermissions',
CONVERT(BIT, MAX(CONVERT(tinyint, cp.CanDeleteContainer))) as 'CanDeleteContainer',
CONVERT(BIT, MAX(CONVERT(tinyint, cp.CanEditOthersComments))) as 'CanEditOthersComments',
CONVERT(BIT, MAX(CONVERT(tinyint, cp.CanDeleteOthersComments))) as 'CanDeleteOthersComments',
CONVERT(BIT, MAX(CONVERT(tinyint, cp.CanPostComments))) as 'CanPostComments',
CONVERT(BIT, MAX(CONVERT(tinyint, cp.CanBlockReplies))) as  'CanBlockReplies',
CONVERT(BIT, MAX(CONVERT(tinyint, cp.CanReplyToOthers))) as 'CanReplyToOthers',
CONVERT(BIT, MAX(CONVERT(tinyint, cp.CanDeleteOwnComments))) as 'CanDeleteOwnComments'
FROM [xyz].[CommentPermissions] as cp 
LEFT OUTER JOIN [security].[Roles] as r on cp.Identifier = r.Id
LEFT OUTER JOIN [security].[UsersInRoles] as ur on r.Id = ur.RoleId
WHERE (ur.UserId = @UserId or (cp.Identifier = @UserId AND cp.IdentifierType = 0)) or 1 = 1

因此,为什么不只返回第一行,并在没有返回行的情况下使用此线程中的答案之一。因为第二行可以设置权限,但第一行没有。例如,假设第一行有0表示CanEditPermissions,但第二行有1。在这种情况下,我需要第一行的所有内容,除了第一列和第二行的第一列。