PDA

View Full Version : Error in Diagraram And Relationship



_alish_
چهارشنبه 25 اردیبهشت 1387, 09:09 صبح
با عرض سلام
- لطفا راهنمايي بفرماييد كه براي مباحث Enforce Coscade Update and Delete از RelationShip خود جداول استفاده كنم بهتر است يا Triger بنويسم.
- با Diagram ، RelationShip Delete را بين جداول قرار دادم اما اين پيغام را مي دهد لطفا راهنماي كنيد اين پيغام به چه دليل است تعدادي ركورد جدول Foreign من Null بوده اما تمامي ركوردهاي جدول Foreign با جدول اصلي لينك مي باشد.
- SQL Server 2000



'tblInquiryFile' table saved successfully
'tblInquiryCompany' table
- Unable to create relationship 'FK_tblInquiryCompany_tblInquiryFile'.
ODBC error: [Microsoft][ODBC SQL Server Driver][SQL Server]Introducing FOREIGN KEY constraint 'FK_tblInquiryCompany_tblInquiryFile' on table 'tblInquiryCompany' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
[Microsoft][ODBC SQL Server Driver][SQL Server]Could not create constraint. See previous errors.

ASKaffash
چهارشنبه 25 اردیبهشت 1387, 17:23 عصر
با سلام
تعدادی رکورد در جدول Foreign Key وجوددارد که Pk ندارند Null ها هم به حساب می آیند

Arghavan_Reza
چهارشنبه 25 اردیبهشت 1387, 18:00 عصر
به این جمله دقت نمایید

may cause cycles or multiple cascade paths
در بین ارتباطات شما حالتی وجود دارد که یک جدول بیش از یک بار تحت تاثیر تغییرات قرار می گیرد و این حالت توسط SQL پشتیبانی نمی شود. مثل ارتباط جدول با خودش. در این حالات چون CasCade پذیرفته نیست ، در صورت الزام؛ ارتباط را حذف کرده و از تریگر استفاده نمایید.

AminSobati
چهارشنبه 25 اردیبهشت 1387, 23:02 عصر
اگر PK یک جدول، دو بار در جدول دیگه ای FK داشته بشه، فقط یکی از اونها میتونه Cascade داشته باشه، در غیر اینصورت باید Trigger استفاده کنید

_alish_
یک شنبه 29 اردیبهشت 1387, 11:26 صبح
با تشكر از دوستان گرامي ، اطلاعات مفيدي بوده.
با عرض پوزش بدليلي كه در پروژه هام از تريگرهاي ساده اي استفاده نموده ام ، در اين مورد دچار كمي مشكل گشته ام لطفا با عرض معذرت راهنمايي بيشتر در اين خطا لطف فرماييد.
زير سيستم استعلام گيري
جدول tblInquiryFile -> pk , fInquiryFileID به دو جدول كالاهاي استعلامي و شركت كنندگان تريگر حذف فاير گردد.


CREATE TRIGGER [trgDeletetblInquiryFile] ON [dbo].[tblInquiryFile]
FOR DELETE
AS
Declare @fInquiryFileID bigint
Select @fInquiryFileID=(Select fInquiryFileID From Deleted)
DELETE FROM tblInquiryGoods
WHERE (fInquiryFileID = @fInquiryFileID)
DELETE FROM tblInquiryCompany
WHERE (fInquiryFileID = @fInquiryFileID)


جدول tblInquiryGdsID pk, fInquiryGoods جدول قيمت استعلامي و جزئيات استعلام تريگر حذف فاير گردد.


CREATE TRIGGER [trgDeletetblInquiryGoods] ON [dbo].[tblInquiryGoods]
FOR DELETE
AS
Declare @fInquiryGdsID bigint
Select @fInquiryGdsID=(Select fInquiryGdsID From Deleted)
DELETE FROM tblInquiryCost
WHERE (fInquiryGdsID = @fInquiryGdsID)
DELETE FROM tblInquiryDetails
WHERE (fInquiryGdsID = @fInquiryGdsID)

و بدين ترتيب براي جدول شركت كنندگان و قيمت اعلامي نيز تريگر قرار داده ام.

مشكل : با حذف تريگرها و تنها در دو مرحله پرونده استعلام و شركت كنندگان موقع حذف خطاي تصوير را مي دهد


