Oracle Deep Data Security: Data Grants

 Last week, I published an article about Oracle Deep Data Security (Deep Sec) in Oracle AI Database 26ai, where I covered End Users and Data Roles and demonstrated how they work together. In this article, I want to continue from that point and focus on Data Grants.

1. What is a Data Grant?

GRANT SELECT ON table TO user;

2. Test Environment

SQL> select * from admin.database_access_requests;

REQUEST_ID USERNAME DATABASE_NAME PDB_NAME ENVIRONMENT ACCESS_TYPE REQUEST_STATUS REQUESTED
---------- ---------- ------------- --------------- -------------------- ----------------- -------------------- ---------
1001 VAHID_EU PRODDB PARS_PDB PRODUCTION DBA APPROVED 01-SEP-26
1002 VAHID_EU PRODDB DERAZKASH_PDB PRODUCTION SELECT ANY TABLE APPROVED 02-SEP-26
1003 RAMZON_EU PRODDB MAZANDARAN_PDB PRODUCTION RESOURCE APPROVED 02-SEP-26
1004 SARA_EU TESTDB NEKA_PDB TEST DEVELOPER_ROLE APPROVED 03-SEP-26
1005 REZA_EU PRODDB EZZARON_PDB PRODUCTION READ ONLY PENDING 04-SEP-26
1006 VAHID_EU TESTDB DERAZKASH_PDB TEST DEVELOPER_ROLE APPROVED 05-SEP-26
1007 ALI_EU PRODDB MARZIKOLA_PDB PRODUCTION READ WRITE PENDING 06-SEP-26
1008 RAMZON_EU PRODDB BABOL_PDB PRODUCTION DBA APPROVED 07-SEP-26
1009 REZA_EU TESTDB MAZANDARAN_PDB TEST DEVELOPER_ROLE REJECTED 08-SEP-26
1010 VAHID_EU PRODDB DERAZKOLAH_PDB PRODUCTION READ ONLY APPROVED 09-SEP-26

3. Create the End Users and Roles

SQL> create end user vahid_eu identified by a;
End user created.

SQL> CREATE DATA ROLE db_data_role_vahid;
Data role created.

SQL> CREATE ROLE db_standard_role;
Role created.

SQL> GRANT CREATE SESSION TO db_standard_role;
Grant succeeded.

SQL> GRANT db_standard_role TO db_data_role_vahid;
Grant succeeded.

SQL> GRANT DATA ROLE db_data_role_vahid TO vahid_EU;
Grant succeeded.
SQL> create end user RAMZON_EU identified by r;
End user created.
SQL> GRANT DATA ROLE db_data_role_vahid TO RAMZON_EU;
Grant succeeded.

SQL> create end user ALI_EU identified by a;
End user created.
SQL> GRANT DATA ROLE db_data_role_vahid TO ALI_EU;
Grant succeeded.

SQL> create end user SARA_EU identified by s;
End user created.
SQL> GRANT DATA ROLE db_data_role_vahid TO SARA_EU;
Grant succeeded.

4. Row-Level Access

4.1 Start with No Data Grant

SQL> conn vahid_eu/a@OL10:1521/pdb1
Connected.

SQL> select * from admin.database_access_requests;
ERROR at line 1:
ORA-00942: table or view "ADMIN"."DATABASE_ACCESS_REQUESTS" does not exist
Help: https://docs.oracle.com/error-help/db/ora-00942/

4.2 Restrict Access to a User’s Rows

SQL> conn admin/a@OL10:1521/pdb1
Connected.

SQL> CREATE OR REPLACE DATA GRANT admin.Dgran_dar_tbl
AS SELECT
ON admin.database_access_requests
WHERE username='VAHID_EU'
TO VAHID_EU;
Data grant created.
SQL> conn admin/a@OL10:1521/pdb1
Connected.

SQL> CREATE OR REPLACE DATA GRANT admin.Dgran_dar_tbl
AS SELECT
ON admin.database_access_requests
WHERE username='VAHID_EU'
TO VAHID_EU;
Data grant created.
SQL> conn vahid_eu/a@OL10:1521/pdb1
Connected.

SQL> select * from admin.database_access_requests;

