Mistero SQL SERVER 2000

mercoledì 14 ottobre 2009 - 16.09

ReRosso Profilo | Junior Member

Ciao ragazzi....

Ho riscontrato un problema con SQL SERVER 2000 che in altri DB non ho mai visto (Access compreso):

Se creo una tabella con più di una foreign key non riesco a relazionarla con la tabella master applicando la clausola "aggiorna record a catena"...Infatti mi restituisce un errore del tipo:

"Impossibile creare la relazione...il vincolo foreign key potrebbe generare un ciclo o percorsi a catena multipli".

In realtà avrei trovato un escamotage modificando l'architettura del DB creando nelle tabelle master dei campi contatori identity e impostandoli come chiave primaria...ho paura però che le prestazioni
globali possano diminuire in quanto lavorerei con indici che difatti non uso.
Pensate che questa soluzione possa andare? e se si l'eventuale degrado prestazionale sarebbe significativo?

Grazie a tutti

lbenaglia Profilo | Guru

>Se creo una tabella con più di una foreign key non riesco a relazionarla
>con la tabella master applicando la clausola "aggiorna record
>a catena"...Infatti mi restituisce un errore del tipo:
>
>"Impossibile creare la relazione...il vincolo foreign key potrebbe
>generare un ciclo o percorsi a catena multipli".

Ciao Riccardo,

Puoi postare i comandi di CREATE TABLE comprensivi di constraints?

>Grazie a tutti
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

ReRosso Profilo | Junior Member

Ecco il tutto...

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ais_sed]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ais_sed]
GO

CREATE TABLE [dbo].[ais_sed] (
[sed_id] [int] NOT NULL ,
[sed_paz_id] [int] NULL ,
[sed_dat] [smalldatetime] NOT NULL ,
[sed_ora] [smalldatetime] NULL ,
[sed_mot_id] [nvarchar] (50) COLLATE Latin1_General_CI_AS NULL ,
[sed_dia_id] [nvarchar] (20) COLLATE Latin1_General_CI_AS NULL ,
[sed_ter_id] [nvarchar] (20) COLLATE Latin1_General_CI_AS NULL ,
[sed_rep_id] [nvarchar] (50) COLLATE Latin1_General_CI_AS NULL ,
[sed_tex] [nvarchar] (2000) COLLATE Latin1_General_CI_AS NULL ,
[sed_ute_id] [nvarchar] (20) COLLATE Latin1_General_CI_AS NULL ,
[sed_dcr] [smalldatetime] NULL ,
[sed_ucr] [nvarchar] (20) COLLATE Latin1_General_CI_AS NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ais_sed] WITH NOCHECK ADD
CONSTRAINT [PK_ais_sed] PRIMARY KEY CLUSTERED
(
[sed_id]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ais_sed] ADD
CONSTRAINT [IX_ais_sed] UNIQUE NONCLUSTERED
(
[sed_paz_id],
[sed_dat],
[sed_rep_id]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ais_sed] ADD
CONSTRAINT [diagnosi_seduta] FOREIGN KEY
(
[sed_dia_id]
) REFERENCES [dbo].[ais_dia] (
[dia_dia]
) ON UPDATE CASCADE ,
CONSTRAINT [pazienti_seduta] FOREIGN KEY
(
[sed_paz_id]
) REFERENCES [dbo].[ais_paz] (
[paz_id]
),
CONSTRAINT [utente_seduta2] FOREIGN KEY
(
[sed_ucr]
) REFERENCES [dbo].[ais_ute] (
[ute_ute]
) ON UPDATE CASCADE
GO

lbenaglia Profilo | Guru

>Ecco il tutto...
Non proprio, manca la definizione delle tabelle [dbo].[ais_dia], [dbo].[ais_paz] e [dbo].[ais_ute]

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

ReRosso Profilo | Junior Member

Ciao Lorenzo...

ti mando gli script di definizione delle tabelle relazionate con dbo.ais_sed:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[diagnosi_seduta]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ais_sed] DROP CONSTRAINT diagnosi_seduta
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[reparto_diagnosi]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ais_dia] DROP CONSTRAINT reparto_diagnosi
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[dettaglio_reparto]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ais_dute] DROP CONSTRAINT dettaglio_reparto
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[reparto_terapia]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ais_ter] DROP CONSTRAINT reparto_terapia
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pazienti_seduta]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ais_sed] DROP CONSTRAINT pazienti_seduta
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[utente_dettaglio]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ais_dute] DROP CONSTRAINT utente_dettaglio
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[utente_seduta2]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ais_sed] DROP CONSTRAINT utente_seduta2
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ais_dia]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ais_dia]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ais_mot]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ais_mot]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ais_rep]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ais_rep]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ais_paz]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ais_paz]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ais_ute]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ais_ute]
GO