اگر PK یک جدول، دو بار در جدول دیگه ای FK داشته بشه،
چناب آقاي ثباتي منظور در چند جدول مجزا اگر از FK يكي استفاده نماييم بايد از تريگر استفاده كنيم. ميشه كمي بيشتر توضيح دهيد.

ببخشيد متنم طولاني گشته

_alish_
یک شنبه 29 اردیبهشت 1387, 11:30 صبح
تصوير طراحي جداول استعلامي

_alish_
دوشنبه 30 اردیبهشت 1387, 08:28 صبح
مشكل در اين Select مي باشد ولي چطوري بگم در جدول Detail م ركوردهاي مرتبط با جدول قيمت و جزئيات هم حذف كند؟
Select @fInquiryGdsID=(Select fInquiryGdsID From Deleted) چون دارد چند ركورد بر مي گرداند

Arghavan_Reza
دوشنبه 30 اردیبهشت 1387, 11:21 صبح
دوست عزیز؛
به نظرم در ساختار شما فیلدهای FK اضافی وجود دارد.
لذا در مورد گردش اطلاعات سیستم توضیح کاملتری عنایت کنید، تا بتوانیم کمک کنیم.

_alish_
دوشنبه 30 اردیبهشت 1387, 12:01 عصر
بسيار ممنونم دوست گرامي
زير سيستم مربوطه در خصوص استعلام گيري مي باشد با جداول ذيل

_alish_
دوشنبه 30 اردیبهشت 1387, 12:07 عصر
بسيار ممنونم دوست گرامي
زير سيستم مربوطه در خصوص استعلام گيري مي باشد با جداول ذيل:


جدول
پرونده استعلامي tblInquiryFile
PK
fInquiryFileID

كالاي استعلامي tblInquiryGoods
FK ---------------- Master Tbl ---------------- FK --------------- Master tbl ----------------- PK
fInquiryFileID ----------- fInquiryGdsID ----- tblInquiryFile

شركت كنندگان tblInquiryCompany
FK ---------------- Master Tbl ---------------- FK --------------- Master tbl ----------------- PK
fInquiryFileID ------------ tblInquiryFile --------- fInquiryID

قيمت استعلامي tblInquiryCost
FK ---------------- Master Tbl ---------------- FK --------------- Master tbl ------------------ PK
fInquiryGdsID ----------- tblInquiryGoods ------- fInquiryID ----- tblInquiryCompany ---- fInquiryCostID

جزئيات استعلامي tblInquiryDetails
FK ---------------- Master Tbl ---------------- FK --------------- Master tbl ----------------- PK
fInquiryGdsID ------------ tblInquiryGoods ------- fInquiryID ----- tblInquiryCompany ---- fInquiryDetID



1- پروند ايجاد شده 2- كالاهاي استعلامي ثبت مي گردد ( در اين مرحله مي توان قيمت و شركت ثبت نگرددو كار حذف صورت پذيرد)
3- شركت كنندگان استعلامي ثبت مي گردد ( در اين مرحله مي توان قيمت و جزئيات ثبت نگرددو كار حذف صورت پذيرد)
4- قيمت استعلامي ثبت مي گردد و برنده تعيين مي گردد ( در اين مرحله مي توان جزئيات ثبت نگرددو كار حذف صورت پذيرد)
5- جزئيات در صورت نياز ( ماليات ، تخفيف ...)
در هر مرحله طبق لينك امكان حذف جزئيات بايد طبق تريگر انجام پذيرد.

ASKaffash
دوشنبه 30 اردیبهشت 1387, 12:08 عصر
با سلام
به شکل ذیل بنویس :

CREATE TRIGGER [trgDeletetblInquiryFile] ON [dbo].[tblInquiryFile]
FOR DELETE
AS
DELETE FROM tblInquiryGoods
WHERE fInquiryFileID In(Select fInquiryFileID From Deleted)
DELETE FROM tblInquiryCompany
WHERE fInquiryFileID In(Select fInquiryFileID From Deleted)

_alish_
دوشنبه 30 اردیبهشت 1387, 13:25 عصر
خيلي ممنون دوست ارجمند.
ااا خيلي سوتي بود ، فكر الكي مساله را پيچيده كرده بود. باز م متشكر