Skip to content

Commit 305534d

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 1799b0d commit 305534d

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
@@ -6297,14 +6297,17 @@ function TSqlSrvConnection.GetTableForeignKeys(Table: TDBObject): TForeignKeyLis
62976297
ForeignQuery := GetResults('SELECT'+
62986298
' f.name AS foreign_key_name,'+
62996299
' COL_NAME(fc.parent_object_id, fc.parent_column_id) AS constraint_column_name,'+
6300-
' OBJECT_NAME (f.referenced_object_id) AS referenced_object,'+
6300+
' SCHEMA_NAME(ro.schema_id) AS referenced_schema,'+
6301+
' OBJECT_NAME(f.referenced_object_id) AS referenced_object,'+
63016302
' COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS referenced_column_name,'+
63026303
' update_referential_action_desc,'+
63036304
' delete_referential_action_desc'+
63046305
' FROM sys.foreign_keys AS f'+
63056306
' INNER JOIN sys.foreign_key_columns AS fc'+
63066307
' ON f.object_id = fc.constraint_object_id'+
6307-
' WHERE f.parent_object_id = OBJECT_ID('+EscapeString(Table.Name)+')'
6308+
' INNER JOIN sys.objects AS ro'+
6309+
' ON ro.object_id = f.referenced_object_id'+
6310+
' WHERE f.parent_object_id = OBJECT_ID('+EscapeString(Table.QuotedDbAndTableName)+')'
63086311
);
63096312
ForeignKey := nil;
63106313
while not ForeignQuery.Eof do begin
@@ -6313,7 +6316,8 @@ function TSqlSrvConnection.GetTableForeignKeys(Table: TDBObject): TForeignKeyLis
63136316
Result.Add(ForeignKey);
63146317
ForeignKey.KeyName := ForeignQuery.Col('foreign_key_name');
63156318
ForeignKey.OldKeyName := ForeignKey.KeyName;
6316-
ForeignKey.ReferenceTable := ForeignQuery.Col('referenced_object');
6319+
ForeignKey.ReferenceTable :=
6320+
ForeignQuery.Col('referenced_schema') + '.' + ForeignQuery.Col('referenced_object');
63176321
ForeignKey.OnUpdate := ForeignQuery.Col('update_referential_action_desc');
63186322
ForeignKey.OnDelete := ForeignQuery.Col('delete_referential_action_desc');
63196323
end;

0 commit comments

Comments
 (0)