CREATE TABLE [dbo].[ais_dia] (
[dia_dia] [nvarchar] (20) COLLATE Latin1_General_CI_AS NOT NULL ,
[dia_des] [nvarchar] (2000) COLLATE Latin1_General_CI_AS NULL ,
[dia_rep_id] [nvarchar] (50) COLLATE Latin1_General_CI_AS NULL ,
[dia_eli] [bit] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ais_mot] (
[mot_mot] [nvarchar] (50) COLLATE Latin1_General_CI_AS NOT NULL ,
[mot_eli] [bit] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ais_rep] (
[rep_rep] [nvarchar] (50) COLLATE Latin1_General_CI_AS NOT NULL ,
[rep_res] [nvarchar] (70) COLLATE Latin1_General_CI_AS NULL ,
[rep_eli] [bit] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ais_paz] (
[paz_id] [int] NOT NULL ,
[paz_nom] [nvarchar] (41) COLLATE Latin1_General_CI_AS NULL ,
[paz_cog] [nvarchar] (62) COLLATE Latin1_General_CI_AS NULL ,
[paz_cf] [nvarchar] (16) COLLATE Latin1_General_CI_AS NULL ,
[paz_dna] [nvarchar] (10) COLLATE Latin1_General_CI_AS NULL ,
[paz_sex] [bit] NULL ,
[paz_pre] [nvarchar] (2) COLLATE Latin1_General_CI_AS NULL ,
[paz_cre] [nvarchar] (30) COLLATE Latin1_General_CI_AS NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ais_ute] (
[ute_ute] [nvarchar] (20) COLLATE Latin1_General_CI_AS NOT NULL ,
[ute_nom] [nvarchar] (41) COLLATE Latin1_General_CI_AS NULL ,
[ute_cog] [nvarchar] (62) COLLATE Latin1_General_CI_AS NULL ,
[ute_pw] [nvarchar] (20) COLLATE Latin1_General_CI_AS NULL ,
[ute_pro] [nvarchar] (20) COLLATE Latin1_General_CI_AS NULL ,
[ute_gru] [nvarchar] (20) COLLATE Latin1_General_CI_AS NULL ,
[ute_log] [smalldatetime] NULL ,
[ute_spw] [smalldatetime] NULL ,
[ute_eli] [bit] NULL
) ON [PRIMARY]
GO

lbenaglia Profilo | Guru

> Ciao Lorenzo...
>
>ti mando gli script di definizione delle tabelle relazionate
>con dbo.ais_sed:

USE tempdb; CREATE TABLE dbo.ais_dia ( dia_dia nvarchar (20) NOT NULL PRIMARY KEY, dia_des nvarchar (2000) NULL , dia_rep_id nvarchar (50) NULL , dia_eli bit NULL ); GO CREATE TABLE dbo.ais_paz ( paz_id int NOT NULL PRIMARY KEY, paz_nom nvarchar (41) NULL , paz_cog nvarchar (62) NULL , paz_cf nvarchar (16) NULL , paz_dna nvarchar (10) NULL , paz_sex bit NULL , paz_pre nvarchar (2) NULL , paz_cre nvarchar (30) NULL ); GO CREATE TABLE dbo.ais_ute ( ute_ute nvarchar (20) NOT NULL PRIMARY KEY, ute_nom nvarchar (41) NULL , ute_cog nvarchar (62) NULL , ute_pw nvarchar (20) NULL , ute_pro nvarchar (20) NULL , ute_gru nvarchar (20) NULL , ute_log smalldatetime NULL , ute_spw smalldatetime NULL , ute_eli bit NULL ); GO CREATE TABLE dbo.ais_sed ( sed_id int NOT NULL , sed_paz_id int NULL , sed_dat smalldatetime NOT NULL , sed_ora smalldatetime NULL , sed_mot_id nvarchar (50) NULL , sed_dia_id nvarchar (20) NULL , sed_ter_id nvarchar (20) NULL , sed_rep_id nvarchar (50) NULL , sed_tex nvarchar (2000) NULL , sed_ute_id nvarchar (20) NULL , sed_dcr smalldatetime NULL , sed_ucr nvarchar (20) NULL ); GO ALTER TABLE dbo.ais_sed WITH NOCHECK ADD CONSTRAINT PK_ais_sed PRIMARY KEY CLUSTERED ( sed_id ); GO ALTER TABLE dbo.ais_sed ADD CONSTRAINT IX_ais_sed UNIQUE NONCLUSTERED ( sed_paz_id, sed_dat, sed_rep_id ); GO ALTER TABLE dbo.ais_sed ADD CONSTRAINT diagnosi_seduta FOREIGN KEY ( sed_dia_id ) REFERENCES dbo.ais_dia ( dia_dia ) ON UPDATE CASCADE , CONSTRAINT pazienti_seduta FOREIGN KEY ( sed_paz_id ) REFERENCES dbo.ais_paz ( paz_id ), CONSTRAINT utente_seduta2 FOREIGN KEY ( sed_ucr ) REFERENCES dbo.ais_ute ( ute_ute ) ON UPDATE CASCADE GO /* Output: Command(s) completed successfully. */ DROP TABLE dbo.ais_sed, dbo.ais_ute, dbo.ais_paz, dbo.ais_dia;

