Welcome to Sign in | Help

Re: ?

  •  05-15-2008, 11:59 AM

    Re: ?

    tebbaerty:

    si aici de ce ai pus
    DELETE FROM Localitate
      FROM Localitate INNER JOIN DELETED
    adica de ce apare acel FROM localitate de 2 ori ... din cate stiu un join se facea astel

    select informatie1 , informatie2
    from Tabela1 ta inner join Tabela2 tab on  ta.informatie1=tab.informatie1

    ...

    Sintaxa T-SQL pentru comenda DELETE este:

    DELETE
        [ FROM ]
            { table_name WITH ( < table_hint_limited > [ ...n ] )
             | view_name
            
    | rowset_function_limited
            }


            [ FROM { < table_source > } [ ,...n ] ] ...

    În concluzie,
    DELETE
    FROM Localitate
    FROM Localitate INNER JOIN DELETED
    este echivalent cu a scrie
    DELETE Localitate
    FROM Localitate INNER JOIN DELETED
    .

    tebbaerty:

    ...
    si aici ca si mai sus sa inteleg ca tu ai suprascris DELETE cu INSTEAD OF  sa stearga si din tabela telefon atunci cand este apelat sa stearga din tabela localitate nu ?
    ...

    Dacă ştergi o localitate (o valaore din cheia primară CodLocalitate aparţinând de tabela Localitate) care are telefoane (cheia extenă CodLocalitate din tabela Telefon) atunci acţionează RESTRICŢIA DE INTEGRITATE REFERENŢIALĂ (RIR; definită folosind CREATE TABLE Telefon ... CodLocalitate INT REFERENCES Localitate(CodLocalitate) ...) care face ca SQL Server să afişeze o eroare. De ce ? RIR impune faptul ca pentru fiecare valoare din cheia externă Telefon.CodLocalitate să existe o valoare în cheia primară Localitate.CodLocalitate. Asta înseamnă, că nu poţi avea în tabela Telefon, telefoane având CodLocalitate (cheie externă) = 2 dacă cheia primară Localitate.CodLocalitate nu conţine şi ea valoarea 2.

    În concluzie, ordinea de ştergere a datelor este următoarea:
    [1] ştergi valorile din cheia externă (adică Telefoanele având Telefon.CodLocalitate = 2) şi apoi
    [2] ştergi valorile din cheia primară (Localitate.CodLocalitate = 2).

    Declanşatoarele "clasice" (non INSTEAD OF: FOR / AFTER) din SQL Server sunt generate/executate după "execuţia" comenzii de ştergere/inserare/modificare (DELETE/INSERT/UPDATE). Mai precis, un declanşator de tipul
    CREATE TRIGGER alabalaportocala
        ON Localitate
        FOR DELETE
    AS
        DELETE Telefon
        FROM Telefon INNER JOIN DELETED ON Telefon.CodLocalitate = DELETED.CodLocalitate


    este executat după ştergere unei localităţi (de exemplu) lucru care va conduce în cazul execuţiei unei comenzi
    DELETE FROM Localitate WHERE CodLocalitate = 1
    la o situaţie de genul:
    - tabela Telefoane sunt 3 telefoane având valoare Telefon.CodLocalitate = 1 (cheie externă) ,
    dar
    - tabela Localitate.CodLocalitate (cheie primară) nu conţine valoarea 1
    => EROARE

    Deci, soluţia este folosirea unui declanşator INSTEAD OF (asta dacă se doreşte utilizarea declanşatoarelor).
View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems