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.CodLocalitateeste executat după ştergere unei localităţi (de exemplu) lucru care va conduce în cazul execuţiei unei comenzi
DELETE FROM Localitate WHERE CodLocalitate = 1la 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).