Come vedi io non riscontro alcun errore.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

ReRosso Profilo | Junior Member

Ciao Lorenzo...

Lo script che mi hai postato funziona anche a me. Se noti però il mio ultimo post ti avevo inviato anche i comandi usati per creare le altre tabelle relazionate con dbo.sedute; Il comando con cui creo tutte le relazioni è il seguente:

ALTER TABLE [dbo].[ais_sed] ADD
CONSTRAINT [diagnosi_seduta] FOREIGN KEY
(
[sed_dia_id]
) REFERENCES [dbo].[ais_dia] (
[dia_dia]
) ON UPDATE CASCADE ,

CONSTRAINT [pazienti_seduta] FOREIGN KEY
(
[sed_paz_id]
) REFERENCES [dbo].[ais_paz] (
[paz_id]
) ON UPDATE CASCADE ,

CONSTRAINT [utente_seduta2] FOREIGN KEY
(
[sed_ucr]
) REFERENCES [dbo].[ais_ute] (
[ute_ute]
) ON UPDATE CASCADE ,

CONSTRAINT [utente_seduta1] FOREIGN KEY
(
[sed_ute_id]
) REFERENCES [dbo].[ais_ute] (
[ute_ute]
) ON UPDATE CASCADE ,

CONSTRAINT [reparto_seduta] FOREIGN KEY
(
[sed_rep_id]
) REFERENCES [dbo].[ais_rep] (
[rep_rep]
) ON UPDATE CASCADE ,

CONSTRAINT [terapia_seduta] FOREIGN KEY
(
[sed_ter_id]
) REFERENCES [dbo].[ais_ter] (
[ter_ter]
) ON UPDATE CASCADE ,

CONSTRAINT [motivo_seduta] FOREIGN KEY
(
[sed_mot_id]
) REFERENCES [dbo].[ais_mot] (
[mot_mot]
) ON UPDATE CASCADE
GO

E purtroppo l'errore che mi restituisce sql server è sempre il medesimo; errore n. 1785. Ho visto su Microsoft Tech e sembra che l'errore venga generato perchè Sql server non supporta questo tipo di
integrità referenziale (cioè eseguita con l'opzione ON UPDATE CASCADE); pertanto consigliano di implementarla attraverso l'uso dei trigger.

Comunque avendo risolto con una modifica strutturale al DB mi chiedevo se potevi dare un'occhiata allo schema che ti invio in allegato e darmi un parere (scusa se abuso della tua pazienza!!!).

Grazie mille

lbenaglia Profilo | Guru

>Lo script che mi hai postato funziona anche a me. Se noti però
>il mio ultimo post ti avevo inviato anche i comandi usati per
>creare le altre tabelle relazionate con dbo.sedute;
Io non li vedo
Ascolta, comincio a non capirci più niente.
Puoi riassumere lo script in un unico post indicando la riga che genera l'errore completo di codice e descrizione?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

ReRosso Profilo | Junior Member

Script di creazione:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[diagnosi_seduta]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ais_sed] DROP CONSTRAINT diagnosi_seduta
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pazienti_seduta]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ais_sed] DROP CONSTRAINT pazienti_seduta
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[reparto_diagnosi]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ais_dia] DROP CONSTRAINT reparto_diagnosi
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[dettaglio_reparto]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ais_dute] DROP CONSTRAINT dettaglio_reparto
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[reparto_terapia]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ais_ter] DROP CONSTRAINT reparto_terapia
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[utente_dettaglio]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ais_dute] DROP CONSTRAINT utente_dettaglio
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[utente_seduta2]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ais_sed] DROP CONSTRAINT utente_seduta2
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ais_dia]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ais_dia]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ais_mot]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ais_mot]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ais_paz]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ais_paz]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ais_sed]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ais_sed]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ais_rep]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ais_rep]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ais_ter]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ais_ter]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ais_ute]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ais_ute]
GO