REQUEST_ID USERNAME DATABASE_N PDB_NAME ENVIRONMENT ACCESS_TYPE REQUEST_STATUS REQUESTED
---------- ---------- ---------- --------------- --------------- -------------------- -------------------- ---------
1001 VAHID_EU PRODDB PARS_PDB PRODUCTION DBA APPROVED 01-SEP-26
1002 VAHID_EU PRODDB DERAZKASH_PDB PRODUCTION SELECT ANY TABLE APPROVED 02-SEP-26
1006 VAHID_EU TESTDB DERAZKASH_PDB TEST DEVELOPER_ROLE APPROVED 05-SEP-26
1010 VAHID_EU PRODDB DERAZKOLAH_PDB PRODUCTION READ ONLY APPROVED 09-SEP-26

4.3 Add More Conditions

SQL> conn admin/a@OL10:1521/pdb1
Connected.

SQL> drop DATA GRANT admin.Dgran_dar_tbl;
Data grant dropped.

SQL> CREATE OR REPLACE DATA GRANT admin.Dgran_dar_tbl
AS SELECT
ON admin.database_access_requests
WHERE username='VAHID_EU' and ENVIRONMENT='TEST'
TO VAHID_EU;

Data grant created.
SQL> conn vahid_eu/a@OL10:1521/pdb1
Connected.

SQL> select * from admin.database_access_requests;

REQUEST_ID USERNAME DATABASE_N PDB_NAME ENVIRONMENT ACCESS_TYPE REQUEST_STATUS REQUESTED
---------- ---------- ---------- --------------- --------------- -------------------- -------------------- ---------
1006 VAHID_EU TESTDB DERAZKASH_PDB TEST DEVELOPER_ROLE APPROVED 05-SEP-26

5. Column-Level Access

SQL> conn admin/a@OL10:1521/pdb1
Connected.

SQL> drop DATA GRANT admin.Dgran_dar_tbl;
Data grant dropped.

SQL> CREATE OR REPLACE DATA GRANT admin.Dgran_dar_tbl
AS SELECT(ALL COLUMNS EXCEPT ACCESS_TYPE,REQUEST_STATUS)
ON admin.database_access_requests
WHERE REQUEST_ID>=1006 and REQUESTED_DATE >= '04-SEP-26'
TO VAHID_EU;

Data grant created.
Press enter or click to view image in full size
6. Controlling UPDATE and DELETE
SQL> drop DATA GRANT admin.Dgran_dar_tbl;
Data grant dropped.


SQL> CREATE OR REPLACE DATA GRANT admin.Dgran_dar_tbl
AS delete,update,select
ON admin.database_access_requests
WHERE username='VAHID_EU' and ENVIRONMENT='TEST'
TO VAHID_EU;
Data grant created.

6.1 UPDATE

SQL> update admin.database_access_requests set REQUEST_STATUS='REJECTED' ;

1 row updated.
SQL> select * from admin.database_access_requests;

REQUEST_ID USERNAME DATABASE_N PDB_NAME ENVIRONMENT ACCESS_TYPE REQUEST_STATUS REQUESTED
---------- ---------- ---------- --------------- --------------- -------------------- -------------------- ---------
1006 VAHID_EU TESTDB DERAZKASH_PDB TEST DEVELOPER_ROLE REJECTED 05-SEP-26
Press enter or click to view image in full size

6.2 DELETE

SQL> delete admin.database_access_requests;

1 row deleted.
SQL>  select * from admin.database_access_requests;

no rows selected

7. Column-Specific DML Privileges

SQL>  conn admin/a@OL10:1521/pdb1
Connected.

SQL> CREATE OR REPLACE DATA GRANT admin.Dgran_dar_tbl
AS UPDATE (ENVIRONMENT, ACCESS_TYPE),
SELECT(ENVIRONMENT,ACCESS_TYPE,REQUEST_STATUS)
ON admin.database_access_requests
WHERE username='VAHID_EU'
TO VAHID_EU;
Data grant created.
UPDATE admin.database_access_requests
SET ACCESS_TYPE='DBA';

4 rows updated.

8. Using ORA_END_USER_CONTEXT for Multiple End Users

Become a Medium member
SQL> conn admin/a@OL10:1521/pdb1
Connected.
SQL> select * from admin.database_access_requests;

