这是最直接的方法,授予用户对特定表的 SELECT 权限:
GRANT SELECT ON schema_name.table_name TO username;
CREATE ROLE read_only_role;
GRANT SELECT ON schema_name.table1 TO read_only_role;
GRANT SELECT ON schema_name.table2 TO read_only_role;
-- 可以继续添加更多表
GRANT read_only_role TO username;
CREATE OR REPLACE VIEW schema_name.view_name AS
SELECT * FROM schema_name.table_name;
GRANT SELECT ON schema_name.view_name TO username;
BEGIN
DBMS_RLS.ADD_POLICY(
object_schema => 'schema_name',
object_name => 'table_name',
policy_name => 'read_only_policy',
function_schema => 'sys',
policy_function => 'restrict_dml',
statement_types => 'INSERT,UPDATE,DELETE',
update_check => TRUE
);
END;
/
CREATE OR REPLACE TRIGGER read_only_trigger
BEFORE INSERT OR UPDATE OR DELETE ON schema_name.table_name
FOR EACH ROW
BEGIN
IF USER = 'username' THEN
RAISE_APPLICATION_ERROR(-20001, 'This table is read-only for your account');
END IF;
END;
/
SELECT * FROM DBA_TAB_PRIVS WHERE TABLE_NAME = 'YOUR_TABLE';
REVOKE SELECT ON schema_name.table_name FROM username;
-- 或
REVOKE read_only_role FROM username;
通过以上方法,您可以根据具体需求灵活地实现Oracle表级只读权限控制。