<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlserver.ro/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>T-SQL</title><link>http://sqlserver.ro/forums/15/ShowForum.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Re: Probleme limita referinte la o tabela; The query processor ran out of stack space during query optimization. Please simplify the query</title><link>http://sqlserver.ro/forums/thread/2906.aspx</link><pubDate>Tue, 09 Oct 2007 11:45:59 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:2906</guid><dc:creator>Diana</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/2906.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=2906</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://sqlserver.ro/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;rsocol:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;b&gt;Diana,&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Cascading DRI nu ajută în
acest caz. Chiar sunt neindicate: dacă ştergi user-ul, să ştergi toate
înregistrările modificate de el ?! În nici un caz. Poate te refereai la
Cascading DRI între tabela Users şi tabelele u1, u2, etc. Atunci da, ai
dreptate, însă menţinerea acestor tabele presupune şi adăugarea datelor
în ele (nu doar ştergerea), aşa că oricum îţi trebuie un trigger.&lt;/p&gt;&lt;p&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;/p&gt;&lt;p&gt;...este o cale de explorat, nu neaparat de urmat...&lt;br&gt;
&lt;/p&gt;</description></item><item><title>Re: Probleme limita referinte la o tabela; The query processor ran out of stack space during query optimization. Please simplify the query</title><link>http://sqlserver.ro/forums/thread/2904.aspx</link><pubDate>Tue, 09 Oct 2007 11:14:58 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:2904</guid><dc:creator>rsocol</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/2904.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=2904</wfw:commentRss><description>&lt;p&gt;După câte înţeleg eu, e vorba de [2], pentru că Ela a scris "[...] facem fk din orice tabela catre cea de useri ca sa logam id-ul
userului&amp;nbsp;care a creat fiecare&amp;nbsp;inregistrare si a celui care a
modificat-o ultima data."&lt;/p&gt;&lt;p&gt;Răzvan&amp;nbsp;&lt;/p&gt;</description></item><item><title>Re: Probleme limita referinte la o tabela; The query processor ran out of stack space during query optimization. Please simplify the query</title><link>http://sqlserver.ro/forums/thread/2903.aspx</link><pubDate>Tue, 09 Oct 2007 10:30:05 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:2903</guid><dc:creator>B_gd_n[ ]Sahlean</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/2903.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=2903</wfw:commentRss><description>&lt;p&gt;
										&lt;a href="http://sqlserver.ro/forums/members/elenivarsavia.aspx"&gt;elenivarsavia&lt;/a&gt; &amp;gt; Am o intrebare: rolul acestei solutii de proiectare a bazei de date folosind o tabela cu utilizatori si cu legaturi de la celelante tabele la tabela utilizator este acela:&lt;br&gt;&lt;/p&gt;&lt;p&gt;[1] de a restrictiona accesul utilizatorilor doar la inregistrarile&amp;nbsp; "lor"&lt;/p&gt;&lt;p&gt;sau&lt;/p&gt;&lt;p&gt;[2]&amp;nbsp; de a permite inregistrarea tuturor modificarilor realizate de un utilizator (prin executia de comenzi INSERT / UPDATE / DELETE)&lt;br&gt;&lt;/p&gt;&lt;p&gt;?&amp;nbsp;&lt;/p&gt;</description></item><item><title>Re: Probleme limita referinte la o tabela; The query processor ran out of stack space during query optimization. Please simplify the query</title><link>http://sqlserver.ro/forums/thread/2902.aspx</link><pubDate>Tue, 09 Oct 2007 08:46:40 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:2902</guid><dc:creator>rsocol</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/2902.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=2902</wfw:commentRss><description>&lt;p&gt;După cum spuneam, întreţinerea FK-urilor (spre mai multe tabele alternative de utilizatori) poate fi automatizată.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;Să presupunem că ai 350 de tabele