CREATE TABLE [dbo].[ais_dia] (
[dia_dia] [nvarchar] (20) COLLATE Latin1_General_CI_AS NOT NULL ,
[dia_des] [nvarchar] (2000) COLLATE Latin1_General_CI_AS NULL ,
[dia_rep_id] [nvarchar] (50) COLLATE Latin1_General_CI_AS NULL ,
[dia_eli] [bit] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ais_mot] (
[mot_mot] [nvarchar] (50) COLLATE Latin1_General_CI_AS NOT NULL ,
[mot_eli] [bit] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ais_paz] (
[paz_id] [int] NOT NULL ,
[paz_nom] [nvarchar] (41) COLLATE Latin1_General_CI_AS NULL ,
[paz_cog] [nvarchar] (62) COLLATE Latin1_General_CI_AS NULL ,
[paz_cf] [nvarchar] (16) COLLATE Latin1_General_CI_AS NULL ,
[paz_dna] [nvarchar] (10) COLLATE Latin1_General_CI_AS NULL ,
[paz_sex] [bit] NULL ,
[paz_pre] [nvarchar] (2) COLLATE Latin1_General_CI_AS NULL ,
[paz_cre] [nvarchar] (30) COLLATE Latin1_General_CI_AS NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ais_sed] (
[sed_id] [int] NOT NULL ,
[sed_paz_id] [int] NULL ,
[sed_dat] [smalldatetime] NOT NULL ,
[sed_ora] [smalldatetime] NULL ,
[sed_mot_id] [nvarchar] (50) COLLATE Latin1_General_CI_AS NULL ,
[sed_dia_id] [nvarchar] (20) COLLATE Latin1_General_CI_AS NULL ,
[sed_ter_id] [nvarchar] (20) COLLATE Latin1_General_CI_AS NULL ,
[sed_rep_id] [nvarchar] (50) COLLATE Latin1_General_CI_AS NULL ,
[sed_tex] [nvarchar] (2000) COLLATE Latin1_General_CI_AS NULL ,
[sed_ute_id] [nvarchar] (20) COLLATE Latin1_General_CI_AS NULL ,
[sed_dcr] [smalldatetime] NULL ,
[sed_ucr] [nvarchar] (20) COLLATE Latin1_General_CI_AS NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ais_rep] (
[rep_rep] [nvarchar] (50) COLLATE Latin1_General_CI_AS NOT NULL ,
[rep_res] [nvarchar] (70) COLLATE Latin1_General_CI_AS NULL ,
[rep_eli] [bit] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ais_ter] (
[ter_ter] [nvarchar] (20) COLLATE Latin1_General_CI_AS NOT NULL ,
[ter_des] [nvarchar] (1000) COLLATE Latin1_General_CI_AS NULL ,
[ter_rep_id] [nvarchar] (50) COLLATE Latin1_General_CI_AS NULL ,
[ter_eli] [bit] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ais_ute] (
[ute_ute] [nvarchar] (20) COLLATE Latin1_General_CI_AS NOT NULL ,
[ute_nom] [nvarchar] (41) COLLATE Latin1_General_CI_AS NULL ,
[ute_cog] [nvarchar] (62) COLLATE Latin1_General_CI_AS NULL ,
[ute_pw] [nvarchar] (20) COLLATE Latin1_General_CI_AS NULL ,
[ute_pro] [nvarchar] (20) COLLATE Latin1_General_CI_AS NULL ,
[ute_gru] [nvarchar] (20) COLLATE Latin1_General_CI_AS NULL ,
[ute_log] [smalldatetime] NULL ,
[ute_spw] [smalldatetime] NULL ,
[ute_eli] [bit] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ais_dia] WITH NOCHECK ADD
CONSTRAINT [PK_ais_dia] PRIMARY KEY CLUSTERED
(
[dia_dia]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ais_mot] WITH NOCHECK ADD
CONSTRAINT [PK_ais_mot] PRIMARY KEY CLUSTERED
(
[mot_mot]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ais_paz] WITH NOCHECK ADD
CONSTRAINT [PK_ais_paz] PRIMARY KEY CLUSTERED
(
[paz_id]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ais_sed] WITH NOCHECK ADD
CONSTRAINT [PK_ais_sed] PRIMARY KEY CLUSTERED
(
[sed_id]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ais_rep] WITH NOCHECK ADD
CONSTRAINT [PK_ais_rep] PRIMARY KEY CLUSTERED
(
[rep_rep]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ais_ter] WITH NOCHECK ADD
CONSTRAINT [PK_ais_ter] PRIMARY KEY CLUSTERED
(
[ter_ter]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ais_ute] WITH NOCHECK ADD
CONSTRAINT [PK_ais_ute] PRIMARY KEY CLUSTERED
(
[ute_ute]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ais_sed] ADD
CONSTRAINT [IX_ais_sed] UNIQUE NONCLUSTERED
(
[sed_paz_id],
[sed_dat],
[sed_rep_id]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ais_dia] ADD
CONSTRAINT [reparto_diagnosi] FOREIGN KEY
(
[dia_rep_id]
) REFERENCES [dbo].[ais_rep] (
[rep_rep]
) ON UPDATE CASCADE
GO

