DB2:无法读取数据

问题描述 投票:0回答:1
--FP01
-- Membuat roles
CREATE ROLE admin_role;
CREATE ROLE distributor_role;
CREATE ROLE sales_role;
CREATE ROLE inventory_manager_role;

-- Membuat user admin
CREATE USER useradmin WITH PASSWORD 'rahasia';
GRANT CONNECT ON DATABASE TO USER useradmin;
GRANT ROLE admin_role TO USER useradmin;

-- Membuat user distributor
CREATE USER userdistributor WITH PASSWORD 'rahasia';
GRANT CONNECT ON DATABASE TO USER userdistributor;
GRANT ROLE distributor_role TO USER userdistributor;

-- Membuat user untuk role sales
CREATE USER usersales WITH PASSWORD 'rahasia';
GRANT CONNECT ON DATABASE TO USER usersales;
GRANT ROLE sales_role TO USER usersales;

-- Membuat user untuk role inventory manager
CREATE USER userinvmngr WITH PASSWORD 'rahasia';
GRANT CONNECT ON DATABASE TO USER userinvmngr;
GRANT ROLE inventory_manager_role TO USER userinvmngr;

-- Memberikan hak akses penuh ke admin
GRANT ALL PRIVILEGES ON TABLE Pabrik TO ROLE admin_role;
GRANT ALL PRIVILEGES ON TABLE Senjata TO ROLE admin_role;
GRANT ALL PRIVILEGES ON TABLE Distributor TO ROLE admin_role;
GRANT ALL PRIVILEGES ON TABLE Pemesanan TO ROLE admin_role;

-- Memberikan hak akses ke distributor
GRANT SELECT ON TABLE Senjata TO ROLE distributor_role;
GRANT SELECT ON TABLE Pemesanan TO ROLE distributor_role;

-- Memberikan hak akses ke sales
GRANT SELECT ON TABLE Pemesanan TO ROLE sales_role;
GRANT SELECT ON TABLE Distributor TO ROLE sales_role;
GRANT SELECT ON TABLE Senjata TO ROLE sales_role;

-- Memberikan hak akses ke inventory manager
GRANT SELECT, INSERT, UPDATE ON TABLE Senjata TO ROLE inventory_manager_role;
GRANT SELECT, INSERT, UPDATE ON TABLE Pabrik TO ROLE inventory_manager_role;

-- Membuat permission untuk row-level access pada tabel Pemesanan
CREATE PERMISSION pemesanan_row_access ON Pemesanan
FOR ROWS WHERE 
(
    verify_role_for_user(SESSION_USER, 'distributor_role') = 1
    AND Pemesanan.DistributorID = (SELECT DistributorID FROM Distributor WHERE DistributorID = SESSION_USER)
)
OR
(
    verify_role_for_user(SESSION_USER, 'admin_role') = 1
)
ENFORCED FOR ALL ACCESS
ENABLE;

-- Mengaktifkan Row Access Control untuk tabel Pemesanan
ALTER TABLE Pemesanan ACTIVATE ROW ACCESS CONTROL;

-- Membuat permission untuk row-level access pada tabel Senjata
CREATE PERMISSION senjata_row_access ON Senjata
FOR ROWS WHERE 
(
    verify_role_for_user(SESSION_USER, 'sales_role') = 1
    -- Memberikan akses untuk melihat semua senjata
)
OR
(
    verify_role_for_user(SESSION_USER, 'inventory_manager_role') = 1
    -- Memberikan akses untuk melihat dan memodifikasi data senjata
)
OR
(
    verify_role_for_user(SESSION_USER, 'admin_role') = 1
    -- Memberikan akses penuh kepada admin
)
ENFORCED FOR ALL ACCESS
ENABLE;

-- Mengaktifkan Row Access Control untuk tabel Senjata
ALTER TABLE Senjata ACTIVATE ROW ACCESS CONTROL;

-- Membuat permission untuk row-level access pada tabel Pabrik
CREATE PERMISSION pabrik_row_access ON Pabrik
FOR ROWS WHERE 
(
    verify_role_for_user(SESSION_USER, 'inventory_manager_role') = 1
    -- Memberikan akses untuk melihat dan memodifikasi data pabrik
)
OR
(
    verify_role_for_user(SESSION_USER, 'admin_role') = 1
    -- Memberikan akses penuh kepada admin
)
ENFORCED FOR ALL ACCESS
ENABLE;