cu FK-uri spre tabela Users:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;USE tempdb&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;CREATE TABLE Users (&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; UserID int IDENTITY PRIMARY KEY,&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; UserName nvarchar(50) NOT NULL UNIQUE&lt;br&gt;
)&lt;br&gt;&lt;br&gt;
CREATE TABLE T1 (a int primary key, UserID int references Users(UserID))&lt;br&gt;
CREATE TABLE T2 (a int primary key, UserID int references Users(UserID))&lt;br&gt;
[...]&lt;br&gt;
CREATE TABLE T350 (a int primary key, UserID int references Users(UserID))&lt;/b&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;

&lt;p&gt;Pentru cei care vor să testeze ideea, CREATE TABLE-urile de mai sus pot fi
generate cu următorul query:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;SELECT 'CREATE TABLE T'+CAST(n as varchar(10))+' (a int primary key, UserID
int references Users(UserID))'&lt;br&gt;
FROM (SELECT TOP 350 ROW_NUMBER() OVER (ORDER BY name) n FROM syscolumns) x&lt;/b&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;

&lt;p&gt;Ei, în acest caz, dacă vrem să ştergem pur şi simplu din tabela Users cu
instrucţiunea "&lt;b&gt;DELETE Users WHERE UserID=1&lt;/b&gt;", obţinem minunata eroare:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Msg 8621, Level 17, State 2, Line 1&lt;br&gt;
The query processor ran out of stack space during query optimization. Please
simplify the query.&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Să presupunem că facem 5 tabele auxiliare cu useri (n-avem nevoie decât de
UserID, nu şi de celelalte coloane din tabela Users):&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;



