activerecord-oracle_enhanced-adapter 1.6.9 → 1.7.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +10 -11
- data/History.md +126 -14
- data/README.md +9 -6
- data/RUNNING_TESTS.md +1 -1
- data/Rakefile +1 -16
- data/VERSION +1 -1
- data/activerecord-oracle_enhanced-adapter.gemspec +15 -52
- data/lib/active_record/connection_adapters/oracle_enhanced/column.rb +8 -22
- data/lib/active_record/connection_adapters/oracle_enhanced/column_dumper.rb +53 -45
- data/lib/active_record/connection_adapters/oracle_enhanced/connection.rb +6 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +23 -62
- data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_connection.rb +46 -56
- data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_quoting.rb +35 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/oci_connection.rb +34 -21
- data/lib/active_record/connection_adapters/oracle_enhanced/oci_quoting.rb +36 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/procedures.rb +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/quoting.rb +174 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_creation.rb +17 -8
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_definitions.rb +17 -11
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_dumper.rb +160 -178
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb +42 -94
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements_ext.rb +50 -54
- data/lib/active_record/connection_adapters/oracle_enhanced/structure_dump.rb +15 -11
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +197 -301
- data/lib/active_record/oracle_enhanced/type/integer.rb +3 -2
- data/lib/active_record/oracle_enhanced/type/national_character_string.rb +25 -0
- data/lib/active_record/oracle_enhanced/type/raw.rb +14 -2
- data/lib/active_record/oracle_enhanced/type/string.rb +28 -0
- data/lib/active_record/oracle_enhanced/type/text.rb +32 -0
- data/lib/activerecord-oracle_enhanced-adapter.rb +12 -17
- data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +113 -135
- data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +51 -59
- data/spec/active_record/connection_adapters/oracle_enhanced_context_index_spec.rb +40 -41
- data/spec/active_record/connection_adapters/oracle_enhanced_cpk_spec.rb +6 -6
- data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +281 -233
- data/spec/active_record/connection_adapters/oracle_enhanced_database_tasks_spec.rb +7 -7
- data/spec/active_record/connection_adapters/oracle_enhanced_dbms_output_spec.rb +10 -10
- data/spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb +22 -22
- data/spec/active_record/connection_adapters/oracle_enhanced_emulate_oracle_adapter_spec.rb +2 -2
- data/spec/active_record/connection_adapters/oracle_enhanced_procedures_spec.rb +36 -37
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_dump_spec.rb +86 -46
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_statements_spec.rb +194 -294
- data/spec/active_record/connection_adapters/oracle_enhanced_structure_dump_spec.rb +53 -39
- data/spec/spec_helper.rb +0 -6
- metadata +42 -143
- data/.travis.yml +0 -39
- data/.travis/oracle/download.sh +0 -14
- data/.travis/oracle/install.sh +0 -31
- data/.travis/setup_accounts.sh +0 -9
- data/lib/active_record/connection_adapters/oracle_enhanced/dirty.rb +0 -40
- data/lib/active_record/oracle_enhanced/type/timestamp.rb +0 -11
- data/spec/spec_config.yaml.template +0 -11
- data/spec/support/alter_system_user_password.sql +0 -2
- data/spec/support/create_oracle_enhanced_users.sql +0 -31
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
1
|
require 'digest/sha1'
|
3
2
|
|
4
3
|
module ActiveRecord
|
@@ -40,13 +39,21 @@ module ActiveRecord
|
|
40
39
|
# t.string :last_name, :comment => “Surname”
|
41
40
|
# end
|
42
41
|
|
43
|
-
def create_table(table_name,
|
42
|
+
def create_table(table_name, comment: nil, **options)
|
44
43
|
create_sequence = options[:id] != false
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
44
|
+
td = create_table_definition table_name, options[:temporary], options[:options], options[:as], options[:tablespace], options[:organization], comment: comment
|
45
|
+
|
46
|
+
if options[:id] != false && !options[:as]
|
47
|
+
pk = options.fetch(:primary_key) do
|
48
|
+
Base.get_primary_key table_name.to_s.singularize
|
49
|
+
end
|
50
|
+
|
51
|
+
if pk.is_a?(Array)
|
52
|
+
td.primary_keys pk
|
53
|
+
else
|
54
|
+
td.primary_key pk, options.fetch(:id, :primary_key), options
|
55
|
+
end
|
56
|
+
end
|
50
57
|
|
51
58
|
# store that primary key was defined in create_table block
|
52
59
|
unless create_sequence
|
@@ -59,23 +66,10 @@ module ActiveRecord
|
|
59
66
|
end
|
60
67
|
end
|
61
68
|
|
62
|
-
# store column comments
|
63
|
-
class << td
|
64
|
-
attr_accessor :column_comments
|
65
|
-
def column(name, type, options = {})
|
66
|
-
if options[:comment]
|
67
|
-
self.column_comments ||= {}
|
68
|
-
self.column_comments[name] = options[:comment]
|
69
|
-
end
|
70
|
-
super(name, type, options)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
69
|
yield td if block_given?
|
75
70
|
create_sequence = create_sequence || td.create_sequence
|
76
|
-
column_comments = td.column_comments if td.column_comments
|
77
71
|
|
78
|
-
if options[:force] &&
|
72
|
+
if options[:force] && data_source_exists?(table_name)
|
79
73
|
drop_table(table_name, options)
|
80
74
|
end
|
81
75
|
|
@@ -83,21 +77,18 @@ module ActiveRecord
|
|
83
77
|
|
84
78
|
create_sequence_and_trigger(table_name, options) if create_sequence
|
85
79
|
|
86
|
-
|
87
|
-
|
88
|
-
|
80
|
+
if supports_comments? && !supports_comments_in_create?
|
81
|
+
change_table_comment(table_name, comment) if comment
|
82
|
+
td.columns.each do |column|
|
83
|
+
change_column_comment(table_name, column.name, column.comment) if column.comment
|
84
|
+
end
|
89
85
|
end
|
90
86
|
td.indexes.each_pair { |c,o| add_index table_name, c, o }
|
91
87
|
|
92
|
-
td.foreign_keys.each do |other_table_name, foreign_key_options|
|
93
|
-
add_foreign_key(table_name, other_table_name, foreign_key_options)
|
94
|
-
end
|
95
|
-
|
96
|
-
rebuild_primary_key_index_to_default_tablespace(table_name, options)
|
97
88
|
end
|
98
89
|
|
99
|
-
def create_table_definition(
|
100
|
-
ActiveRecord::ConnectionAdapters::OracleEnhanced::TableDefinition.new
|
90
|
+
def create_table_definition(*args)
|
91
|
+
ActiveRecord::ConnectionAdapters::OracleEnhanced::TableDefinition.new(*args)
|
101
92
|
end
|
102
93
|
|
103
94
|
def rename_table(table_name, new_name) #:nodoc:
|
@@ -122,38 +113,11 @@ module ActiveRecord
|
|
122
113
|
end
|
123
114
|
|
124
115
|
def dump_schema_information #:nodoc:
|
125
|
-
|
126
|
-
migrated = select_values("SELECT version FROM #{sm_table} ORDER BY version")
|
127
|
-
join_with_statement_token(migrated.map{|v| "INSERT INTO #{sm_table} (version) VALUES ('#{v}')" })
|
116
|
+
super
|
128
117
|
end
|
129
118
|
|
130
119
|
def initialize_schema_migrations_table
|
131
|
-
|
132
|
-
|
133
|
-
unless table_exists?(sm_table)
|
134
|
-
index_name = "#{Base.table_name_prefix}unique_schema_migrations#{Base.table_name_suffix}"
|
135
|
-
if index_name.length > index_name_length
|
136
|
-
truncate_to = index_name_length - index_name.to_s.length - 1
|
137
|
-
truncated_name = "unique_schema_migrations"[0..truncate_to]
|
138
|
-
index_name = "#{Base.table_name_prefix}#{truncated_name}#{Base.table_name_suffix}"
|
139
|
-
end
|
140
|
-
|
141
|
-
create_table(sm_table, :id => false) do |schema_migrations_table|
|
142
|
-
schema_migrations_table.column :version, :string, :null => false
|
143
|
-
end
|
144
|
-
add_index sm_table, :version, :unique => true, :name => index_name
|
145
|
-
|
146
|
-
# Backwards-compatibility: if we find schema_info, assume we've
|
147
|
-
# migrated up to that point:
|
148
|
-
si_table = Base.table_name_prefix + 'schema_info' + Base.table_name_suffix
|
149
|
-
if table_exists?(si_table)
|
150
|
-
ActiveSupport::Deprecation.warn "Usage of the schema table `#{si_table}` is deprecated. Please switch to using `schema_migrations` table"
|
151
|
-
|
152
|
-
old_version = select_value("SELECT version FROM #{quote_table_name(si_table)}").to_i
|
153
|
-
assume_migrated_upto_version(old_version)
|
154
|
-
drop_table(si_table)
|
155
|
-
end
|
156
|
-
end
|
120
|
+
super
|
157
121
|
end
|
158
122
|
|
159
123
|
def update_table_definition(table_name, base) #:nodoc:
|
@@ -172,7 +136,7 @@ module ActiveRecord
|
|
172
136
|
self.all_schema_indexes = nil
|
173
137
|
end
|
174
138
|
|
175
|
-
def add_index_options(table_name, column_name,
|
139
|
+
def add_index_options(table_name, column_name, comment: nil, **options) #:nodoc:
|
176
140
|
column_names = Array(column_name)
|
177
141
|
index_name = index_name(table_name, column: column_names)
|
178
142
|
|
@@ -199,7 +163,7 @@ module ActiveRecord
|
|
199
163
|
# Remove the given index from the table.
|
200
164
|
# Gives warning if index does not exist
|
201
165
|
def remove_index(table_name, options = {}) #:nodoc:
|
202
|
-
index_name =
|
166
|
+
index_name = index_name_for_remove(table_name, options)
|
203
167
|
unless index_name_exists?(table_name, index_name, true)
|
204
168
|
# sometimes options can be String or Array with column names
|
205
169
|
options = {} unless options.is_a?(Hash)
|
@@ -211,11 +175,6 @@ module ActiveRecord
|
|
211
175
|
end
|
212
176
|
raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' does not exist"
|
213
177
|
end
|
214
|
-
remove_index!(table_name, index_name)
|
215
|
-
end
|
216
|
-
|
217
|
-
# clear cached indexes when removing index
|
218
|
-
def remove_index!(table_name, index_name) #:nodoc:
|
219
178
|
#TODO: It should execute only when index_type == "UNIQUE"
|
220
179
|
execute "ALTER TABLE #{quote_table_name(table_name)} DROP CONSTRAINT #{quote_column_name(index_name)}" rescue nil
|
221
180
|
execute "DROP INDEX #{quote_column_name(index_name)}"
|
@@ -291,6 +250,7 @@ module ActiveRecord
|
|
291
250
|
execute(add_column_sql)
|
292
251
|
|
293
252
|
create_sequence_and_trigger(table_name, options) if type && type.to_sym == :primary_key
|
253
|
+
change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
|
294
254
|
ensure
|
295
255
|
clear_table_columns_cache(table_name)
|
296
256
|
end
|
@@ -299,7 +259,8 @@ module ActiveRecord
|
|
299
259
|
fallback
|
300
260
|
end
|
301
261
|
|
302
|
-
def change_column_default(table_name, column_name,
|
262
|
+
def change_column_default(table_name, column_name, default_or_changes) #:nodoc:
|
263
|
+
default = extract_new_default_value(default_or_changes)
|
303
264
|
execute "ALTER TABLE #{quote_table_name(table_name)} MODIFY #{quote_column_name(column_name)} DEFAULT #{quote(default)}"
|
304
265
|
ensure
|
305
266
|
clear_table_columns_cache(table_name)
|
@@ -353,14 +314,14 @@ module ActiveRecord
|
|
353
314
|
self.all_schema_indexes = nil
|
354
315
|
end
|
355
316
|
|
356
|
-
def
|
357
|
-
|
358
|
-
execute "COMMENT ON
|
317
|
+
def change_table_comment(table_name, comment)
|
318
|
+
clear_cache!
|
319
|
+
execute "COMMENT ON TABLE #{quote_table_name(table_name)} IS #{quote(comment)}"
|
359
320
|
end
|
360
321
|
|
361
|
-
def
|
362
|
-
|
363
|
-
execute "COMMENT ON
|
322
|
+
def change_column_comment(table_name, column_name, comment) #:nodoc:
|
323
|
+
clear_cache!
|
324
|
+
execute "COMMENT ON COLUMN #{quote_table_name(table_name)}.#{quote_column_name(column_name)} IS '#{comment}'"
|
364
325
|
end
|
365
326
|
|
366
327
|
def table_comment(table_name) #:nodoc:
|
@@ -373,6 +334,7 @@ module ActiveRecord
|
|
373
334
|
end
|
374
335
|
|
375
336
|
def column_comment(table_name, column_name) #:nodoc:
|
337
|
+
# TODO: it does not exist in Abstract adapter
|
376
338
|
(owner, table_name, db_link) = @connection.describe(table_name)
|
377
339
|
select_value <<-SQL
|
378
340
|
SELECT comments FROM all_col_comments#{db_link}
|
@@ -393,8 +355,9 @@ module ActiveRecord
|
|
393
355
|
def tablespace(table_name)
|
394
356
|
select_value <<-SQL
|
395
357
|
SELECT tablespace_name
|
396
|
-
FROM
|
358
|
+
FROM all_tables
|
397
359
|
WHERE table_name='#{table_name.to_s.upcase}'
|
360
|
+
AND owner = SYS_CONTEXT('userenv', 'session_user')
|
398
361
|
SQL
|
399
362
|
end
|
400
363
|
|
@@ -425,8 +388,8 @@ module ActiveRecord
|
|
425
388
|
,cc.column_name
|
426
389
|
,c.constraint_name name
|
427
390
|
,c.delete_rule
|
428
|
-
FROM
|
429
|
-
|
391
|
+
FROM all_constraints#{db_link} c, all_cons_columns#{db_link} cc,
|
392
|
+
all_constraints#{db_link} r, all_cons_columns#{db_link} rc
|
430
393
|
WHERE c.owner = '#{owner}'
|
431
394
|
AND c.table_name = '#{desc_table_name}'
|
432
395
|
AND c.constraint_type = 'R'
|
@@ -463,9 +426,10 @@ module ActiveRecord
|
|
463
426
|
def disable_referential_integrity(&block) #:nodoc:
|
464
427
|
sql_constraints = <<-SQL
|
465
428
|
SELECT constraint_name, owner, table_name
|
466
|
-
FROM
|
429
|
+
FROM all_constraints
|
467
430
|
WHERE constraint_type = 'R'
|
468
431
|
AND status = 'ENABLED'
|
432
|
+
AND owner = SYS_CONTEXT('userenv', 'session_user')
|
469
433
|
SQL
|
470
434
|
old_constraints = select_all(sql_constraints)
|
471
435
|
begin
|
@@ -540,22 +504,6 @@ module ActiveRecord
|
|
540
504
|
"#{table_name.to_s[0,table_name_length-4]}_pkt"
|
541
505
|
end
|
542
506
|
|
543
|
-
def rebuild_primary_key_index_to_default_tablespace(table_name, options)
|
544
|
-
tablespace = default_tablespace_for(:index)
|
545
|
-
|
546
|
-
return unless tablespace
|
547
|
-
|
548
|
-
index_name = Base.connection.select_value(
|
549
|
-
"SELECT index_name FROM all_constraints
|
550
|
-
WHERE table_name = #{quote(table_name.upcase)}
|
551
|
-
AND constraint_type = 'P'
|
552
|
-
AND owner = SYS_CONTEXT('userenv', 'current_schema')")
|
553
|
-
|
554
|
-
return unless index_name
|
555
|
-
|
556
|
-
execute("ALTER INDEX #{quote_column_name(index_name)} REBUILD TABLESPACE #{tablespace}")
|
557
|
-
end
|
558
|
-
|
559
507
|
end
|
560
508
|
end
|
561
509
|
end
|
@@ -1,65 +1,61 @@
|
|
1
|
-
require 'digest/sha1'
|
2
|
-
|
3
1
|
module ActiveRecord
|
4
2
|
module ConnectionAdapters
|
5
|
-
module
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
3
|
+
module OracleEnhanced
|
4
|
+
module SchemaStatementsExt
|
5
|
+
# Create primary key trigger (so that you can skip primary key value in INSERT statement).
|
6
|
+
# By default trigger name will be "table_name_pkt", you can override the name with
|
7
|
+
# :trigger_name option (but it is not recommended to override it as then this trigger will
|
8
|
+
# not be detected by ActiveRecord model and it will still do prefetching of sequence value).
|
9
|
+
#
|
10
|
+
# add_primary_key_trigger :users
|
11
|
+
#
|
12
|
+
# You can also create primary key trigger using +create_table+ with :primary_key_trigger
|
13
|
+
# option:
|
14
|
+
#
|
15
|
+
# create_table :users, :primary_key_trigger => true do |t|
|
16
|
+
# # ...
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
def add_primary_key_trigger(table_name, options={})
|
20
|
+
# call the same private method that is used for create_table :primary_key_trigger => true
|
21
|
+
create_primary_key_trigger(table_name, options)
|
22
|
+
end
|
24
23
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
24
|
+
# Add synonym to existing table or view or sequence. Can be used to create local synonym to
|
25
|
+
# remote table in other schema or in other database
|
26
|
+
# Examples:
|
27
|
+
#
|
28
|
+
# add_synonym :posts, "blog.posts"
|
29
|
+
# add_synonym :posts_seq, "blog.posts_seq"
|
30
|
+
# add_synonym :employees, "hr.employees@dblink", :force => true
|
31
|
+
#
|
32
|
+
def add_synonym(name, table_name, options = {})
|
33
|
+
sql = "CREATE"
|
34
|
+
if options[:force] == true
|
35
|
+
sql << " OR REPLACE"
|
36
|
+
end
|
37
|
+
sql << " SYNONYM #{quote_table_name(name)} FOR #{quote_table_name(table_name)}"
|
38
|
+
execute sql
|
37
39
|
end
|
38
|
-
sql << " SYNONYM #{quote_table_name(name)} FOR #{quote_table_name(table_name)}"
|
39
|
-
execute sql
|
40
|
-
end
|
41
40
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
41
|
+
# Remove existing synonym to table or view or sequence
|
42
|
+
# Example:
|
43
|
+
#
|
44
|
+
# remove_synonym :posts, "blog.posts"
|
45
|
+
#
|
46
|
+
def remove_synonym(name)
|
47
|
+
execute "DROP SYNONYM #{quote_table_name(name)}"
|
48
|
+
end
|
50
49
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
50
|
+
# get synonyms for schema dump
|
51
|
+
def synonyms #:nodoc:
|
52
|
+
select_all("SELECT synonym_name, table_owner, table_name, db_link FROM all_synonyms where owner = SYS_CONTEXT('userenv', 'session_user')").collect do |row|
|
53
|
+
OracleEnhanced::SynonymDefinition.new(oracle_downcase(row['synonym_name']),
|
54
|
+
oracle_downcase(row['table_owner']), oracle_downcase(row['table_name']), oracle_downcase(row['db_link']))
|
55
|
+
end
|
56
56
|
end
|
57
|
-
end
|
58
57
|
|
58
|
+
end
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
62
|
-
|
63
|
-
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.class_eval do
|
64
|
-
include ActiveRecord::ConnectionAdapters::OracleEnhancedSchemaStatementsExt
|
65
|
-
end
|
@@ -6,7 +6,7 @@ module ActiveRecord #:nodoc:
|
|
6
6
|
STATEMENT_TOKEN = "\n\n/\n\n"
|
7
7
|
|
8
8
|
def structure_dump #:nodoc:
|
9
|
-
structure = select_values("SELECT sequence_name FROM
|
9
|
+
structure = select_values("SELECT sequence_name FROM all_sequences where sequence_owner = SYS_CONTEXT('userenv', 'session_user') ORDER BY 1").map do |seq|
|
10
10
|
"CREATE SEQUENCE \"#{seq}\""
|
11
11
|
end
|
12
12
|
select_values("SELECT table_name FROM all_tables t
|
@@ -18,8 +18,9 @@ module ActiveRecord #:nodoc:
|
|
18
18
|
ddl = "CREATE#{ ' GLOBAL TEMPORARY' if temporary_table?(table_name)} TABLE \"#{table_name}\" (\n"
|
19
19
|
cols = select_all(%Q{
|
20
20
|
SELECT column_name, data_type, data_length, char_used, char_length, data_precision, data_scale, data_default, nullable
|
21
|
-
FROM
|
21
|
+
FROM all_tab_columns
|
22
22
|
WHERE table_name = '#{table_name}'
|
23
|
+
AND owner = SYS_CONTEXT('userenv', 'session_user')
|
23
24
|
ORDER BY column_id
|
24
25
|
}).map do |row|
|
25
26
|
if(v = virtual_columns.find {|col| col['column_name'] == row['column_name']})
|
@@ -74,11 +75,12 @@ module ActiveRecord #:nodoc:
|
|
74
75
|
opts = {:name => '', :cols => []}
|
75
76
|
pks = select_all(<<-SQL, "Primary Keys")
|
76
77
|
SELECT a.constraint_name, a.column_name, a.position
|
77
|
-
FROM
|
78
|
-
JOIN
|
78
|
+
FROM all_cons_columns a
|
79
|
+
JOIN all_constraints c
|
79
80
|
ON a.constraint_name = c.constraint_name
|
80
81
|
WHERE c.table_name = '#{table.upcase}'
|
81
82
|
AND c.constraint_type = 'P'
|
83
|
+
AND a.owner = c.owner
|
82
84
|
AND c.owner = SYS_CONTEXT('userenv', 'current_schema')
|
83
85
|
SQL
|
84
86
|
pks.each do |row|
|
@@ -92,11 +94,12 @@ module ActiveRecord #:nodoc:
|
|
92
94
|
keys = {}
|
93
95
|
uks = select_all(<<-SQL, "Primary Keys")
|
94
96
|
SELECT a.constraint_name, a.column_name, a.position
|
95
|
-
FROM
|
96
|
-
JOIN
|
97
|
+
FROM all_cons_columns a
|
98
|
+
JOIN all_constraints c
|
97
99
|
ON a.constraint_name = c.constraint_name
|
98
100
|
WHERE c.table_name = '#{table.upcase}'
|
99
101
|
AND c.constraint_type = 'U'
|
102
|
+
AND a.owner = c.owner
|
100
103
|
AND c.owner = SYS_CONTEXT('userenv', 'current_schema')
|
101
104
|
SQL
|
102
105
|
uks.each do |uk|
|
@@ -213,7 +216,7 @@ module ActiveRecord #:nodoc:
|
|
213
216
|
end
|
214
217
|
|
215
218
|
# export views
|
216
|
-
select_all("SELECT view_name, text FROM
|
219
|
+
select_all("SELECT view_name, text FROM all_views WHERE owner = SYS_CONTEXT('userenv', 'session_user') ORDER BY view_name ASC").each do |view|
|
217
220
|
structure << "CREATE OR REPLACE FORCE VIEW #{view['view_name']} AS\n #{view['text']}"
|
218
221
|
end
|
219
222
|
|
@@ -229,7 +232,7 @@ module ActiveRecord #:nodoc:
|
|
229
232
|
end
|
230
233
|
|
231
234
|
def structure_drop #:nodoc:
|
232
|
-
statements = select_values("SELECT sequence_name FROM
|
235
|
+
statements = select_values("SELECT sequence_name FROM all_sequences where sequence_owner = SYS_CONTEXT('userenv', 'session_user') ORDER BY 1").map do |seq|
|
233
236
|
"DROP SEQUENCE \"#{seq}\""
|
234
237
|
end
|
235
238
|
select_values("SELECT table_name from all_tables t
|
@@ -302,8 +305,9 @@ module ActiveRecord #:nodoc:
|
|
302
305
|
begin
|
303
306
|
select_all <<-SQL
|
304
307
|
SELECT column_name, data_default
|
305
|
-
FROM
|
308
|
+
FROM all_tab_cols
|
306
309
|
WHERE virtual_column = 'YES'
|
310
|
+
AND owner = SYS_CONTEXT('userenv', 'session_user')
|
307
311
|
AND table_name = '#{table.upcase}'
|
308
312
|
SQL
|
309
313
|
# feature not supported previous to 11g
|
@@ -315,14 +319,14 @@ module ActiveRecord #:nodoc:
|
|
315
319
|
def drop_sql_for_feature(type)
|
316
320
|
short_type = type == 'materialized view' ? 'mview' : type
|
317
321
|
join_with_statement_token(
|
318
|
-
select_values("SELECT #{short_type}_name FROM
|
322
|
+
select_values("SELECT #{short_type}_name FROM all_#{short_type.tableize} where owner = SYS_CONTEXT('userenv', 'session_user')").map do |name|
|
319
323
|
"DROP #{type.upcase} \"#{name}\""
|
320
324
|
end)
|
321
325
|
end
|
322
326
|
|
323
327
|
def drop_sql_for_object(type)
|
324
328
|
join_with_statement_token(
|
325
|
-
select_values("SELECT object_name FROM
|
329
|
+
select_values("SELECT object_name FROM all_objects WHERE object_type = '#{type.upcase}' and owner = SYS_CONTEXT('userenv', 'session_user')").map do |name|
|
326
330
|
"DROP #{type.upcase} \"#{name}\""
|
327
331
|
end)
|
328
332
|
end
|