Skip to content

Commit 05dda4f

Browse files
committed
Way better schema support! Thanks to @ianic! Fixes #61
1 parent aecca5c commit 05dda4f

File tree

3 files changed

+48
-3
lines changed

3 files changed

+48
-3
lines changed

CHANGELOG

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11

22
* 3.0.15 *
33

4+
* Way better schema support! Thanks to @ianic! Fixes #61
5+
46
* Warn of possible permission problems if "EXEC sp_helptext..." does not work view. Fixes #73.
57

68

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def native_database_types
99

1010
def tables(name = nil)
1111
info_schema_query do
12-
select_values "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME <> 'dtproperties'"
12+
select_values "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME <> 'dtproperties' AND TABLE_SCHEMA = schema_name()"
1313
end
1414
end
1515

@@ -39,7 +39,7 @@ def indexes(table_name, name = nil)
3939

4040
def columns(table_name, name = nil)
4141
return [] if table_name.blank?
42-
cache_key = unqualify_table_name(table_name)
42+
cache_key = columns_cache_key(table_name)
4343
@sqlserver_columns_cache[cache_key] ||= column_definitions(table_name).collect do |ci|
4444
sqlserver_options = ci.except(:name,:default_value,:type,:null).merge(:database_year=>database_year)
4545
SQLServerColumn.new ci[:name], ci[:default_value], ci[:type], ci[:null], sqlserver_options
@@ -175,6 +175,7 @@ def initialize_native_database_types
175175
def column_definitions(table_name)
176176
db_name = unqualify_db_name(table_name)
177177
db_name_with_period = "#{db_name}." if db_name
178+
table_schema = unqualify_table_schema(table_name)
178179
table_name = unqualify_table_name(table_name)
179180
sql = %{
180181
SELECT
@@ -198,6 +199,7 @@ def column_definitions(table_name)
198199
END as is_identity
199200
FROM #{db_name_with_period}INFORMATION_SCHEMA.COLUMNS columns
200201
WHERE columns.TABLE_NAME = '#{table_name}'
202+
AND columns.TABLE_SCHEMA = #{table_schema.nil? ? "schema_name() " : "'#{table_schema}' "}
201203
ORDER BY columns.ordinal_position
202204
}.gsub(/[ \t\r\n]+/,' ')
203205
results = info_schema_query { select(sql,nil) }
@@ -266,6 +268,10 @@ def unqualify_table_name(table_name)
266268
table_name.to_s.split('.').last.tr('[]','')
267269
end
268270

271+
def unqualify_table_schema(table_name)
272+
table_name.to_s.split('.')[-2].gsub(/[\[\]]/,'') rescue nil
273+
end
274+
269275
def unqualify_db_name(table_name)
270276
table_names = table_name.to_s.split('.')
271277
table_names.length == 3 ? table_names.first.tr('[]','') : nil
@@ -332,7 +338,17 @@ def views_real_column_name(table_name,column_name)
332338
end
333339

334340
# === SQLServer Specific (Column/View Caches) =================== #
335-
341+
342+
def columns_cache_key(table_name)
343+
table_schema = unqualify_table_schema(table_name)
344+
table_name = unqualify_table_name(table_name)
345+
if table_schema
346+
"#{table_schema}.#{table_name}"
347+
else
348+
table_name
349+
end
350+
end
351+
336352
def remove_sqlserver_columns_cache_for(table_name)
337353
cache_key = unqualify_table_name(table_name)
338354
@sqlserver_columns_cache[cache_key] = nil

test/schema/sqlserver_specific_schema.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,33 @@
102102
/*#{'x'*4000}}*/
103103
FROM string_defaults
104104
STRINGDEFAULTSBIGVIEW
105+
106+
107+
# Another schema.
108+
create_table :sql_server_schema_columns, :force => true do |t|
109+
t.column :field1 , :integer
110+
end
111+
execute "IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'test') EXEC sp_executesql N'CREATE SCHEMA test'"
112+
execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sql_server_schema_columns' and TABLE_SCHEMA = 'test') DROP TABLE test.sql_server_schema_columns"
113+
execute <<-SIMILIARTABLEINOTHERSCHEMA
114+
CREATE TABLE test.sql_server_schema_columns(
115+
id int IDENTITY NOT NULL primary key,
116+
filed_1 int,
117+
field_2 int,
118+
name varchar(255),
119+
description varchar(1000),
120+
n_name nvarchar(255),
121+
n_description nvarchar(1000)
122+
)
123+
SIMILIARTABLEINOTHERSCHEMA
124+
execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sql_server_schema_identity' and TABLE_SCHEMA = 'test') DROP TABLE test.sql_server_schema_identity"
125+
execute <<-SIMILIARTABLEINOTHERSCHEMA
126+
CREATE TABLE test.sql_server_schema_identity(
127+
id int IDENTITY NOT NULL primary key,
128+
filed_1 int
129+
)
130+
SIMILIARTABLEINOTHERSCHEMA
131+
105132

106133
if sqlserver_azure?
107134
# Azure needs clustered indexes.

0 commit comments

Comments
 (0)