Welcome to Sign in | Help
in Search

Novice sql

Last post 05-19-2008, 5:34 PM by tebbaerty. 26 replies.
Page 2 of 2 (27 items)   < Previous 1 2
Sort Posts: Previous Next
  •  05-15-2008, 11:59 AM 4939 in reply to 4927

    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).
  •  05-15-2008, 12:02 PM 4940 in reply to 4927

    Re: ?

    tebbaerty:

    ...


    iar tabela DELETED este o copie a tabelei localitate dupa cum vad eu lucrurile nu ?
    am cautat de DELETED si INSERTED si am vazut tutoriale in care ziceau ca daca dau select * from deleted arata ceva dar la mine da eroare ca nu exista . Atunci am crezut ca nu se poate asa ceva in ms sql 2005 si ce am gasit nu era bun. dar vad ca si tu l-ai folosit si spre surprinderea mea merge :D
    ...

    Cele două pseudotabele INSERTED şi DELETED sunt disponibile doar în declanşatoare, au structura "identică" cu tabelele pentru care sunt create respectivele declanşatoare şi conţin:
    - înregistrările care au fost şterse pt. declanşatoare DELETE,
    - înregistrările care au fost adăugate pt. declanşatoare INSERT şi
    - noile valori (INSERTED) şi vechile valori (DELETED) pt. declanşatoare UPDATE.
  •  05-15-2008, 1:35 PM 4943 in reply to 4940

    Re: ?

    Asa deci.
    S-au mai acumulat niste cunostiinte, altele s-au fixat.
    In orice caz am mai inteles cate ceva despre triggere desi nu pot sa zic ca stiu tot ce ai zis.
    In mare parte am inteles tot.
    Acum urmeaza sa mai fac niste exercitii si sa vad de ce probleme ma lovesc.
    Nu promit ca voi reusi sa fac un trigger de la 0 pentru niste chestii complicate dar imi voi da silinta.

    Thanks.... :)
  •  05-15-2008, 3:13 PM 4950 in reply to 4933

    Re: ?

    Gherry:
    cu multa placere, mi-a prins bine exercitiul Wink



    :D poi si la mai mare :D.... cu mn o sa tot faci exercitii :D .... cateva luni de zile :P .... sper sa fie 1 luna 2 :D
  •  05-15-2008, 3:40 PM 4953 in reply to 4950

    Re: ?

    Aveti cumva o documentatie despre triggere ceva mai bine explicat ?.... nu am reusit sa gasesc ceva foarte bun si exercitiile nu prea ies.
    CREATE TRIGGER alabalaportocala
        ON Localitate
        FOR DELETE
    AS
        DELETE Telefon
        FROM Telefon INNER JOIN DELETED ON Telefon.CodLocalitate = DELETED.CodLocalitate

    am inteles de ce triggerul acesta nu merge .dar de ce acela cu instead of merge ? eu cred ca diferenta o face acel instead of  am dreptate?

    atunci cand folosesti instead of parcurge toata tabela si sterge toate egalitatile gen
    Telefon.CodLocalitate = DELETED.CodLocalitate iar cand dai cu FOR sterge doar prima egalitate de gen Telefon.CodLocalitate = DELETED.CodLocalitate? dupa care se opreste ?

    (aceasta e a 1 saptamana in care lucrez cu sql asa ca nu va mirati daca par mai slab)
  •  05-15-2008, 4:22 PM 4954 in reply to 4953

    Re: ?

    De inceput poţi incepe cu BOL (Books Online): download

    BOL spune:

    INSTEAD OF

    Specifies that the trigger is executed instead of the triggering SQL statement, thus overriding the actions of the triggering statements

    Exemplul cu INSTEAD OF merge deoarece stergerea se face in ordinea corecta: mai intai telefoanele (DELETE FROM Telefon ...) si apoi localitatea (DELETE FROM Localitate ...).


  •  05-15-2008, 10:16 PM 4957 in reply to 4953

    Re: ?

    tebbaerty:


    (aceasta e a 1 saptamana in care lucrez cu sql asa ca nu va mirati daca par mai slab)

    in cazul asta nu cred ai ales cel mai indicat punct de plecare. Eu as recomanda sa lasi astea pe mai incolo si sa iti concentrezi atentia pe chei, indexi, restrictii, functii, proceduri stocate, vederi, tipurile de join, join-uri pe campuri care nu sunt chei (si ce se intampla daca ai valori nule). Mie toate astea mi-au fost mult mai utile (chiar necesare) decat triggere-le. Triggerele mi se par intr-adevar o chestie foarte faina insa eu cred ca sunt multe altele care ar trebui stapanite inainte sa te apuci de ele (plus ca o sa iti usureze enorm de mult viata cand ajungi la ele).
  •  05-15-2008, 10:26 PM 4959 in reply to 4954

    Re: ?

    cand faci un trigger cu instead of sterge in cazul nostru toate telefoanele legate de localitatea respectiva dar cand il faci cu for sterge doar 1 inregistrare din tabela telefoane.

    atunci o alternativa nu ar fi sa folosim before delete ? sau si acela ca si for delete sterge doar o inregistrare ....

    nedumerirea este nr de inregistrari sterse de triggerurile facute cu for si cu instead of

     

     faza cu overload am inteles o ... mi-am imaginat ca este o supraincarcare la fel ca in c++. :D

  •  05-15-2008, 10:32 PM 4961 in reply to 4957

    Re: ?

    poi am citit si am facut proceduri si functii si joinuri si am folosit union cu join si alte chestii, chei restrictii si toate cele.

    dar tu ai zis cumva ca poti face un fk la un camp care nu e pk ? eu nu am auzit de asa ceva ..... poate ma insel dar fk nu se fac doar la pk in tabela parinte si un pk nu presupune inexistenta unor valori nule... ?

    triggerele sunt un concept aparte si nou pentru mine si am dificultati in a le intelege .

    am vazut ca exista si cursor dar deocamdata am zis sa nu ma ating de ele :D... dar curand le iau la purificat :P... caci si alea mi se par super dragutze :D

    am avut nevoie de un cursor sa fac mai multe stergeri. ceva gen sa sterg 10 rezultate (la alegerea mea) de o data.prima kestie care mia trecut prin cap a fost un while(ceea nu era posibil) dar am citit si am vazut ca trebuie un cursor si am zis sa o las mai moale si sa inteleg trigger deocamdata

  •  05-16-2008, 12:13 AM 4964 in reply to 4959

    Re: ?

    tebbaerty:

    ...

    atunci o alternativa nu ar fi sa folosim before delete ?

    ...


    O întrebare: înainte de a scrie asta, te-ai uitat în sintaxa de la CREATE/ALTER TRIGGER din BOL ?
    De inceput poţi incepe cu BOL (Books Online): download

    Pentru că, răspunsul la întrebarea ta se află în BOL !
  •  05-16-2008, 3:13 PM 4975 in reply to 4961

    Re: ?

    tebbaerty:

    poi am citit si am facut proceduri si functii si joinuri si am folosit union cu join si alte chestii, chei restrictii si toate cele.

    eu nu zic sa le incerci ci sa le stapanesti Wink (table value functions ai incercat deja?)

    tebbaerty:

    dar tu ai zis cumva ca poti face un fk la un camp care nu e pk ? eu nu am auzit de asa ceva ..... poate ma insel dar fk nu se fac doar la pk in tabela parinte si un pk nu presupune inexistenta unor valori nule... ?

    nu am zis ca faci FK ci join: se pot face join-uri si pe campuri care nu sunt chiei si am mentionat asta pt ca am avut de foarte multe ori nevoie de asa ceva la diferite query-uri

    tebbaerty:

    triggerele sunt un concept aparte si nou pentru mine si am dificultati in a le intelege .

    in opinia mea, cel mai simplu ar fi sa faci o analogie cu evenimentele, dar principalul motiv pt care este greu sa le intelegi cred ca il reprezinta faptul ca nu stapanesti celelalte aspecte cum ar fi relatiile si setarile lor (pt ca abele reactioneaza la aceleasi situatii).

    tebbaerty:

    am vazut ca exista si cursor dar deocamdata am zis sa nu ma ating de ele :D... dar curand le iau la purificat :P... caci si alea mi se par super dragutze :D

    am avut nevoie de un cursor sa fac mai multe stergeri. ceva gen sa sterg 10 rezultate (la alegerea mea) de o data.prima kestie care mia trecut prin cap a fost un while(ceea nu era posibil) dar am citit si am vazut ca trebuie un cursor si am zis sa o las mai moale si sa inteleg trigger deocamdata

    da, exista, dar sa sti ca merge si while in proceduri stocate, ai reusit sa afli care sunt diferentele intre proceduri si functii si ce se poate face in procedura dar nu se poate in functii si invers?

    rezumat:
    1. triggerele sunt ca si evenimantele (si daca ai facut vre-o data overide la un eveniment ai vazut ca poti pune codul inainte sau dupa OnBase(nume_eveniment) si are efect diferit
    2. cursoarele sunt buncle dar in foarte multe cazuri exista alternative
    3. Sql Server iti pune la dispozitie suficiente unelete pt cam tot ce vrei sa faci si in unele cazuri o problema se poate rezolva pe mai multe cai dar este foarte importanta sa gasesti varianta optima pt ca fiecare scadere de performanta este amplificata de numarul de inregistrari afectate. de asta zic ca nu este suficient sa treci prin ele si sa sti "despre" ele ci tb sa iei pe fiecare la rans si o descosi.
    4. ai NEAPARATA nevoie de o carte pe langa BOL. Daca vrei, poti pleca de la una electronica de genul "Tech yoursels SQL in ...." dar eu zic ca e bine sa ai si una clasica asa ca mergi intr-o librarie si ia-le la rand si alege una care sa fie scrisa intr-un stil pe placul tau. si te sfatuiesc sa citesti si ceva despre proiectare de baze de date.
  •  05-19-2008, 5:34 PM 4984 in reply to 4975

    Re: ?

    am citit sql bible. multumesc pe sfaturi.inca invat :D  #top_move_select400965674 { VISIBILITY: hidden } #bottom_move_select400965674 { VISIBILITY: hidden } var jsWSSID = "oQHIXWRIxEm"; YAHOO.Shortcuts = {};

Page 2 of 2 (27 items)   < Previous 1 2
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems