By Frank Kalis
Was soll denn diese Frage? Ein Blick in BOL in die Spezifikationen der maximalen Kapazität sagt einem sofort, daß SQL Server 2000 253 Verweise auf Fremdschlüsseltabellen pro Tabelle haben kann. So, damit wäre diese Frage ja schon beantwortet. Fertig, Neues Thema...Halt
Neulich berichtete jemand auf SQL Server Central.com von folgender Fehlermeldung:
Server: Msg 8621, Level 17, State 1, Line 1
Internal Query Processor Error: The query processor ran out of stack space during query optimization.
Er hätte eine Tabelle, die sage und schreibe 1009!!! Verweise auf Fremdschlüsseltabellen enthielt. Vernachlässigen wir jetzt mal komplett die Tatsache, daß man das Datenmodell in Frage stellen könnte und konzentrieren uns allein auf diese 1009 FK's. Kann das sein? Ausprobieren geht über studieren. Und so basteln wir uns folgendes Testskript:
create database test_me
go
use test_me
go
declare @i int
declare @stmt nvarchar(4000)
create table t_master(c1 int primary key default 1)
set @i=1
while @i<=1009
begin
set @stmt =
'create table t_child'+cast(@i as nvarchar)+
' (c1 int foreign key references t_master(c1))'
exec sp_executesql @stmt
set @i = @i+1
end
insert into t_master default values
delete from t_master
use master
drop database test_me
Was soll dieses Skript machen? Nun, zunächst erstellen wir einmal eine frische, neue Datenbank. In dieser wird nun eine Mastertabelle t_master erstellt. Schließlich werden in einer Schleife 1009 Childtabellen erstellt, die alle die t_master Tabelle referenzieren. Da 1009 nun geringfügig größer ist als die lt. BOL zulässigen 253 sollten wir einen Fehler erhalten, richtig? Falsch! Das Skript läuft zunächst fehlerfrei durch. Die Tabellen werden erstellt, Genauso wie die Fremdschlüsseleinschränkungen. Dies kann man sehr leicht durch
select count(*) from information_schema.referential_constraints
-----------
1009
(1 row(s) affected)
nachkontrollieren. Hm, kann da jemand bei Microsoft nicht zählen? Was soll das?
Aber es kommt noch besser. Das INSERT läuft ebenfalls noch fehlerfrei durch. Versucht man aber danach mit DELETE die Zeile aus der Master Tabelle wieder zu löschen, kommt die schöne, bereits weiter oben erwähnte Fehlermeldung (diesmal in Deutsch):
Server: Nachr.-Nr. 8621, Schweregrad 17, Status 1, Zeile 1
Interner Fehler ... Abfrageoptimierung zu wenig Stackspeicherplatz.
Was soll man dazu sagen? Vielleicht habe ich ja die Spezifikation in BOL falsch verstanden? Irren ist ja schließlich menschlich. Vielleicht verstehe ich ja auch nicht, was "Verweise auf Fremdschlüsseltabellen pro Tabelle" bedeutet.
Macht BOL ein inkorrekte Aussage? Noch einmal, abgesehen davon, daß meiner Meinung nach, das eigentliche Problem im Datenmodell liegt, sollte SQL Server einen Fehler auslösen, wenn man versucht, mehr als die angegebenen 253 FK's zu erstellen. Da dies aber nicht passiert, halte ich die Aussage in BOL für nicht zutreffend.