Skip to content

Commit 760036b

Browse files
committed
Merge branch 'azure-1.11' into azure-2.0
2 parents ecf8dde + 312538e commit 760036b

File tree

1 file changed

+22
-13
lines changed

1 file changed

+22
-13
lines changed

sql_server/pyodbc/introspection.py

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def get_table_list(self, cursor):
6262
"""
6363
Returns a list of table and view names in the current database.
6464
"""
65-
sql = 'SELECT TABLE_NAME, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES'
65+
sql = 'SELECT TABLE_NAME, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = SCHEMA_NAME()'
6666
cursor.execute(sql)
6767
types = {'BASE TABLE': 't', 'VIEW': 'v'}
6868
return [TableInfo(row[0], types.get(row[1]))
@@ -114,7 +114,7 @@ def get_sequences(self, cursor, table_name, table_fields=()):
114114
cursor.execute("""
115115
SELECT c.name FROM sys.columns c
116116
INNER JOIN sys.tables t ON c.object_id = t.object_id
117-
WHERE t.name = %s AND c.is_identity = 1""",
117+
WHERE t.schema_id = SCHEMA_ID() AND t.name = %s AND c.is_identity = 1""",
118118
[table_name])
119119
# SQL Server allows only one identity column per table
120120
# https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property
@@ -137,14 +137,14 @@ def get_relations(self, cursor, table_name):
137137
d.COLUMN_NAME AS referenced_column_name
138138
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS a
139139
INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS b
140-
ON a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
140+
ON a.CONSTRAINT_NAME = b.CONSTRAINT_NAME AND a.TABLE_SCHEMA = b.CONSTRAINT_SCHEMA
141141
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE AS c
142-
ON b.UNIQUE_CONSTRAINT_NAME = c.CONSTRAINT_NAME
142+
ON b.UNIQUE_CONSTRAINT_NAME = c.CONSTRAINT_NAME AND b.CONSTRAINT_SCHEMA = c.CONSTRAINT_SCHEMA
143143
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS d
144-
ON c.CONSTRAINT_NAME = d.CONSTRAINT_NAME
144+
ON c.CONSTRAINT_NAME = d.CONSTRAINT_NAME AND c.CONSTRAINT_SCHEMA = d.CONSTRAINT_SCHEMA
145145
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS e
146-
ON a.CONSTRAINT_NAME = e.CONSTRAINT_NAME
147-
WHERE a.TABLE_NAME = %s AND a.CONSTRAINT_TYPE = 'FOREIGN KEY'"""
146+
ON a.CONSTRAINT_NAME = e.CONSTRAINT_NAME AND a.TABLE_SCHEMA = e.TABLE_SCHEMA
147+
WHERE a.TABLE_SCHEMA = SCHEMA_NAME() AND a.TABLE_NAME = %s AND a.CONSTRAINT_TYPE = 'FOREIGN KEY'"""
148148
cursor.execute(sql, (table_name,))
149149
return dict([[item[0], (item[2], item[1])] for item in cursor.fetchall()])
150150

@@ -167,15 +167,20 @@ def get_indexes(self, cursor, table_name):
167167

168168
pk_uk_sql = """
169169
SELECT d.COLUMN_NAME, c.CONSTRAINT_TYPE FROM (
170-
SELECT a.CONSTRAINT_NAME, a.CONSTRAINT_TYPE
170+
SELECT a.CONSTRAINT_NAME, a.CONSTRAINT_TYPE, a.TABLE_SCHEMA
171171
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS a
172172
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS b
173-
ON a.CONSTRAINT_NAME = b.CONSTRAINT_NAME AND a.TABLE_NAME = b.TABLE_NAME
174-
WHERE a.TABLE_NAME = %s AND (CONSTRAINT_TYPE = 'PRIMARY KEY' OR CONSTRAINT_TYPE = 'UNIQUE')
175-
GROUP BY a.CONSTRAINT_TYPE, a.CONSTRAINT_NAME
173+
ON a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
174+
AND a.TABLE_SCHEMA = b.TABLE_SCHEMA
175+
AND a.TABLE_NAME = b.TABLE_NAME
176+
WHERE a.TABLE_SCHEMA = SCHEMA_NAME()
177+
AND a.TABLE_NAME = %s
178+
AND (CONSTRAINT_TYPE = 'PRIMARY KEY' OR CONSTRAINT_TYPE = 'UNIQUE')
179+
GROUP BY a.CONSTRAINT_TYPE, a.CONSTRAINT_NAME, a.TABLE_SCHEMA
176180
HAVING(COUNT(a.CONSTRAINT_NAME)) = 1) AS c
177181
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS d
178-
ON c.CONSTRAINT_NAME = d.CONSTRAINT_NAME"""
182+
ON c.CONSTRAINT_NAME = d.CONSTRAINT_NAME
183+
AND c.TABLE_SCHEMA = d.TABLE_SCHEMA"""
179184

180185
field_names = [item[0] for item in self.get_table_description(cursor, table_name, identity_check=False)]
181186
indexes, results = {}, {}
@@ -201,6 +206,7 @@ def get_indexes(self, cursor, table_name):
201206
HAVING count(1) = 1)
202207
AND ix.is_primary_key = 0
203208
AND ix.is_unique_constraint = 0
209+
AND t.schema_id = SCHEMA_ID()
204210
AND t.name = %s"""
205211

206212
cursor.execute(ix_sql, (table_name,))
@@ -228,7 +234,7 @@ def get_key_columns(self, cursor, table_name):
228234
INNER JOIN sys.columns c ON c.object_id = t.object_id AND c.column_id = fk.parent_column_id
229235
INNER JOIN sys.tables rt ON rt.object_id = fk.referenced_object_id
230236
INNER JOIN sys.columns rc ON rc.object_id = rt.object_id AND rc.column_id = fk.referenced_column_id
231-
WHERE t.name = %s""", [table_name])
237+
WHERE t.schema_id = SCHEMA_ID() AND t.name = %s""", [table_name])
232238
key_columns.extend([tuple(row) for row in cursor.fetchall()])
233239
return key_columns
234240

@@ -291,6 +297,7 @@ def get_constraints(self, cursor, table_name):
291297
kc.table_name = fk.table_name AND
292298
kc.column_name = fk.column_name
293299
WHERE
300+
kc.table_schema = SCHEMA_NAME() AND
294301
kc.table_name = %s
295302
ORDER BY kc.ordinal_position ASC
296303
""", [table_name])
@@ -317,6 +324,7 @@ def get_constraints(self, cursor, table_name):
317324
kc.constraint_name = c.constraint_name
318325
WHERE
319326
c.constraint_type = 'CHECK' AND
327+
kc.table_schema = SCHEMA_NAME() AND
320328
kc.table_name = %s
321329
""", [table_name])
322330
for constraint, column in cursor.fetchall():
@@ -355,6 +363,7 @@ def get_constraints(self, cursor, table_name):
355363
ic.object_id = c.object_id AND
356364
ic.column_id = c.column_id
357365
WHERE
366+
t.schema_id = SCHEMA_ID() AND
358367
t.name = %s
359368
ORDER BY
360369
i.index_id ASC,

0 commit comments

Comments
 (0)