Skip to content

Commit 2de5839

Browse files
committed
Added database qualification to COL_LENGTH & OBJECTID methods to support cross database model relationships.
1 parent 9f06d96 commit 2de5839

File tree

1 file changed

+32
-32
lines changed

1 file changed

+32
-32
lines changed

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module ActiveRecord
22
module ConnectionAdapters
33
module Sqlserver
44
module SchemaStatements
5-
5+
66
def native_database_types
77
@native_database_types ||= initialize_native_database_types.freeze
88
end
@@ -43,11 +43,11 @@ def columns(table_name, name = nil)
4343
SQLServerColumn.new ci[:name], ci[:default_value], ci[:type], ci[:null], sqlserver_options
4444
end
4545
end
46-
46+
4747
def rename_table(table_name, new_name)
4848
do_execute "EXEC sp_rename '#{table_name}', '#{new_name}'"
4949
end
50-
50+
5151
def remove_column(table_name, *column_names)
5252
raise ArgumentError.new("You must specify at least one column name. Example: remove_column(:people, :first_name)") if column_names.empty?
5353
column_names.flatten.each do |column_name|
@@ -82,7 +82,7 @@ def rename_column(table_name, column_name, new_column_name)
8282
detect_column_for! table_name, column_name
8383
do_execute "EXEC sp_rename '#{table_name}.#{column_name}', '#{new_column_name}', 'COLUMN'"
8484
end
85-
85+
8686
def remove_index!(table_name, index_name)
8787
do_execute "DROP INDEX #{quote_column_name(index_name)} ON #{quote_table_name(table_name)}"
8888
end
@@ -112,18 +112,18 @@ def change_column_null(table_name, column_name, null, default = nil)
112112
sql << " NOT NULL" unless null
113113
do_execute sql
114114
end
115-
115+
116116
# === SQLServer Specific ======================================== #
117-
117+
118118
def views
119119
tables('VIEW')
120120
end
121-
122-
121+
122+
123123
protected
124-
124+
125125
# === SQLServer Specific ======================================== #
126-
126+
127127
def initialize_native_database_types
128128
{
129129
:primary_key => "int NOT NULL IDENTITY(1,1) PRIMARY KEY",
@@ -155,7 +155,7 @@ def column_definitions(table_name)
155155
table_schema = Utils.unqualify_table_schema(table_name)
156156
table_name = Utils.unqualify_table_name(table_name)
157157
sql = %{
158-
SELECT DISTINCT
158+
SELECT DISTINCT
159159
#{lowercase_schema_reflection_sql('columns.TABLE_NAME')} AS table_name,
160160
#{lowercase_schema_reflection_sql('columns.COLUMN_NAME')} AS name,
161161
columns.DATA_TYPE AS type,
@@ -165,24 +165,24 @@ def column_definitions(table_name)
165165
columns.ordinal_position,
166166
CASE
167167
WHEN columns.DATA_TYPE IN ('nchar','nvarchar') THEN columns.CHARACTER_MAXIMUM_LENGTH
168-
ELSE COL_LENGTH(columns.TABLE_SCHEMA+'.'+columns.TABLE_NAME, columns.COLUMN_NAME)
168+
ELSE COL_LENGTH('#{db_name_with_period}'+columns.TABLE_SCHEMA+'.'+columns.TABLE_NAME, columns.COLUMN_NAME)
169169
END AS [length],
170170
CASE
171171
WHEN columns.IS_NULLABLE = 'YES' THEN 1
172172
ELSE NULL
173173
END AS [is_nullable],
174-
CASE
174+
CASE
175175
WHEN KCU.COLUMN_NAME IS NOT NULL AND TC.CONSTRAINT_TYPE = N'PRIMARY KEY' THEN 1
176176
ELSE NULL
177177
END AS [is_primary],
178-
CASE
179-
WHEN COLUMNPROPERTY(OBJECT_ID(columns.TABLE_SCHEMA+'.'+columns.TABLE_NAME), columns.COLUMN_NAME, 'IsIdentity') = 1 THEN 1
178+
CASE
179+
WHEN COLUMNPROPERTY(OBJECT_ID('#{db_name_with_period}'+columns.TABLE_SCHEMA+'.'+columns.TABLE_NAME), columns.COLUMN_NAME, 'IsIdentity') = 1 THEN 1
180180
ELSE NULL
181181
END AS [is_identity]
182182
FROM #{db_name_with_period}INFORMATION_SCHEMA.COLUMNS columns
183-
LEFT OUTER JOIN #{db_name_with_period}INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
184-
ON TC.TABLE_NAME = columns.TABLE_NAME
185-
AND TC.CONSTRAINT_TYPE = N'PRIMARY KEY'
183+
LEFT OUTER JOIN #{db_name_with_period}INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
184+
ON TC.TABLE_NAME = columns.TABLE_NAME
185+
AND TC.CONSTRAINT_TYPE = N'PRIMARY KEY'
186186
LEFT OUTER JOIN #{db_name_with_period}INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU
187187
ON KCU.COLUMN_NAME = columns.COLUMN_NAME
188188
AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
@@ -231,7 +231,7 @@ def column_definitions(table_name)
231231
ci
232232
end
233233
end
234-
234+
235235
def remove_check_constraints(table_name, column_name)
236236
constraints = select_values "SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = '#{quote_string(table_name)}' and COLUMN_NAME = '#{quote_string(column_name)}'", 'SCHEMA'
237237
constraints.each do |constraint|
@@ -253,9 +253,9 @@ def remove_indexes(table_name, column_name)
253253
remove_index(table_name, {:name => index.name})
254254
end
255255
end
256-
256+
257257
# === SQLServer Specific (Misc Helpers) ========================= #
258-
258+
259259
def get_table_name(sql)
260260
if sql =~ /^\s*(INSERT|EXEC sp_executesql N'INSERT)\s+INTO\s+([^\(\s]+)\s*|^\s*update\s+([^\(\s]+)\s*/i
261261
$2 || $3
@@ -265,29 +265,29 @@ def get_table_name(sql)
265265
nil
266266
end
267267
end
268-
268+
269269
def default_constraint_name(table_name, column_name)
270270
"DF_#{table_name}_#{column_name}"
271271
end
272-
272+
273273
def detect_column_for!(table_name, column_name)
274274
unless column = schema_cache.columns[table_name].detect { |c| c.name == column_name.to_s }
275275
raise ActiveRecordError, "No such column: #{table_name}.#{column_name}"
276276
end
277277
column
278278
end
279-
279+
280280
def lowercase_schema_reflection_sql(node)
281281
lowercase_schema_reflection ? "LOWER(#{node})" : node
282282
end
283-
283+
284284
# === SQLServer Specific (View Reflection) ====================== #
285-
285+
286286
def view_table_name(table_name)
287287
view_info = schema_cache.view_information(table_name)
288288
view_info ? get_table_name(view_info['VIEW_DEFINITION']) : table_name
289289
end
290-
290+
291291
def view_information(table_name)
292292
table_name = Utils.unqualify_table_name(table_name)
293293
view_info = select_one "SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = '#{table_name}'", 'SCHEMA'
@@ -304,18 +304,18 @@ def view_information(table_name)
304304
end
305305
view_info
306306
end
307-
307+
308308
def table_name_or_views_table_name(table_name)
309309
unquoted_table_name = Utils.unqualify_table_name(table_name)
310310
schema_cache.view_names.include?(unquoted_table_name) ? view_table_name(unquoted_table_name) : unquoted_table_name
311311
end
312-
312+
313313
def views_real_column_name(table_name,column_name)
314314
view_definition = schema_cache.view_information(table_name)[:VIEW_DEFINITION]
315315
match_data = view_definition.match(/([\w-]*)\s+as\s+#{column_name}/im)
316316
match_data ? match_data[1] : column_name
317317
end
318-
318+
319319
# === SQLServer Specific (Identity Inserts) ===================== #
320320

321321
def query_requires_identity_insert?(sql)
@@ -327,11 +327,11 @@ def query_requires_identity_insert?(sql)
327327
false
328328
end
329329
end
330-
330+
331331
def insert_sql?(sql)
332332
!(sql =~ /^\s*(INSERT|EXEC sp_executesql N'INSERT)/i).nil?
333333
end
334-
334+
335335
def with_identity_insert_enabled(table_name)
336336
table_name = quote_table_name(table_name_or_views_table_name(table_name))
337337
set_identity_insert(table_name, true)

0 commit comments

Comments
 (0)