none
INSTEAD OF DELETE na MSSQL 2008

    Dotaz

  • Zdravim,
    na MSSQL2000 funkcni trigger je na MSSQL2008 nefunkcni a bohuzel netusim co s tim, jelikoz podobne triggery jsou jeste na dalsich tabulkach a tam normalne funguji.
    Pri pokusu smazat zaznam z tabulky ciselnik se objevi chyba :
    Msg 8621, Level 17, State 1, Procedure TR_CISELNIK_BEFORE_DEL, Line 34
    The query processor ran out of stack space during query optimization. Please simplify the query.

    Bohuzel se nezda, ze by dotaz byl prilis slozity, problem bude asi nekde jinde nez ve slozitosti, bohuzel mne vubec nenapada jakym smerem se vydat :-(
    Pokud mate nekdo nejakej napad, tak me prosim poposunte ;-)

    Diky moc A.

    Tady je kod toho triggeru :
    CREATE TRIGGER TR_CISELNIK_BEFORE_DEL ON CISELNIK INSTEAD OF DELETE AS
    BEGIN
        --Mazání rozšiřujících záznamů
        DECLARE @ID T_ID,@DRU_ID T_ID,@TABULKA T_KOD,@EXESTR varchar(100)

        DECLARE C CURSOR LOCAL FOR SELECT D.ID,D.DRU_ID,DRUH.KOD
        FROM DELETED D LEFT OUTER JOIN CISELNIK DRUH ON D.DRU_ID=DRUH.ID

        OPEN C
        FETCH C INTO @ID,@DRU_ID,@TABULKA
        WHILE @@FETCH_STATUS<>-1
        BEGIN
            IF @DRU_ID IS NULL
            BEGIN
                --Jedná se o druh
                DELETE FROM DRUH WHERE ID=@ID
            END
            ELSE
            BEGIN
                --Normální číselník, explicitně vyjmenujeme tabulky
                IF @TABULKA IN ('PARTNER','ADRESA','UCET','SAZBA_DPH','KATAKTIV','MENA','SLOUPEC','STAT','TYPDOKL','UZIVATEL','XLS_SABLONA','SLOUPEC')
                BEGIN
                    SET @EXESTR='DELETE FROM ' + @TABULKA + ' WHERE ID=' + convert(varchar(12),@ID)
                    EXECUTE (@EXESTR)
                END
            END
            FETCH C INTO @ID,@DRU_ID,@TABULKA
        END
        CLOSE C
        --Ještě číselníky
        DELETE FROM C FROM CISELNIK C JOIN DELETED D ON C.ID=D.ID
    END
    8. dubna 2009 12:57

Odpovědi

Všechny reakce