現有的 SQL Server 2014 資料庫以 32 位整數存盤用戶的權限。
bit 0 = Read files
bit 1 = Move files
bit 2 = Delete files
bit 3 = Save files
etc.
如果該位為 1,則設定權限,如果該位 = 0,則不設定權限。
我需要一個查詢來顯示為給定用戶設定的所有權限。我有一個包含所有 32 個權限串列的表,但不確定如何將用戶表與權限表連接起來以獲取串列。
例如,如果用戶 Joe 的權限為 INT = 3,則查詢應回傳 2 行:
Read Files
Move Files
如果用戶 Peter 的權限為 INT = 8,那么查詢應該只回傳 1 行:
Save Files
如果用戶 Dave 的權限為 INT = 7,則查詢應回傳 3 行:
Read files
Move Files
Delete files
權限表有 3 列:bit#、value、description
0 0 Read Files
1 2 Move Files
2 4 Delete Files
3 8 Save Files
etc.
如果不同的或附加的列會有所幫助,我可以輕松地更改權限表的設計。
uj5u.com熱心網友回復:
一種方法是將標志存盤在一個表中(也許你已經有一個):
CREATE TABLE dbo.PermissionDefinitions
(i int, Permission varchar(32));
INSERT dbo.PermissionDefinitions(i, Permission)
VALUES
(1, 'Read files'),
(2, 'Move files'),
(4, 'Delete files'),
(8, 'Save files'); -- ... more ...
你有一個用戶表,其中有一列包含他們的權限集:
CREATE TABLE dbo.Users(Username sysname, PermissionSet int);
INSERT dbo.Users VALUES(N'Joe', 3), (N'Suzy', 15);
然后你可以只是cross join所有那些bitwise and:
SELECT u.Username, ps.Permission
FROM dbo.Users AS u
CROSS JOIN dbo.PermissionDefinitions AS ps
WHERE u.PermissionSet & ps.i = ps.i;
示例小提琴。
您還可以使用INNER JOIN,相同的結果,相同的計劃等。
SELECT u.Username, ps.Permission
FROM dbo.Users AS u
INNER JOIN dbo.PermissionDefinitions AS ps
ON u.PermissionSet & ps.i = ps.i;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/528470.html
標籤:sql服务器
