[ jablan @ 29.09.2005. 15:37 ] @
Imam tabelu Table1 (id integer, data varchar) i Table2 (id integer, fk1 integer, fk2 integer)

fk1 i fk2 su spoljni ključevi iz tabele Table1.

Hoću da postavim kaskadno brisanje na ta dva constrainta tako da mi se, kad izbrišem slog iz Table1, brišu i slogovi iz Table2 gde se njegov ključ pojavljuje bilo u polju fk1, bilo u fk2.

SQL javlja sledeću grešku kad hoću da postavim ta pravila:
Introducing FOREIGN KEY constraint 'blabla' on table 'Table2' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

Dakle, ukapirao sam da ne mogu da dobijem to što hoću. Moje je pitanje - zašto?

http://support.microsoft.com/kb/q321843/
[ majstor_01 @ 29.09.2005. 17:57 ] @
Pa to je jer imas kruzno referenciranje:
Tabela 2 ima kljuc ka Tabeli1, a Tabela2 ima kljuc ka Tabeli3. Tabela1 ima takodje kljuc ka Tabeli3.

Tako da ako brises, doci ce do kaskadnog brisanja u krug. To nije dopusteno.Takodje je moguce to isto i sa dve, ali i sa vise tabela.

Pozdrav

[Ovu poruku je menjao majstor_01 dana 29.09.2005. u 19:01 GMT+1]
[ jablan @ 29.09.2005. 19:52 ] @
Bojim se da nisi najpažljivije pročitao moju poruku. Imam dve tabele, i nemam kružno referenciranje, već reference iz dva polja jedne tabele na glavni ključ druge.
[ _owl_ @ 29.09.2005. 23:28 ] @
Citat:

Introducing FOREIGN KEY constraint 'blabla' on table 'Table2' may cause cycles or multiple cascade paths

Mozda bi ovu situaciju mogao da resis preko triger-a (ili da brisanje radis iz stored procedure koja bi obezbedjivala referencijalni integritet).
[ jablan @ 30.09.2005. 07:55 ] @
Citat:
_owl_: Mozda bi ovu situaciju mogao da resis preko triger-a

Naravno, to je i Microsoft-ova preporuka. Mene je samo zanimao razlog zašto su uveli to pravilo... Nije teško, pri kreiranju reference sa kaskadnim brisanjem, proveriti može li ona ili ne izazvati kružno brisanje. Za moj slučaj, očigledno je da ne može.
[ majstor01 @ 30.09.2005. 09:34 ] @
Verovatno si nesto prevideo.
Ajde posalji te tabele da vidimo? Najbolje kao script za generisanje.
100% imas kruzno referenciranje... Samo da vidimo gde. Retko gresi komplajler tj. MS SQL, obicno je to do programera.
Mozda samo nisi primetio. Kao sto rekoh kruzno ref. moze da bude i sa dve tabele.
Posalji pa da vidimo.

Pozdrav
[ jablan @ 30.09.2005. 09:57 ] @
Ti si baš težak neki čovek... ;)
Code:

CREATE TABLE [dbo].[Table1] (
    [id] [int] NOT NULL ,
    [data] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Table2] (
    [id] [int] NOT NULL ,
    [fk1] [int] NOT NULL ,
    [fk2] [int] NOT NULL 
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Table1] WITH NOCHECK ADD 
    CONSTRAINT [PK_Table1] PRIMARY KEY  CLUSTERED 
    (
        [id]
    )  ON [PRIMARY] 
GO

ALTER TABLE [dbo].[Table2] WITH NOCHECK ADD 
    CONSTRAINT [PK_Table2] PRIMARY KEY  CLUSTERED 
    (
        [id]
    )  ON [PRIMARY] 
GO

ALTER TABLE dbo.Table2 ADD CONSTRAINT
    FK_Table2_Table1_1 FOREIGN KEY
    (
    fk1
    ) REFERENCES dbo.Table1
    (
    id
    ) ON DELETE CASCADE

GO
    
ALTER TABLE dbo.Table2 ADD CONSTRAINT
    FK_Table2_Table1_2 FOREIGN KEY
    (
    fk2
    ) REFERENCES dbo.Table1
    (
    id
    ) ON DELETE CASCADE
    
GO