diff --git a/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb b/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb index 720a50f88..1e8ee0273 100644 --- a/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +++ b/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb @@ -899,14 +899,19 @@ def current_user select_value("SELECT SYS_CONTEXT('userenv', 'session_user') FROM dual") end + # Current database session schema + def current_schema + select_value("SELECT SYS_CONTEXT('userenv', 'current_schema') FROM dual") + end + # Default tablespace name of current user def default_tablespace - select_value("SELECT LOWER(default_tablespace) FROM user_users WHERE username = SYS_CONTEXT('userenv', 'session_user')") + select_value("SELECT LOWER(default_tablespace) FROM user_users WHERE username = SYS_CONTEXT('userenv', 'current_schema')") end def tables(name = nil) #:nodoc: select_values( - "SELECT DECODE(table_name, UPPER(table_name), LOWER(table_name), table_name) FROM all_tables WHERE owner = SYS_CONTEXT('userenv', 'session_user') AND secondary = 'N'", + "SELECT DECODE(table_name, UPPER(table_name), LOWER(table_name), table_name) FROM all_tables WHERE owner = SYS_CONTEXT('userenv', 'current_schema') AND secondary = 'N'", name) end @@ -919,7 +924,7 @@ def table_exists?(table_name) end def materialized_views #:nodoc: - select_values("SELECT LOWER(mview_name) FROM all_mviews WHERE owner = SYS_CONTEXT('userenv', 'session_user')") + select_values("SELECT LOWER(mview_name) FROM all_mviews WHERE owner = SYS_CONTEXT('userenv', 'current_schema')") end cattr_accessor :all_schema_indexes #:nodoc: diff --git a/lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb b/lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb index d3f02c480..7be36a352 100644 --- a/lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb +++ b/lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb @@ -303,6 +303,7 @@ def self.new_connection(config) cursor_sharing = config[:cursor_sharing] || 'force' # get session time_zone from configuration or from TZ environment variable time_zone = config[:time_zone] || ENV['TZ'] + schema = config[:schema] # connection using host, port and database name connection_string = if host || port @@ -322,6 +323,7 @@ def self.new_connection(config) conn.prefetch_rows = prefetch_rows conn.exec "alter session set cursor_sharing = #{cursor_sharing}" rescue nil conn.exec "alter session set time_zone = '#{time_zone}'" unless time_zone.blank? + conn.exec "alter session set current_schema = #{schema}" unless schema.blank? # Initialize NLS parameters OracleEnhancedAdapter::DEFAULT_NLS_PARAMETERS.each do |key, default_value| diff --git a/lib/active_record/connection_adapters/oracle_enhanced_structure_dump.rb b/lib/active_record/connection_adapters/oracle_enhanced_structure_dump.rb index f4507e715..86bf998a8 100644 --- a/lib/active_record/connection_adapters/oracle_enhanced_structure_dump.rb +++ b/lib/active_record/connection_adapters/oracle_enhanced_structure_dump.rb @@ -10,7 +10,7 @@ def structure_dump #:nodoc: "CREATE SEQUENCE \"#{seq}\"" end select_values("SELECT table_name FROM all_tables t - WHERE owner = SYS_CONTEXT('userenv', 'session_user') AND secondary = 'N' + WHERE owner = SYS_CONTEXT('userenv', 'current_schema') AND secondary = 'N' AND NOT EXISTS (SELECT mv.mview_name FROM all_mviews mv WHERE mv.owner = t.owner AND mv.mview_name = t.table_name) AND NOT EXISTS (SELECT mvl.log_table FROM all_mview_logs mvl WHERE mvl.log_owner = t.owner AND mvl.log_table = t.table_name) ORDER BY 1").each do |table_name| @@ -77,7 +77,7 @@ def structure_dump_primary_key(table) #:nodoc: ON a.constraint_name = c.constraint_name WHERE c.table_name = '#{table.upcase}' AND c.constraint_type = 'P' - AND c.owner = SYS_CONTEXT('userenv', 'session_user') + AND c.owner = SYS_CONTEXT('userenv', 'current_schema') SQL pks.each do |row| opts[:name] = row['constraint_name'] @@ -95,7 +95,7 @@ def structure_dump_unique_keys(table) #:nodoc: ON a.constraint_name = c.constraint_name WHERE c.table_name = '#{table.upcase}' AND c.constraint_type = 'U' - AND c.owner = SYS_CONTEXT('userenv', 'session_user') + AND c.owner = SYS_CONTEXT('userenv', 'current_schema') SQL uks.each do |uk| keys[uk['constraint_name']] ||= [] @@ -123,7 +123,7 @@ def structure_dump_indexes(table_name) #:nodoc: end def structure_dump_fk_constraints #:nodoc: - fks = select_all("SELECT table_name FROM all_tables WHERE owner = SYS_CONTEXT('userenv', 'session_user') ORDER BY 1").map do |table| + fks = select_all("SELECT table_name FROM all_tables WHERE owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1").map do |table| if respond_to?(:foreign_keys) && (foreign_keys = foreign_keys(table["table_name"])).any? foreign_keys.map do |fk| sql = "ALTER TABLE #{quote_table_name(fk.from_table)} ADD CONSTRAINT #{quote_column_name(fk.options[:name])} " @@ -147,14 +147,14 @@ def structure_dump_db_stored_code #:nodoc: FROM all_source WHERE type IN ('PROCEDURE', 'PACKAGE', 'PACKAGE BODY', 'FUNCTION', 'TRIGGER', 'TYPE') AND name NOT LIKE 'BIN$%' - AND owner = SYS_CONTEXT('userenv', 'session_user') ORDER BY type").each do |source| + AND owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY type").each do |source| ddl = "CREATE OR REPLACE \n" lines = select_all(%Q{ SELECT text FROM all_source WHERE name = '#{source['name']}' AND type = '#{source['type']}' - AND owner = SYS_CONTEXT('userenv', 'session_user') + AND owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY line }).map do |row| ddl << row['text'] @@ -171,7 +171,7 @@ def structure_dump_db_stored_code #:nodoc: # export synonyms select_all("SELECT owner, synonym_name, table_name, table_owner FROM all_synonyms - WHERE owner = SYS_CONTEXT('userenv', 'session_user') ").each do |synonym| + WHERE owner = SYS_CONTEXT('userenv', 'current_schema') ").each do |synonym| structure << "CREATE OR REPLACE #{synonym['owner'] == 'PUBLIC' ? 'PUBLIC' : '' } SYNONYM #{synonym['synonym_name']}" structure << " FOR #{synonym['table_owner']}.#{synonym['table_name']}" end @@ -184,7 +184,7 @@ def structure_drop #:nodoc: "DROP SEQUENCE \"#{seq}\"" end select_values("SELECT table_name from all_tables t - WHERE owner = SYS_CONTEXT('userenv', 'session_user') AND secondary = 'N' + WHERE owner = SYS_CONTEXT('userenv', 'current_schema') AND secondary = 'N' AND NOT EXISTS (SELECT mv.mview_name FROM all_mviews mv WHERE mv.owner = t.owner AND mv.mview_name = t.table_name) AND NOT EXISTS (SELECT mvl.log_table FROM all_mview_logs mvl WHERE mvl.log_owner = t.owner AND mvl.log_table = t.table_name) ORDER BY 1").each do |table| @@ -196,7 +196,7 @@ def structure_drop #:nodoc: def temp_table_drop #:nodoc: join_with_statement_token(select_values( "SELECT table_name FROM all_tables - WHERE owner = SYS_CONTEXT('userenv', 'session_user') AND secondary = 'N' AND temporary = 'Y' ORDER BY 1").map do |table| + WHERE owner = SYS_CONTEXT('userenv', 'current_schema') AND secondary = 'N' AND temporary = 'Y' ORDER BY 1").map do |table| "DROP TABLE \"#{table}\" CASCADE CONSTRAINTS" end) end