Skip to content

Commit 312538e

Browse files
committed
take object schemeas into account
1 parent ba68198 commit 312538e

File tree

1 file changed

+21
-12
lines changed

1 file changed

+21
-12
lines changed

sql_server/pyodbc/introspection.py

Lines changed: 21 additions & 12 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]))
@@ -126,14 +126,14 @@ def get_relations(self, cursor, table_name):
126126
d.COLUMN_NAME AS referenced_column_name
127127
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS a
128128
INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS b
129-
ON a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
129+
ON a.CONSTRAINT_NAME = b.CONSTRAINT_NAME AND a.TABLE_SCHEMA = b.CONSTRAINT_SCHEMA
130130
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE AS c
131-
ON b.UNIQUE_CONSTRAINT_NAME = c.CONSTRAINT_NAME
131+
ON b.UNIQUE_CONSTRAINT_NAME = c.CONSTRAINT_NAME AND b.CONSTRAINT_SCHEMA = c.CONSTRAINT_SCHEMA
132132
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS d
133-
ON c.CONSTRAINT_NAME = d.CONSTRAINT_NAME
133+
ON c.CONSTRAINT_NAME = d.CONSTRAINT_NAME AND c.CONSTRAINT_SCHEMA = d.CONSTRAINT_SCHEMA
134134
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS e
135-
ON a.CONSTRAINT_NAME = e.CONSTRAINT_NAME
136-
WHERE a.TABLE_NAME = %s AND a.CONSTRAINT_TYPE = 'FOREIGN KEY'"""
135+
ON a.CONSTRAINT_NAME = e.CONSTRAINT_NAME AND a.TABLE_SCHEMA = e.TABLE_SCHEMA
136+
WHERE a.TABLE_SCHEMA = SCHEMA_NAME() AND a.TABLE_NAME = %s AND a.CONSTRAINT_TYPE = 'FOREIGN KEY'"""
137137
cursor.execute(sql, (table_name,))
138138
return dict([[item[0], (item[2], item[1])] for item in cursor.fetchall()])
139139

@@ -156,15 +156,20 @@ def get_indexes(self, cursor, table_name):
156156

157157
pk_uk_sql = """
158158
SELECT d.COLUMN_NAME, c.CONSTRAINT_TYPE FROM (
159-
SELECT a.CONSTRAINT_NAME, a.CONSTRAINT_TYPE
159+
SELECT a.CONSTRAINT_NAME, a.CONSTRAINT_TYPE, a.TABLE_SCHEMA
160160
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS a
161161
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS b
162-
ON a.CONSTRAINT_NAME = b.CONSTRAINT_NAME AND a.TABLE_NAME = b.TABLE_NAME
163-
WHERE a.TABLE_NAME = %s AND (CONSTRAINT_TYPE = 'PRIMARY KEY' OR CONSTRAINT_TYPE = 'UNIQUE')
164-
GROUP BY a.CONSTRAINT_TYPE, a.CONSTRAINT_NAME
162+
ON a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
163+
AND a.TABLE_SCHEMA = b.TABLE_SCHEMA
164+
AND a.TABLE_NAME = b.TABLE_NAME
165+
WHERE a.TABLE_SCHEMA = SCHEMA_NAME()
166+
AND a.TABLE_NAME = %s
167+
AND (CONSTRAINT_TYPE = 'PRIMARY KEY' OR CONSTRAINT_TYPE = 'UNIQUE')
168+
GROUP BY a.CONSTRAINT_TYPE, a.CONSTRAINT_NAME, a.TABLE_SCHEMA
165169
HAVING(COUNT(a.CONSTRAINT_NAME)) = 1) AS c
166170
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS d
167-
ON c.CONSTRAINT_NAME = d.CONSTRAINT_NAME"""
171+
ON c.CONSTRAINT_NAME = d.CONSTRAINT_NAME
172+
AND c.TABLE_SCHEMA = d.TABLE_SCHEMA"""
168173

169174
field_names = [item[0] for item in self.get_table_description(cursor, table_name, identity_check=False)]
170175
indexes, results = {}, {}
@@ -190,6 +195,7 @@ def get_indexes(self, cursor, table_name):
190195
HAVING count(1) = 1)
191196
AND ix.is_primary_key = 0
192197
AND ix.is_unique_constraint = 0
198+
AND t.schema_id = SCHEMA_ID()
193199
AND t.name = %s"""
194200

195201
cursor.execute(ix_sql, (table_name,))
@@ -217,7 +223,7 @@ def get_key_columns(self, cursor, table_name):
217223
INNER JOIN sys.columns c ON c.object_id = t.object_id AND c.column_id = fk.parent_column_id
218224
INNER JOIN sys.tables rt ON rt.object_id = fk.referenced_object_id
219225
INNER JOIN sys.columns rc ON rc.object_id = rt.object_id AND rc.column_id = fk.referenced_column_id
220-
WHERE t.name = %s""", [table_name])
226+
WHERE t.schema_id = SCHEMA_ID() AND t.name = %s""", [table_name])
221227
key_columns.extend([tuple(row) for row in cursor.fetchall()])
222228
return key_columns
223229

@@ -280,6 +286,7 @@ def get_constraints(self, cursor, table_name):
280286
kc.table_name = fk.table_name AND
281287
kc.column_name = fk.column_name
282288
WHERE
289+
kc.table_schema = SCHEMA_NAME() AND
283290
kc.table_name = %s
284291
ORDER BY kc.ordinal_position ASC
285292
""", [table_name])
@@ -306,6 +313,7 @@ def get_constraints(self, cursor, table_name):
306313
kc.constraint_name = c.constraint_name
307314
WHERE
308315
c.constraint_type = 'CHECK' AND
316+
kc.table_schema = SCHEMA_NAME() AND
309317
kc.table_name = %s
310318
""", [table_name])
311319
for constraint, column in cursor.fetchall():
@@ -344,6 +352,7 @@ def get_constraints(self, cursor, table_name):
344352
ic.object_id = c.object_id AND
345353
ic.column_id = c.column_id
346354
WHERE
355+
t.schema_id = SCHEMA_ID() AND
347356
t.name = %s
348357
ORDER BY
349358
i.index_id ASC,

0 commit comments

Comments
 (0)