REQUEST_ID USERNAME DATABASE_N PDB_NAME ENVIRONMENT ACCESS_TYPE REQUEST_STATUS REQUESTED
---------- ---------- ---------- --------------- --------------- -------------------- -------------------- ---------
1001 VAHID_EU PRODDB PARS_PDB PRODUCTION DBA APPROVED 01-SEP-26
1002 VAHID_EU PRODDB DERAZKASH_PDB PRODUCTION SELECT ANY TABLE APPROVED 02-SEP-26
1003 RAMZON_EU PRODDB MAZANDARAN_PDB PRODUCTION RESOURCE APPROVED 02-SEP-26
1004 SARA_EU TESTDB NEKA_PDB TEST DEVELOPER_ROLE APPROVED 03-SEP-26
1005 REZA_EU PRODDB EZZARON_PDB PRODUCTION READ ONLY PENDING 04-SEP-26
1006 VAHID_EU TESTDB DERAZKASH_PDB TEST DEVELOPER_ROLE APPROVED 05-SEP-26
1007 ALI_EU PRODDB MARZIKOLA_PDB PRODUCTION READ WRITE PENDING 06-SEP-26
1008 RAMZON_EU PRODDB BABOL_PDB PRODUCTION DBA APPROVED 07-SEP-26
1009 REZA_EU TESTDB MAZANDARAN_PDB TEST DEVELOPER_ROLE REJECTED 08-SEP-26
1010 VAHID_EU PRODDB DERAZKOLAH_PDB PRODUCTION READ ONLY APPROVED 09-SEP-26

10 rows selected.
SQL> drop DATA GRANT admin.Dgran_dar_tbl;
Data grant dropped.

SQL> CREATE OR REPLACE DATA GRANT admin.Dgran_dar_tbl
AS DELETE,SELECT,
UPDATE (ACCESS_TYPE,REQUEST_STATUS)
ON admin.database_access_requests
WHERE username = ORA_END_USER_CONTEXT.username
TO VAHID_EU,RAMZON_EU,SARA_EU,ALI_EU;

Data grant created.
WHERE username = ORA_END_USER_CONTEXT.username
SQL> conn vahid_eu/a@OL10:1521/pdb1
Connected.

SQL> select * from admin.database_access_requests;

REQUEST_ID USERNAME DATABASE_N PDB_NAME ENVIRONMENT ACCESS_TYPE REQUEST_STATUS REQUESTED
---------- ---------- ---------- --------------- --------------- -------------------- -------------------- ---------
1001 VAHID_EU PRODDB PARS_PDB PRODUCTION DBA APPROVED 01-SEP-26
1002 VAHID_EU PRODDB DERAZKASH_PDB PRODUCTION SELECT ANY TABLE APPROVED 02-SEP-26
1006 VAHID_EU TESTDB DERAZKASH_PDB TEST DEVELOPER_ROLE APPROVED 05-SEP-26
1010 VAHID_EU PRODDB DERAZKOLAH_PDB PRODUCTION READ ONLY APPROVED 09-SEP-26
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size

9. When Standard Database Privileges Can Bypass the Data Grant(USE DATA GRANTS ONLY)

SQL> drop DATA GRANT admin.Dgran_dar_tbl;
Data grant dropped.

SQL> GRANT select any table TO db_standard_role;
Grant succeeded.

SQL> GRANT db_standard_role TO db_data_role_vahid;
Grant succeeded.

SQL> GRANT DATA ROLE db_data_role_vahid TO vahid_EU;
Grant succeeded.
SQL> conn vahid_eu/a@OL10:1521/pdb1
Connected.
SQL> select * from admin.database_access_requests;

REQUEST_ID USERNAME DATABASE_NAME PDB_NAME ENVIRONMENT ACCESS_TYPE REQUEST_STATUS REQUESTED
---------- ---------- ------------- --------------- -------------------- ----------------- -------------------- ---------
1001 VAHID_EU PRODDB PARS_PDB PRODUCTION DBA APPROVED 01-SEP-26
1002 VAHID_EU PRODDB DERAZKASH_PDB PRODUCTION SELECT ANY TABLE APPROVED 02-SEP-26
1003 RAMZON_EU PRODDB MAZANDARAN_PDB PRODUCTION RESOURCE APPROVED 02-SEP-26
1004 SARA_EU TESTDB NEKA_PDB TEST DEVELOPER_ROLE APPROVED 03-SEP-26
1005 REZA_EU PRODDB EZZARON_PDB PRODUCTION READ ONLY PENDING 04-SEP-26
1006 VAHID_EU TESTDB DERAZKASH_PDB TEST DEVELOPER_ROLE APPROVED 05-SEP-26
1007 ALI_EU PRODDB MARZIKOLA_PDB PRODUCTION READ WRITE PENDING 06-SEP-26
1008 RAMZON_EU PRODDB BABOL_PDB PRODUCTION DBA APPROVED 07-SEP-26
1009 REZA_EU TESTDB MAZANDARAN_PDB TEST DEVELOPER_ROLE REJECTED 08-SEP-26
1010 VAHID_EU PRODDB DERAZKOLAH_PDB PRODUCTION READ ONLY APPROVED 09-SEP-26
SQL> conn admin/a@OL10:1521/pdb1
Connected.

