--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 但它不能解决任何问题在此处输入图像描述
您的问题显示角色名称的大小写用法不正确。
此外,您的问题没有显示样本数据,因此我们无法判断您的
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 行为。