Skip to content

Commit 9fc551d

Browse files
committed
fix: MSSQL foreign key lookup to include table schema
Use the fully qualified database/schema/table name when resolving OBJECT_ID() for MSSQL foreign key metadata. This prevents SQL Server from implicitly resolving tables under dbo when the table belongs to another schema. Also include the referenced table schema in the foreign key metadata so references to non-dbo tables are preserved correctly. Refs #2462
1 parent 55c723f commit 9fc551d

1 file changed

Lines changed: 7 additions & 3 deletions

File tree

source/dbconnection.pas

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6448,14 +6448,17 @@ function TAdoDbConnection.GetTableForeignKeys(Table: TDBObject): TForeignKeyList
64486448
ForeignQuery := GetResults('SELECT'+
64496449
' f.name AS foreign_key_name,'+
64506450
' COL_NAME(fc.parent_object_id, fc.parent_column_id) AS constraint_column_name,'+
6451-
' OBJECT_NAME (f.referenced_object_id) AS referenced_object,'+
6451+
' SCHEMA_NAME(ro.schema_id) AS referenced_schema,'+
6452+
' OBJECT_NAME(f.referenced_object_id) AS referenced_object,'+
64526453
' COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS referenced_column_name,'+
64536454
' update_referential_action_desc,'+
64546455
' delete_referential_action_desc'+
64556456
' FROM sys.foreign_keys AS f'+
64566457
' INNER JOIN sys.foreign_key_columns AS fc'+
64576458
' ON f.object_id = fc.constraint_object_id'+
6458-
' WHERE f.parent_object_id = OBJECT_ID('+EscapeString(Table.Name)+')'
6459+
' INNER JOIN sys.objects AS ro'+
6460+
' ON ro.object_id = f.referenced_object_id'+
6461+
' WHERE f.parent_object_id = OBJECT_ID('+EscapeString(Table.QuotedDbAndTableName)+')'
64596462
);
64606463
ForeignKey := nil;
64616464
while not ForeignQuery.Eof do begin
@@ -6464,7 +6467,8 @@ function TAdoDbConnection.GetTableForeignKeys(Table: TDBObject): TForeignKeyList
64646467
Result.Add(ForeignKey);
64656468
ForeignKey.KeyName := ForeignQuery.Col('foreign_key_name');
64666469
ForeignKey.OldKeyName := ForeignKey.KeyName;
6467-
ForeignKey.ReferenceTable := ForeignQuery.Col('referenced_object');
6470+
ForeignKey.ReferenceTable :=
6471+
ForeignQuery.Col('referenced_schema') + '.' + ForeignQuery.Col('referenced_object');
64686472
ForeignKey.OnUpdate := ForeignQuery.Col('update_referential_action_desc');
64696473
ForeignKey.OnDelete := ForeignQuery.Col('delete_referential_action_desc');
64706474
end;

0 commit comments

Comments
 (0)