ALTER TABLE [dbo].[ais_ter] ADD
CONSTRAINT [reparto_terapia] FOREIGN KEY
(
[ter_rep_id]
) REFERENCES [dbo].[ais_rep] (
[rep_rep]
) ON UPDATE CASCADE
GO

ALTER TABLE [dbo].[ais_sed] ADD
CONSTRAINT [diagnosi_seduta] FOREIGN KEY
(
[sed_dia_id]
) REFERENCES [dbo].[ais_dia] (
[dia_dia]
) ON UPDATE CASCADE ,

CONSTRAINT [pazienti_seduta] FOREIGN KEY
(
[sed_paz_id]
) REFERENCES [dbo].[ais_paz] (
[paz_id]
) ON UPDATE CASCADE ,

CONSTRAINT [utente_seduta2] FOREIGN KEY
(
[sed_ucr]
) REFERENCES [dbo].[ais_ute] (
[ute_ute]
) ON UPDATE CASCADE ,

CONSTRAINT [utente_seduta1] FOREIGN KEY
(
[sed_ute_id]
) REFERENCES [dbo].[ais_ute] (
[ute_ute]
) ON UPDATE CASCADE ,

CONSTRAINT [motivo_seduta] FOREIGN KEY
(
[sed_mot_id]
) REFERENCES [dbo].[ais_mot] (
[mot_mot]
) ON UPDATE CASCADE ,

CONSTRAINT [terapia_seduta] FOREIGN KEY
(
[sed_ter_id]
) REFERENCES [dbo].[ais_ter] (
[ter_ter]
) ON UPDATE CASCADE ,

CONSTRAINT [reparto_seduta] FOREIGN KEY
(
[sed_rep_id]
) REFERENCES [dbo].[ais_rep] (
[rep_rep]
) ON UPDATE CASCADE
GO

Codice di errore:

Server: messaggio 1785, livello 16, stato 1, riga 2
L'impostazione del vincolo FOREIGN KEY 'utente_seduta1' nella tabella 'ais_sed' potrebbe generare cicli o percorsi a catena multipla. Specificare ON DELETE NO ACTION oppure ON UPDATE NO ACTION oppure modificare altri vincoli FOREIGN KEY.
Server: messaggio 1750, livello 16, stato 1, riga 2
Impossibile creare il vincolo. Vedere gli errori precedenti.

lbenaglia Profilo | Guru

ALTER TABLE [dbo].[ais_sed] ADD ... CONSTRAINT [utente_seduta2] FOREIGN KEY ( [sed_ucr] ) REFERENCES [dbo].[ais_ute] ( [ute_ute] ) ON UPDATE CASCADE , CONSTRAINT [utente_seduta1] FOREIGN KEY ( [sed_ute_id] ) REFERENCES [dbo].[ais_ute] ( [ute_ute] ) ON UPDATE CASCADE , ...

OK, stai cercando di definire 2 constraint foreign key con "update a cascata" su due colonne diverse della tabella ais_sed verso una colonna della tabella ais_ute.
Se fosse possibile un comando del genere cosa succederebbe se la modifica ad una delle due colonne dalla parte molti della relationship comportasse una modifica della PK nella tabella dalla parte 1? Si perderebbe la corrispondenza con la seconda colonna della tabella dalla parte molti a meno di non modificare anch'essa, generando un loop potenzialmente ricorsivo.

Quindi, per realizzare questo tipo di constraint occorre rimuovere la clauspla ON UPDATE CASCADE o specificare esplicitamente ON UPDATE NO ACTION.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5