Discussions
Categories
- 196.8K All Categories
- 2.2K Data
- 238 Big Data Appliance
- 1.9K Data Science
- 450.3K Databases
- 221.7K General Database Discussions
- 3.8K Java and JavaScript in the Database
- 31 Multilingual Engine
- 550 MySQL Community Space
- 478 NoSQL Database
- 7.9K Oracle Database Express Edition (XE)
- 3K ORDS, SODA & JSON in the Database
- 544 SQLcl
- 4K SQL Developer Data Modeler
- 187K SQL & PL/SQL
- 21.3K SQL Developer
- 295.8K Development
- 17 Developer Projects
- 138 Programming Languages
- 292.5K Development Tools
- 107 DevOps
- 3.1K QA/Testing
- 646K Java
- 28 Java Learning Subscription
- 37K Database Connectivity
- 155 Java Community Process
- 105 Java 25
- 22.1K Java APIs
- 138.1K Java Development Tools
- 165.3K Java EE (Java Enterprise Edition)
- 18 Java Essentials
- 160 Java 8 Questions
- 86K Java Programming
- 80 Java Puzzle Ball
- 65.1K New To Java
- 1.7K Training / Learning / Certification
- 13.8K Java HotSpot Virtual Machine
- 94.3K Java SE
- 13.8K Java Security
- 204 Java User Groups
- 24 JavaScript - Nashorn
- Programs
- 437 LiveLabs
- 38 Workshops
- 10.2K Software
- 6.7K Berkeley DB Family
- 3.5K JHeadstart
- 5.7K Other Languages
- 2.3K Chinese
- 171 Deutsche Oracle Community
- 1.1K Español
- 1.9K Japanese
- 232 Portuguese
Trigger to prevent edit:keywords being used as Column Names
Answers
-
Trigger owner must be granted (directly, not via role) select on DBA_TAB_COLS and V$RESERVED_WORDS.
SY.
-
I am getting the same error even after granting the permissions directly
-
SQL>
SQL> conn sys/[email protected]_schema as sysdba;
Connected.
SQL>
SQL> grant select on dba_tab_cols to PAULZIP
2 /
Grant succeeded.
SQL>
SQL> grant select on v_$reserved_words to PAULZIP -- Because V$RESERVED_WORDS is a synonym
2 /
Grant succeeded.
SQL>
SQL> conn paulzip/[email protected]_schema
Connected.
SQL>
SQL> create or replace trigger trgacd_reserved_words_check after create on database
2 declare
3 vColList varchar2(4000 byte);
4 begin
5 -- We are interested in CREATE TABLE only
6 if ora_dict_obj_type = 'TABLE' then
7 select listagg(c.column_name, ',') within group (order by column_id) -- Would allow around 30 columns, should be more than enough
8 into vColList
9 from dba_tab_cols c,
10 v$reserved_words w
11 where c.owner = ora_dict_obj_owner
12 and c.table_name = ora_dict_obj_name
13 and upper(c.column_name) = w.keyword
14 and w.reserved = 'Y';
15 if vColList is not null then
16 raise_application_error(-20100, 'Table '||ora_dict_obj_owner||'.'||ora_dict_obj_name||' contains columns which are reserved words : '||chr(13)||chr(10)||vColList);
17 end if;
18 end if;
19 end;
20 /
Trigger created.
SQL>
SQL> create table t_test_reserved (
2 ID integer not null, -- OK
3 "PRIOR" integer, -- Reserved
4 DESCRIPTION varchar2(50), -- OK
5 "MODE" integer, -- Reserved
6 "UNIQUE" integer -- reserved
7 )
8 /
create table t_test_reserved (
*
ERROR at line 1:
ORA-04088: error during execution of trigger 'PAULZIP.TRGACD_RESERVED_WORDS_CHECK'
ORA-00604: error occurred at recursive SQL level 1
ORA-20100: Table PAULZIP.T_TEST_RESERVED contains columns which are reserved words :
PRIOR,MODE,UNIQUE
ORA-06512: at line 15
SQL>
SQL> create table t_test_reserved_2 as
2 select 1 as "CLUSTER", 2 as "SET"
3 from dual
4 connect by level < 2
5 /
from dual
*
ERROR at line 3:
ORA-04088: error during execution of trigger 'PAULZIP.TRGACD_RESERVED_WORDS_CHECK'
ORA-00604: error occurred at recursive SQL level 1
ORA-20100: Table PAULZIP.T_TEST_RESERVED_2 contains columns which are reserved words :
CLUSTER,SET
ORA-06512: at line 15
SQL>
SQL> create table t_test_reserved_3 (
2 ID integer not null, -- OK
3 DESCRIPTION varchar2(50) -- OK
4 )
5 /
Table created.
-
Show us a snippet where you directly grant select on DBA_TAB_COLS and V$RESERVED_WORDS to trigger owner and then create trigger along with error messages.
SY.