Welcome to Sign in | Help

Re: Solutia optima pentru aplicatie distribuita.

  •  10-05-2008, 10:26 AM

    Re: Solutia optima pentru aplicatie distribuita.

    Dezactivarea trigger-ului din cealalta baza de date poate cauza probleme daca se adauga simultan doua inregistrari (diferite) in doua server-e. E posibil ca inregistrarea adaugata in al doilea server sa nu mai declanseze trigger-ul (fiind dezactivat) si astfel sa nu se mai copieze pe celelalte server-e. In mod normal, in loc de dezactivarea trigger-ului, as scrie ceva cod in trigger (folosind TRIGGER_NESTLEVEL, CONTEXT_INFO() sau @@SPID) sa faca RETURN daca e apelat dintr-un alt trigger de acest gen. Din pacate, daca e vorba de alt server, cred ca aceste solutii nu prea sunt aplicabile si as face RETURN-ul in functie de HOST_NAME() si/sau SUSER_SNAME() (eventual, facand un login dedicat doar pentru linked server-urile folosite pentru "replicare").

    O alta problema ar fi ca datele din coloanele identity ar trebui copiate (folosind SET IDENTITY_INSERT ON), nu trebuie generat un nou ID, deoarece ar fi probabil diferit, iar la stergere te bazezi pe faptul ca are aceeasi valoare. Pe de alta parte, poti sa afli daca tabela are o coloana identity (folosind functia OBJECTPROPERTY cu parametrul 'TableHasIdentity') si poti sa afli care este coloana identity (folosind functia COLUMNPROPERTY cu parametrul 'IsIdentity').

    In afara de limitarile pe care le-ai mentionat, ar mai fi si faptul ca valoarea din coloana primary key nu trebuie sa se modifice niciodata. E adevarat ca in 99% din cazuri, oricum nu se poate modifica, pentru ca e identity (si chiar si daca n-ar fi, probabil exista foreign key-uri care nu au cascade update). Dar asa, ca idee, ar fi interesant sa analizezi ce ar face trigger-ul daca ID-ul nu este identity si ai 3 inregistrari in tabela BANCI (cu ID-urile 1, 2 si 3) si faci un "UPDATE BANCI SET ID=ID+1, DENUMIRE=DENUMIRE+DENUMIRE".

    O ultima observatie ar fi la linia "WHILE @ColumnID", care probabil ar trebui sa fie "WHILE @ColumnID<=@LastColumnID". Este interesant de stiut ca valorile din colid pot sa nu fie consecutive (daca a fost stearsa o coloana din tabela), dar cred ca e OK codul din acest punct de vedere.

    Razvan
View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems