Ja sam imao sledecu situaciju (primer):
Imamo dve tabele: RADNIK i NALOG.
U tabeli NALOG kljuc iz tabele radnik se referencira dva puta jer nam je potrebno ko je kreirao nalog i ko je realizovao nalog.
Ovde nije moguce koristiti cascade za delete za oba strana kljuca jer ce javljati gore ponenutu gresku.
Code:
use master
go
drop database PROBA
go
create database PROBA
go
use PROBA
go
create table RADNIK(
ID int not null,
NAZIV varchar(30) not null,
constraint PK_RADNIK primary key (ID)
)
go
create table NALOG(
ID int not null,
NAZIV varchar(30) not null,
RADNIK_KREIRAO int not null,
RADNIK_REALIZOVAO int not null,
constraint PK_NALOG primary key (ID)
)
go
alter table NALOG
add constraint FK_RADNIK_KREIRAO foreign key (RADNIK_KREIRAO)
references RADNIK (ID) on delete cascade
go
alter table NALOG
add constraint FK_RADNIK_REALIZOVAO foreign key (RADNIK_REALIZOVAO)
references RADNIK (ID) -- ne moze da se stavi on delete cascade jer izbacuje gresku
go
insert into RADNIK(ID,NAZIV) values(1,'r1')
insert into RADNIK(ID,NAZIV) values(2,'r2')
insert into RADNIK(ID,NAZIV) values(3,'r3')
insert into NALOG(ID,NAZIV,RADNIK_KREIRAO,RADNIK_REALIZOVAO) values(1,'proba',1,3)
insert into NALOG(ID,NAZIV,RADNIK_KREIRAO,RADNIK_REALIZOVAO) values(2,'proba',2,3)
go
select * from NALOG
select * from RADNIK
go
delete from RADNIK where ID = 1
go
select * from NALOG
select * from RADNIK
go
Brisanjem radnika ID=1 obrisace se i nalozi koje je on kreirao ali zato brisanjem radnika ID=3 dovodi do greske jer je on uvek realizovao naloge i nad tim stranim kljucem nemamo delete cascade.
Mislim da nije ni moguce ovo resiti koristici cascade.
Ja samo odustao od koriscenja kaskadnog brisanja (nisam hteo ni trigere) vec sam pravio stored procedure za brisanje vezanih podataka.