Το μήνυμα λάθους προκύπτει 1785, όταν δημιουργείτε έναν περιορισμό ΕΞΩΤΕΡΙΚΟΎ ΚΛΕΙΔΙΟΎ που μπορεί να προκαλέσει πολλές διαδρομές σε επικάλυψη

Συμπτώματα

Όταν δημιουργείτε έναν περιορισμό ΕΞΩΤΕΡΙΚΟΎ ΚΛΕΙΔΙΟΎ, ενδέχεται να λάβετε το ακόλουθο μήνυμα λάθους:

Διακομιστής: Μήνυμα λάθους 1785, 16 επιπέδου, κατάσταση 1, γραμμή 1 εισαγωγή ΞΈΝΟ ΚΛΕΙΔΊ περιορισμού 'fk_two' στον πίνακα 'πίνακας2' μπορεί να προκαλέσει κύκλους ή πολλές διαδρομές σε επικάλυψη. Καθορίστε κατά τη ΔΙΑΓΡΑΦΉ ΧΩΡΊΣ ΕΝΈΡΓΕΙΑ ή ΕΝΈΡΓΕΙΑ ΌΧΙ ON UPDATE ή τροποποίηση άλλους περιορισμούς ΕΞΩΤΕΡΙΚΟΎ ΚΛΕΙΔΙΟΎ. Διακομιστής: Μήνυμα λάθους 1750, 16 επιπέδου, κατάσταση 1, γραμμή 1 θα μπορούσε να δημιουργεί περιορισμό. Δείτε προηγούμενα σφάλματα.

Αιτία

Λαμβάνετε αυτό το μήνυμα λάθους επειδή στον SQL Server, ένας πίνακας δεν μπορεί να εμφανίζεται περισσότερες από μία φορές σε μια λίστα με όλες τις διαδοχικές αναφορών ενέργειες που ξεκινούν από ένα DELETE ή μια πρόταση UPDATE. Για παράδειγμα, το δέντρο των επικαλυπτόμενων αναφορών ενέργειες μόνο πρέπει να έχει μία διαδρομή σε ένα συγκεκριμένο πίνακα στη δομή διαδοχικές ενέργειες αναφορών.

Εναλλακτικός τρόπος αντιμετώπισης

Για να επιλύσετε αυτό το ζήτημα, μην δημιουργείτε ένα ξένο κλειδί που θα δημιουργήσει περισσότερες από μία διαδρομές σε έναν πίνακα σε μια λίστα με τις διαδοχικές ενέργειες αναφορών.

Μπορείτε να επιβάλετε ακεραιότητα αναφορών, με πολλούς τρόπους. Η δηλωτική ακεραιότητα αναφορών (DRI) είναι η πιο βασική τρόπο, αλλά επίσης είναι η λιγότερο ευέλικτη τρόπο. Εάν χρειάζεστε περισσότερη ευελιξία, αλλά εξακολουθείτε να θέλετε ένα υψηλό επίπεδο ακεραιότητας, μπορείτε να χρησιμοποιήσετε τα εναύσματα.

Περισσότερες πληροφορίες

Το ακόλουθο δείγμα κώδικα είναι ένα παράδειγμα μιας προσπάθειας δημιουργίας ΞΈΝΟ ΚΛΕΙΔΊ που δημιουργεί το μήνυμα λάθους:

Use tempdbgo
create table table1 (user_ID integer not null primary key, user_name
char(50) not null)
go

create table table2 (author_ID integer not null primary key, author_name
char(50) not null, lastModifiedBy integer not null, addedby integer not
null)

go

alter table table2 add constraint fk_one foreign key (lastModifiedby)
references table1 (user_ID) on delete cascade on update cascade
go
alter table table2 add constraint fk_two foreign key (addedby)
references table1(user_ID) on delete no action on update cascade
go
--this fails with the error because it provides a second cascading path to table2.

alter table table2 add constraint fk_two foreign key (addedby)
references table1 (user_ID) on delete no action on update no action
go
-- this works.

ΑΝΑΦΟΡΈΣ

Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα "Επικαλυπτόμενων αναφορών περιορισμούς ακεραιότητας" στο SQL Server 2000 Books Online.
Ιδιότητες

Αναγνωριστικό άρθρου: 321843 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 3

Σχόλια