ACE Director Alum Daniel Morgan, founder of Morgan's Library, is scheduling
complimentary technical Workshops on Database Security for the first 30
Oracle Database customers located anywhere in North America, EMEA, LATAM, or
APAC that send an email to
asra_us@oracle.com. Request a Workshop for
your organization today.
Purpose
A SQL translation profile is an editionable database schema object that resides in SQL translation profile namespace. A SQL translation profile cannot be created as a common object in a consolidated database.
AUTHID
CURRENT_USER
Constants
Name
Data Type
Value
ATTR_EDITIONABLE
VARCHAR2(30)
'EDITIONABLE'
ATTR_FOREIGN_SQL_SYNTAX
VARCHAR2(30)
'FOREIGN_SQL_SYNTAX'
ATTR_LOG_ERRORS
VARCHAR2(30)
'LOG_ERRORS'
ATTR_LOG_TRANSLATION_ERROR
VARCHAR2(30)
'LOG_TRANSLATION_ERROR'
ATTR_RAISE_TRANSLATION_ERROR
VARCHAR2(30)
'RAISE_TRANSLATION_ERROR'
ATTR_TRACE_TRANSLATION
VARCHAR2(30)
'TRACE_TRANSLATOR'
ATTR_TRANSLATE_NEW_SQL
VARCHAR2(30)
'TRANSLATE_NEW_SQL'
ATTR_TRANSLATOR
VARCHAR2(30)
'TRANSLATOR'
ATTR_VALUE_TRUE
VARCHAR2(30)
'TRUE'
ATTR_VALUE_FALSE
VARCHAR2(30)
'FALSE'
Dependencies
ALL_ERROR_TRANSLATIONS
DBMS_SQL_TRANSLATOR_LIB
SYS_IXMLAGG
ALL_OBJECTS
DBMS_STANDARD
XMLAGG
ALL_SQL_TRANSLATIONS
DUAL
XMLTYPE
ALL_SQL_TRANSLATION_PROFILES
SQLTXL$
XQSEQUENCE
DBMS_SQL_TRANSLATOR_EXPORT
Documented
Yes
Exceptions
Error Code
Reason
ORA-00955
profile_exists
ORA-01031
insufficient_privilege
ORA-01435
no_such_user
ORA-24252
no_such_profile
ORA-24253
no_translation_found
ORA-29261
bad_argument
First Available
12.1
Security Model
Owned by SYS with EXECUTE granted to PUBLIC
Another example we are calling out where a grant of EXECUTE to PUBLIC is unwarranted. A decision to translate or more correctly replace one SQL statement with another should be granted to an application ... not to everyone and anyone that can has the CREATE SESSION privilege.
dbms_sql_translator.clear_sql_translation_error(
profile_name IN VARCHAR2,
sql_text IN CLOB);
PRAGMA SUPPLEMENTAL_LOG_DATA(clear_sql_translation_error, AUTO_WITH_COMMIT);
col profile_name format a20
col translator format a11
SELECT *
FROM dba_sql_translation_profiles;
CREATE OR REPLACE PACKAGE uwclass.transpkg AUTHID CURRENT_USER IS
PROCEDURE translate_sql(sql_text IN CLOB,
translated_text OUT NOCOPY CLOB);
PROCEDURE translate_error(error_code IN BINARY_INTEGER,
translated_code OUT BINARY_INTEGER,
translated_sqlstate OUT NOCOPY VARCHAR2);
END transpkg;
/
CREATE TABLE uwclass.tsql_target AS
SELECT srvr_id
FROM uwclass.servers
WHERE 1=2;
exec dbms_sql_translator.register_sql_translation(
profile_name => 'UW_TSQLTRANS',
sql_text => 'SELECT srvr_id INTO uwclass.tsql_target FROM uwclass.servers',
translated_text => 'INSERT INTO uwclass.tsql_target SELECT srvr_id FROM uwclass.servers');
-- SELECT getdate(); vs SELECT sysdate FROM dual;
desc dba_sql_translations
col owner format a10
col sql_text format a40
col translated_text format a39
SELECT owner, profile_name, sql_text, translated_text
from dba_sql_translations;
BEGIN
execute immediate 'SELECT srvr_id INTO uwclass.tsql_target FROM uwclass.servers';
END;
/
BEGIN
*
ERROR at line 1:
ORA-00905: missing keyword
ORA-06512: at line 2
ALTER SESSION SET SQL_TRANSLATION_PROFILE = UW_TSQLTRANS;
ALTER SESSION SET EVENTS = '10601 trace name context forever, level 32';
BEGIN
execute immediate 'SELECT srvr_id INTO uwclass.tsql_target FROM uwclass.servers';
END;
/
DECLARE
hashVal NUMBER;
retVal VARCHAR2(30);
sqlTxt CLOB := 'select top 5 * from emp';
BEGIN
hashVal := dbms_sql_translator.sql_hash(sqlTxt);
dbms_output.put_line(TO_CHAR(hashVal));
Enables a custom translation of an Oracle error code in a SQL translation profile
dbms_sql_translator.enable_error_translation(
profile_name IN VARCHAR2,
error_code IN PLS_INTEGER,
enable IN BOOLEAN DEFAULT TRUE);
PRAGMA SUPPLEMENTAL_LOG_DATA(enable_error_translation, AUTO_WITH_COMMIT);
BEGIN
dbms_sql_translator.enable_error_translation('UW_SQLTRANS', 1, TRUE);
END;
/
Enables a custom translation of an Oracle error code in a SQL translation profile
dbms_sql_translator.enable_sql_translation(
profile_name IN VARCHAR2,
sql_text IN CLOB,
enable IN BOOLEAN DEFAULT TRUE);
PRAGMA SUPPLEMENTAL_LOG_DATA(enable_sql_translation, AUTO_WITH_COMMIT);
BEGIN
dbms_sql_translator.enable_sql_translation('UW_SQLTRANS', 'select top 5 * from emp', TRUE);
END;
/
Registers a custom translation of an Oracle error code and SQLSTATE in a SQL translation profile
dbms_sql_translator.register_error_translation(
profile_name IN VARCHAR2,
error_code IN PLS_INTEGER,
translated_code IN PLS_INTEGER DEFAULT NULL,
translated_sqlstate IN VARCHAR2 DEFAULT NULL,
enable IN BOOLEAN DEFAULT TRUE);
PRAGMA SUPPLEMENTAL_LOG_DATA(register_error_translation, AUTO_WITH_COMMIT);
Registers a custom translation of a SQL statement in a SQL translation profile
dbms_sql_translator.register_sql_translation(
profile_name IN VARCHAR2,
sql_text IN CLOB,
translated_text IN CLOB DEFAULT NULL,
enable IN BOOLEAN DEFAULT TRUE);
PRAGMA SUPPLEMENTAL_LOG_DATA(register_sql_translation, AUTO_WITH_COMMIT);
dbms_sql_translator.set_attribute(
profile_name IN VARCHAR2,
attribute_name IN VARCHAR2,
attribute_value IN VARCHAR2);
PRAGMA SUPPLEMENTAL_LOG_DATA(set_attribute, AUTO_WITH_COMMIT);