&lt;p class="MsoNormal"&gt;&lt;b&gt;CREATE TABLE Users1 (UserID int PRIMARY KEY REFERENCES Users)&lt;br&gt;CREATE TABLE Users2 (UserID int PRIMARY KEY REFERENCES Users)&lt;br&gt;CREATE TABLE Users3 (UserID int PRIMARY KEY REFERENCES Users)&lt;br&gt;CREATE TABLE Users4 (UserID int PRIMARY KEY REFERENCES Users)&lt;br&gt;CREATE TABLE Users5 (UserID int PRIMARY KEY REFERENCES Users)&lt;br&gt;&lt;br&gt;GO&lt;br&gt;CREATE TRIGGER CopiazaUserID ON Users FOR INSERT&lt;br&gt;AS&lt;br&gt;IF @@ROWCOUNT&amp;gt;0 BEGIN&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET NOCOUNT ON&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INSERT INTO Users1 (UserID) SELECT UserID FROM inserted&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INSERT INTO Users2 (UserID) SELECT UserID FROM inserted&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INSERT INTO Users3 (UserID) SELECT UserID FROM inserted&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INSERT INTO Users4 (UserID) SELECT UserID FROM inserted&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INSERT INTO Users5 (UserID) SELECT UserID FROM inserted&lt;br&gt;END&lt;br&gt;&lt;br&gt;GO&lt;br&gt;CREATE TRIGGER StergeUserID ON Users INSTEAD OF DELETE&lt;br&gt;AS&lt;br&gt;IF @@ROWCOUNT&amp;gt;0 BEGIN&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET NOCOUNT ON&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DELETE Users1 WHERE UserID IN (SELECT UserID FROM deleted)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DELETE Users2 WHERE UserID IN (SELECT UserID FROM deleted)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DELETE Users3 WHERE UserID IN (SELECT UserID FROM deleted)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DELETE Users4 WHERE UserID IN (SELECT UserID FROM deleted)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DELETE Users5 WHERE UserID IN (SELECT UserID FROM deleted)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DELETE Users WHERE UserID IN (SELECT UserID FROM deleted)&lt;br&gt;END&lt;/b&gt;&lt;br&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;În loc de trigger-ul "INSTEAD OF DELETE" puteam să facem CASCADE DELETE la cele 5 FK-uri, dar cred că ar funcţiona mai bine aşa.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Cu 5 tabele de user-i, dacă alocăm pe rând FK-urile la cea mai puţin utilizată, putem să ajungem până la vreo 1000 de tabele cu FK-uri fără să dea eroare. Pentru a modifica FK-urile existente, putem executa următoarea procedură:&lt;/p&gt;&lt;p&gt;&lt;b&gt;CREATE PROCEDURE FixUserFKs&lt;br&gt;AS&lt;br&gt;SET NOCOUNT ON&lt;br&gt;&lt;br&gt;BEGIN TRAN&lt;br&gt;&lt;br&gt;DECLARE ForeignKeysList CURSOR LOCAL READ_ONLY FOR&lt;br&gt;SELECT OBJECT_NAME(f.object_id) as FKName, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SCHEMA_NAME(t.schema_id) as SchemaName, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; t.name as TableName, c.name as ColumnName&lt;br&gt;FROM sys.foreign_keys f INNER JOIN sys.tables t ON f.parent_object_id=t.object_id&lt;br&gt;INNER JOIN sys.foreign_key_columns fc ON f.object_id=fc.constraint_object_id&lt;br&gt;INNER JOIN sys.columns c ON c.object_id=t.object_id AND c.column_id=fc.parent_column_id&lt;br&gt;WHERE f.referenced_object_id=OBJECT_ID('Users')&lt;br&gt;ORDER BY TableName&lt;br&gt;IF @@ERROR&amp;lt;&amp;gt;0 BEGIN ROLLBACK RETURN END&lt;br&gt;&lt;br&gt;DECLARE @FKName sysname, @SchemaName sysname, @TableName sysname, @ColumnName sysname&lt;br&gt;OPEN ForeignKeysList&lt;br&gt;IF @@ERROR&amp;lt;&amp;gt;0 BEGIN ROLLBACK RETURN END&lt;br&gt;&lt;br&gt;WHILE 1=1 BEGIN&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FETCH NEXT FROM ForeignKeysList INTO @FKName, @SchemaName, @TableName, @ColumnName&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF @@FETCH_STATUS&amp;lt;&amp;gt;0 BREAK&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE @ReferencedTable sysname&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @ReferencedTable=name FROM (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT TOP 1 name, (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT COUNT(*) FROM sys.foreign_keys f&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE f.referenced_object_id=t.object_id&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ) cnt&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FROM sys.tables t&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE name LIKE 'Users[1-5]'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ORDER BY cnt, name&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) X WHERE cnt&amp;lt;255&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF @@ERROR&amp;lt;&amp;gt;0 BEGIN ROLLBACK RETURN END&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF @ReferencedTable IS NULL BEGIN&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; RAISERROR ('Could not find any alternate Users table !',16,1)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ROLLBACK&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE @SQL nvarchar(4000)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @SQL='ALTER TABLE '+QUOTENAME(@SchemaName)+'.'+QUOTENAME(@TableName)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; +' DROP CONSTRAINT '+QUOTENAME(@FKName)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRINT @SQL&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXEC(@SQL)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF @@ERROR&amp;lt;&amp;gt;0 BEGIN ROLLBACK RETURN END&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @SQL='ALTER TABLE '+QUOTENAME(@SchemaName)+'.'+QUOTENAME(@TableName)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; +' ADD CONSTRAINT '+QUOTENAME(@FKName)+' FOREIGN KEY ('+QUOTENAME(@ColumnName)+')'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; +' REFERENCES '+QUOTENAME(@ReferencedTable)+' (UserID)'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRINT @SQL&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXEC(@SQL)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF @@ERROR&amp;lt;&amp;gt;0 BEGIN ROLLBACK RETURN END&lt;br&gt;END&lt;br&gt;&lt;br&gt;CLOSE ForeignKeysList&lt;br&gt;DEALLOCATE ForeignKeysList&lt;br&gt;&lt;br&gt;COMMIT&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Putem executa această procedură şi mai târziu, dacă se creează noi FK-uri care referă tabela Users. De fapt, putem să le spunem dezvoltatorilor: "nu vă bateţi capul să alegeţi voi tabela alternativă potrivită; faceţi FK-urile noi către tabela Users, iar din când în când o să executăm această procedură ca să le mute pe alte tabele mai puţin folosite". Şi astfel putem să trăim fericiţi până la adânci bătrâneţi fără să ne mai doară problema cu numărul prea mare de FK-uri spre aceeaşi tabelă.&lt;br&gt;&lt;/p&gt;Pentru cei care au vrut să testeze soluţia de mai sus, puteţi să scăpaţi de sutele de tabele de test executând rezultatul query-ului:&lt;p&gt;&lt;b&gt;SELECT 'DROP TABLE T'+CAST(n as varchar(10))&lt;br&gt;FROM (SELECT TOP 350 ROW_NUMBER() OVER (ORDER BY name) n FROM syscolumns) x&lt;br&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;iar apoi:&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;DROP TABLE Users1, Users2, Users3, Users4, Users5&lt;br&gt;DROP TABLE Users&lt;/b&gt; &lt;/p&gt;&lt;p&gt;dar oricum, dacă le-aţi creat în tempdb, ele vor fi şterse automat la următoarea restartare a server-ului.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Răzvan Socol&lt;br&gt;
SQL Server MVP&lt;/p&gt;</description></item><item><title>Re: Probleme limita referinte la o tabela; The query processor ran out of stack space during query optimization. Please simplify the query</title><link>http://sqlserver.ro/forums/thread/2900.aspx</link><pubDate>Tue, 09 Oct 2007 08:01:33 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:2900</guid><dc:creator>rsocol</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/2900.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=2900</wfw:commentRss><description>&lt;p&gt;&lt;strong&gt;Cryogenic1981,&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Problema e într-adevăr cauzată de numărul mare de FK-uri spre aceeaşi tabelă (nu de modul în care e scris query-ul). Query-ul poate fi pur şi simplu:&lt;/p&gt;&lt;p&gt;DELETE Users WHERE UserID=101&lt;/p&gt;&lt;p&gt;Dar încearcă aceeaşi instrucţiune dacă ai două tabele care referă UserID sau dacă ai zece tabele care referă UserID. O să observi o diferenţă semnificativă în complexitatea query plan-ului.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Diana,&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Cascading DRI nu ajută în acest caz. Chiar sunt neindicate: dacă ştergi user-ul, să ştergi toate înregistrările modificate de el ?! În nici un caz. Poate te refereai la Cascading DRI între tabela Users şi tabelele u1, u2, etc. Atunci da, ai dreptate, însă menţinerea acestor tabele presupune şi adăugarea datelor în ele (nu doar ştergerea), aşa că oricum îţi trebuie un trigger.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Ela,&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Întreţinerea FK-urilor poate fi automatizată. Revin astăzi cu detalii.&lt;/p&gt;&lt;p&gt;Răzvan&amp;nbsp;&lt;/p&gt;</description></item><item><title>Re: Probleme limita referinte la o tabela; The query processor ran out of stack space during query optimization. Please simplify the query</title><link>http://sqlserver.ro/forums/thread/2896.aspx</link><pubDate>Mon, 08 Oct 2007 20:09:01 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:2896</guid><dc:creator>Diana</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/2896.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=2896</wfw:commentRss><description>&lt;p&gt;Mai poti:&lt;/p&gt;&lt;p&gt;- sa folosesti "cascading referential integrity constraints" (vezi Books Online pentru detalii).&lt;/p&gt;&lt;p&gt;-
sa adaugi in tabela de useri un camp "IsActive" (bit). Nu mai stergi
userul, ci, in functie de valoarea campului, modifici logica aplicatiei.&lt;/p&gt;&lt;p&gt;Ce
vei face depinde si de "business rules". Intr-adevar, pentru un sfat
mai amanuntit ar trebui sa dai amanunte - structura bazei de date,
"business rules", query cu probleme - in cazul tau probabil un query prea "stufos"...&lt;/p&gt;&lt;p&gt;Vezi de asemenea si:&lt;/p&gt;&lt;p&gt;http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=824404&amp;amp;SiteID=1&lt;/p&gt;&lt;p&gt;http://msdn2.microsoft.com/en-us/library/aa337357.aspx&amp;nbsp;&lt;/p&gt;</description></item><item><title>Re: Probleme limita referinte la o tabela; The query processor ran out of stack space during query optimization. Please simplify the query</title><link>http://sqlserver.ro/forums/thread/2886.aspx</link><pubDate>Mon, 08 Oct 2007 14:24:49 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:2886</guid><dc:creator>Cryogenic1981</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/2886.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=2886</wfw:commentRss><description>&lt;p&gt;Problema nu este nr. de FK-uri ci modul in care e scris query-ul, pesupun ca query-ul in cauza foloseste in clauza where multe conditii de forma WHERE ... ID_xxx IN (1,2,3,4 ...n1,n2,n3).&lt;/p&gt;&lt;p&gt;Daca e asa solutia e rescrierea query-ului, daca poti sa-mi confirmi asta si eventual sa si postezi un query, stiu mai multe solutii la problema. Daca nu e asa oricum tot query-ul e de vina si ar ajuta sa postezi query-ul pt. a vedea cum arata.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>Probleme limita referinte la o tabela; The query processor ran out of stack space during query optimization. Please simplify the query</title><link>http://sqlserver.ro/forums/thread/2885.aspx</link><pubDate>Mon, 08 Oct 2007 13:23:00 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:2885</guid><dc:creator>elenivarsavia</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/2885.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=2885</wfw:commentRss><description>&lt;P&gt;Buna,&lt;/P&gt;
&lt;P&gt;as avea nevoie de un sfat referitor la o problema de arhitectura. &lt;/P&gt;
&lt;P&gt;Folosesc in BD o tabela de useri, sincronizata cu AD, care este referita de majoritatea tabelelor din DB, prin cel putin 2&amp;nbsp;campuri. Noi ne-am gandit sa facem fk din orice tabela catre cea de useri ca sa logam id-ul userului&amp;nbsp;care a creat fiecare&amp;nbsp;inregistrare si a celui care a modificat-o ultima data.&lt;/P&gt;
&lt;P&gt;Problema este ca , in cazul in care un user nu este activ - a fost creat din greseala sau mai stiu eu ce situatie mai apare, am nevoie sa il sterg. Insa, datorita faptului ca deja am peste 300 referinte la tabela de useri, si nr lor va mai creste, sql nu reuseste sa isi construiasca query planul. SI da eroarea&amp;nbsp;: &lt;STRONG&gt;&lt;EM&gt;The query processor ran out of stack space during query optimization. Please simplify the query&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Deocamdata am gasit 2 solutii:&lt;/P&gt;
&lt;P&gt;- sa renuntam la fk si eventual sa facem verificarile pe triggeri la delete, ca userul nu a fost folosit in nici una din cel x...sute de tabele&lt;/P&gt;
&lt;P&gt;- sa utilizam o tabela de useri de care sa se lege x tabele care sa contina id user, si care sa fie referite fiecare de o parte din tabelele existente; Ex: tabela u1 - sa fie referita de primele 100 tabele din DB; tabela u2 - referita de urmatoarele 100. Asta ar insemna ca sa stim ce tabela u ii corespunde fiecarei tabele de date din DB. Dar e o solutie greoaie si greu de monitorizat in cazul in care apar modificari.&lt;/P&gt;
&lt;P&gt;Are cineva alte solutii? Idei?&lt;/P&gt;
&lt;P&gt;Mercic mult&lt;/P&gt;
&lt;P&gt;Ela&lt;/P&gt;</description></item></channel></rss>