SQL> CREATE OR REPLACE DATA GRANT admin.Dgran_dar_tbl
AS DELETE,SELECT, UPDATE (ACCESS_TYPE,REQUEST_STATUS)
ON admin.database_access_requests
WHERE username = ORA_END_USER_CONTEXT.username
TO VAHID_EU;
Data grant created.
SQL> conn vahid_eu/a@OL10:1521/pdb1
Connected.

SQL> select * from admin.database_access_requests;

REQUEST_ID USERNAME DATABASE_NAME PDB_NAME ENVIRONMENT ACCESS_TYPE REQUEST_STATUS REQUESTED
---------- ---------- ------------- --------------- -------------------- ----------------- -------------------- ---------
1001 VAHID_EU PRODDB PARS_PDB PRODUCTION DBA APPROVED 01-SEP-26
1002 VAHID_EU PRODDB DERAZKASH_PDB PRODUCTION SELECT ANY TABLE APPROVED 02-SEP-26
1003 RAMZON_EU PRODDB MAZANDARAN_PDB PRODUCTION RESOURCE APPROVED 02-SEP-26
1004 SARA_EU TESTDB NEKA_PDB TEST DEVELOPER_ROLE APPROVED 03-SEP-26
1005 REZA_EU PRODDB EZZARON_PDB PRODUCTION READ ONLY PENDING 04-SEP-26
1006 VAHID_EU TESTDB DERAZKASH_PDB TEST DEVELOPER_ROLE APPROVED 05-SEP-26
1007 ALI_EU PRODDB MARZIKOLA_PDB PRODUCTION READ WRITE PENDING 06-SEP-26
1008 RAMZON_EU PRODDB BABOL_PDB PRODUCTION DBA APPROVED 07-SEP-26
1009 REZA_EU TESTDB MAZANDARAN_PDB TEST DEVELOPER_ROLE REJECTED 08-SEP-26
1010 VAHID_EU PRODDB DERAZKOLAH_PDB PRODUCTION READ ONLY APPROVED 09-SEP-26

Enforcing Data Grants

SQL> conn admin/a@OL10:1521/pdb1
Connected.

SQL> SET USE DATA GRANTS ONLY ON admin.database_access_requests ENABLED;
Use data grants only set.
SQL> conn vahid_eu/a@OL10:1521/pdb1
Connected.

SQL> select * from admin.database_access_requests;
REQUEST_ID USERNAME DATABASE_N PDB_NAME ENVIRONMENT ACCESS_TYPE REQUEST_STATUS REQUESTED
---------- ---------- ---------- --------------- --------------- -------------------- -------------------- ---------
1001 VAHID_EU PRODDB PARS_PDB PRODUCTION DBA APPROVED 01-SEP-26
1002 VAHID_EU PRODDB DERAZKASH_PDB PRODUCTION SELECT ANY TABLE APPROVED 02-SEP-26
1006 VAHID_EU TESTDB DERAZKASH_PDB TEST DEVELOPER_ROLE APPROVED 05-SEP-26
1010 VAHID_EU PRODDB DERAZKOLAH_PDB PRODUCTION READ ONLY APPROVED 09-SEP-26
SQL>  SET USE DATA GRANTS ONLY ON admin.database_access_requests DISABLED;
Use data grants only set.

Comments

Popular posts from this blog

Oracle 21c Enhancements for TTS Export/Import

Oracle 23ai — error_message_details Parameter for Displaying Error Details

Buffer Busy Wait and Read by Other Session in Oracle