-- Mengaktifkan Row Access Control untuk tabel Pabrik
ALTER TABLE Pabrik ACTIVATE ROW ACCESS CONTROL;


-- Membuat mask untuk kolom `Jumlah` pada tabel Pemesanan
CREATE MASK jumlah_mask ON Pemesanan
FOR COLUMN Jumlah RETURN
CASE
    WHEN verify_role_for_user(SESSION_USER, 'admin_role') = 1
    THEN Jumlah
    WHEN verify_role_for_user(SESSION_USER, 'inventory_manager_role') = 1
    THEN Jumlah
    ELSE 0
END
ENABLE;

-- Mengaktifkan Column Access Control untuk tabel Pemesanan
ALTER TABLE Pemesanan ACTIVATE COLUMN ACCESS CONTROL;

-- Membuat mask untuk kolom `Kaliber` pada tabel Senjata
CREATE MASK kaliber_mask ON Senjata
FOR COLUMN Kaliber RETURN
CASE
    WHEN verify_role_for_user(SESSION_USER, 'admin_role') = 1
    THEN Kaliber
    WHEN verify_role_for_user(SESSION_USER, 'sales_role') = 1
    THEN Kaliber
    ELSE 'XXX'
END
ENABLE;

-- Mengaktifkan Column Access Control untuk tabel Senjata
ALTER TABLE Senjata ACTIVATE COLUMN ACCESS CONTROL;

-- Membuat mask untuk kolom `AlamatPabrik` pada tabel Pabrik
CREATE MASK alamat_pabrik_mask ON Pabrik
FOR COLUMN AlamatPabrik RETURN
CASE
    WHEN verify_role_for_user(SESSION_USER, 'admin_role') = 1
    THEN AlamatPabrik
    WHEN verify_role_for_user(SESSION_USER, 'inventory_manager_role') = 1
    THEN AlamatPabrik
    ELSE 'XXX'
END
ENABLE;

-- Mengaktifkan Column Access Control untuk tabel Pabrik
ALTER TABLE Pabrik ACTIVATE COLUMN ACCESS CONTROL;

我尝试以 useradmin、usersales、userinvmngr 甚至超级用户身份登录到任何表,但它没有显示我之前输入的任何数据。(经销商表除外)。有什么办法可以解决这个问题吗?我已经尝试使用 chatgpt 但它不能解决任何问题在此处输入图像描述

db2 dbeaver
1个回答
0
投票

您的问题显示角色名称的大小写用法不正确。

此外,您的问题没有显示样本数据,因此我们无法判断您的

create permission
表达式是否可以匹配。

您的问题未指定

db2level
(Db2 服务器的确切版本/修补级别),在寻求帮助时,您应该始终在问题中提供该信息。

此外,您应该在问题中使用正确的标签来指定 Db2 服务器的确切平台(db2-zos、db2-luw、db2400 ...)。答案有时取决于平台以及 Db2 服务器的确切版本。

您的问题显示

create user 
语句,但这对于 Db2-LUW 来说不是有效的语法。您是否已验证每条语句均无错误地完成?

角色名称是 Db2 中的标识符。

标识符区分大小写,当标识符不加引号时,Db2 会隐式将标识符转换为大写。

您的示例显示创建的角色名称不带引号,因此它们将存储为大写形式,但在检查表达式中,您以小写形式引用名称,因此它们不会匹配。

此外,SESSION_USER 将返回一个标识符,并且该标识符将隐式大写,因此表中用于连接或匹配 RBAC 权限的检查表达式的任何数据也将区分大小写。

因此,如果 SESSION_USER 返回 USERDISTRIBUTOR 并且 Distributor.DistributorID 中的数据与大小写不完全匹配,则

verify_role_for_user
将返回 0 ,并且不会返回任何行。

因此,您很可能需要修复代码,还可能需要修复数据以符合 Db2 行为。

© www.soinside.com 2019 - 2024. All rights reserved.