Table 'dual' in view prevents grant select
Details
| Detail name | Value |
|---|---|
| Changelog Number | 8617 |
| Type | Bug |
| Status | Open |
| Affected Versions | Exasol 6.1.0, Exasol 6.2.0, Exasol 7.0.0, Exasol 7.1.0, Exasol 8.0.0, Exasol 8.29.0, Exasol 2025.1.0, Exasol 2025.2.0 |
Background
To prevent data leakage, granting SELECT on a view in Exasol requires the owner of the view to also own GRANT privileges on all underlying objects.
Problem
All system tables are owned by SYS. This means that to grant select on any view referencing system tables one of the following must be true:
- The view is owned by SYS
- The view owner has the SELECT ANY DICTIONARY WITH ADMIN OPTION privilege
- The grantor has grant any object privilege
This also includes 'fake' tables like DUAL:
Example:
create schema test; create user user1 identified by "user1"; grant impersonation on sys to user1; create user user2 identified by "user2"; alter schema test change owner user1; create or replace view v1 as select 1 as a from dual; impersonate user1; grant select on test.v1 to user2; -- insufficient privileges: SELECT on table DUAL must be grantable for USER1 impersonate sys; grant select any dictionary to user1 with admin option; impersonate user1; grant select on test.v1 to user2; -- Now it works... impersonate sys;
Unfortunately, selecting without a table is internally rewritten to select from dual:
create or replace view test.v1 as ( select 1 ); grant select on test.v1 to user2; -- will also fail.
Workarounds
1 - Use VALUES constructor
Some variants:
create or replace view v1(a) as ( values 1 ); create or replace view v1 as ( values 1 as t(a) ); create or replace view v1 as select 1 as a from ( values 1 );
2 - Create your own DUAL table
create table test.dual as select * from sys.dual; create or replace view v1 as select 1 as a from test.dual;