Welcome to Sign in | Help
in Search

Alterarea datelor din tabelele "Inserted" si "Deleted"

Last post 10-07-2008, 8:54 AM by ignatandrei. 7 replies.
Sort Posts: Previous Next
  •  10-05-2008, 10:06 PM 5726

    Alterarea datelor din tabelele "Inserted" si "Deleted"

    Salut ,

     Am creat un after trigger care inregistreaza anumite activitati asupra unui tabel.

    Prin acestea monitorizez si operatia curenta realizata asupra acestuia (DELETE , UPDATE ,INSERT) .

    Triggerul creat se lanseaza mereu dupa un insert , delete sau update. Folosind tabelele "Inserted si Deleted" am reusit sa observ care este operatia curenta realizata.

    Intrebarea mea este , daca intr-un mediu de retea , web userii acceseaza concomitent acest tabel si realizeaza diferite operatii tabele acestea "Inserted si Deleted" imi mai pot oferii operatia corecta corespunzatoare unui user ? Exista posibilitatea ca 2 useri sa modifice concomitent aceste tabele ?

     Operatia curenta am obtinut-o pe baza unor interogari de genul : if exists(select * from DELETED) , asadar daca un alt user in acel moment sterge o inregistrare si primul user a realizat un insert imi poate altera raspunsul pentru operatia realizata de primul user ?

     Tranzaciile pot rezolva aceasta problema  ? (daca exista )

    Multumesc !

  •  10-05-2008, 10:54 PM 5727 in reply to 5726

    Re: Alterarea datelor din tabelele "Inserted" si "Deleted"

    Pseudotabelele DELETED si INSERTED contin numai modificarile operatiunii care a declansat trigger-ul. Doi useri pot modifica simultan aceasi tabele, dar fiecare va declansa un trigger care ca vedea in pseudotabele doar ce a inserat/deletat dinsul. Niciodata un trigger nu poate vedea in aceste pseudotabele inregistrari sterse sau inserate de o alta operatiune.
    Cid despre tranzactii, orice operatiune in baza de date se face in cadrul unei tranzactii. Daca nu folosesti explicit tranzactii, o tranzactie implicita este creata pe durata operatiunii (INSERT, DELETE, UPDATE).

    http://rusanu.com
  •  10-05-2008, 10:58 PM 5729 in reply to 5726

    Re: Alterarea datelor din tabelele "Inserted" si "Deleted"

    Intrebarea mea este , daca intr-un mediu de retea , web userii acceseaza concomitent acest tabel si realizeaza diferite operatii tabele acestea "Inserted si Deleted" imi mai pot oferii operatia corecta corespunzatoare unui user unei comenzi [SQL INSERT/UPDATE/DELETE] ? > DA ! Pseudotabelele INSERTED si DELETED memoreaza doar înregistrările (liniile) cu valorile noi (INSERTED -> adaugare şi modificare) şi vechi (DELETED -> modificare şi ştergere) afectate de comanda SQL I/U/D curentă.

    http://msdn.microsoft.com/en-us/library/ms191300.aspx

    The deleted table stores copies of the affected rows during DELETE and UPDATE statements. During the execution of a DELETE or UPDATE statement, rows are deleted from the trigger table and transferred to the deleted table. The deleted table and the trigger table ordinarily have no rows in common.

    The inserted table stores copies of the affected rows during INSERT and UPDATE statements. During an insert or update transaction, new rows are added to both the inserted table and the trigger table. The rows in the inserted table are copies of the new rows in the trigger table.


  •  10-05-2008, 10:59 PM 5730 in reply to 5726

    Re: Alterarea datelor din tabelele "Inserted" si "Deleted"

    Tu te referi la tabele logice, conceptuale (vorba BOL Smile)insert deleted care le vezi in trigger?
    Alea nu le vezi decit in corpul trigger si contin numai datele referitoare la operatia efectuata care a activat triggeru.
    Eu zic ca nu ai problema de concurenta pe aici, parerea mea Smile
  •  10-05-2008, 11:08 PM 5731 in reply to 5726

    Re: Alterarea datelor din tabelele "Inserted" si "Deleted"

    mircea:

    Intrebarea mea este , daca intr-un mediu de retea , web userii acceseaza concomitent acest tabel si realizeaza diferite operatii tabele acestea "Inserted si Deleted" imi mai pot oferii operatia corecta corespunzatoare unui user ? Exista posibilitatea ca 2 useri sa modifice concomitent aceste tabele ?


    Exista totdeauna posibilitatea ca doi user-i sa modifice aceste tabele. Cit priveste "concomitent", parerea mea e ca nu "concomitent".
    Cit priveste problema ta cu "inserted" si "deleted",acestea sunt pentru operatia curenta - nu se amesteca una cu cealalta.

    Acum , daca scenariul tau este urmatorul
    USer 1 si 2 acceseaza inregistrarea x
    User 1 sterge x
    User 2 modifica din x in y

    se poate intimpla ca user 2 sa incerce sa modifice ce nu exista . Desi pentru user 1 inserted si deleted sunt OK, pentru User2, care nu mai are inregistrarea in tabela, bineinteles ca nu se va lansa nici un fel de trigger(nefiind nici o inregistrare de modificat ..)

    Daca ai si alte cazuri in minte, te rog sa le scrii


    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  10-06-2008, 9:25 PM 5758 in reply to 5731

    Re: Alterarea datelor din tabelele "Inserted" si "Deleted"

    Va multumesc tutoror pentru comenturile postate , acum lucrurile imi sunt mult mai clare !

      Andrei thx mult pentru scenariul oferit , deocamdata o las mai multe cu triggerele datoria unor shimbari in proiect , oricum aceste comenturi sunt foarte utile si le voi folosi cand voi trece sa implemetz trigerele.

     Thx again

  •  10-07-2008, 6:49 AM 5760 in reply to 5731

    Re: Alterarea datelor din tabelele "Inserted" si "Deleted"

    ignatandrei:
    [...] pentru User2, care nu mai are inregistrarea in tabela, bineinteles ca nu se va lansa nici un fel de trigger(nefiind nici o inregistrare de modificat ..)


    O mică precizare: trigger-ul va fi lansat, dar inserted şi deleted nu vor conţine nicio înregistrare, iar @@ROWCOUNT va fi 0 (la începutul trigger-ului).

    Răzvan
  •  10-07-2008, 8:54 AM 5762 in reply to 5760

    Re: Alterarea datelor din tabelele "Inserted" si "Deleted"

    rsocol:
    ignatandrei:
    [...] pentru User2, care nu mai are inregistrarea in tabela, bineinteles ca nu se va lansa nici un fel de trigger(nefiind nici o inregistrare de modificat ..)


    O mică precizare: trigger-ul va fi lansat, dar inserted şi deleted nu vor conţine nicio înregistrare, iar @@ROWCOUNT va fi 0 (la începutul trigger-ului).

    Răzvan
    scuze, ai dreptate...


    Ignat Andrei
    http://serviciipeweb.ro/iafblog
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems