PDA

View Full Version : سوال: حذف یک رکورد از جدولی که با یک جدول دیگر مرتبط است



f_arab
پنج شنبه 13 آبان 1389, 15:50 عصر
سلام دوستان عزیز
یه سؤالی دارم که احساس میکنم بیشتر از اینکه به vb.net مربوط باشه به sql ربط پیدا می کنه به خاطر همین اونو اینجا مطرح کردم
من یک برنامه با vb.net ایجاد کردم که یکی از قابیتهای اون حذف رکورد از جدول است ولی وقتی روی دکمه حذف کلیک می کنم رکورد مورد نظر من حذف نمیشه و پیغام زیر رو میده البته اگه فقط فیلدی که کلید اصلی هست پر باشه و بقیه فیلدها خالی، عملیات حذف به درستی انجام میشه
با این توضیح که کلید اصلی جدول مورد نظر من کلید خارجی یه جدول دیگه هست که توی اون هیچ اطلاعاتی که بخواد دو رکورد از این دو جدول رو به هم ربط بده و مانع حذف رکورد بشه وجود نداره
کد هم فکر نمیکنم اشکال داشته باشه چون جای دیگه اونو تست کردم و جواب داده با این وجود کد رو هم میذارم


Dim IndexRow As Integer

IndexRow = BindingContext(Me.ItDataSet1, "network").Position
ItDataSet1.network(IndexRow).Delete()
SqlDataAdapter1.Update(ItDataSet1.network)

m_omrani
جمعه 14 آبان 1389, 00:10 صبح
خدا خیرت بده. چیزی که باید می ذاشتی و توضیح بیشتری می دادی ساختار جداولت در دیتابیس بود نه کُد VB.NET.
مقصودت از این که می گی وقتی فقط فیلدی که کلید اصلی هست پر باشه یا وقتی بقیه فیلدها خالی باشه چیه؟

حمیدرضاصادقیان
جمعه 14 آبان 1389, 20:40 عصر
سلام.فکر میکنم کلید اصلی شما که در جدول دیگر به صورت کلید خارجی تعریف شده است گزینه cascade delete روی اون تنظیم نشده است به همین خاطر وقتی که یک رکورد رو از جدول اصلی دارید حذف میکنید که زیر مجموعه داره خطا میده.برای رفع می تونید در بخش تنظیم relationship روی فیلد مورد نظر رو انتخاب کرده و گزینه cascade delete رو انتخاب کنید.با این کار رکوردهای زیر مجموعه کلید اصلی نیز حذف میشود.

shahab2025
شنبه 15 آبان 1389, 08:14 صبح
سلام.فکر میکنم کلید اصلی شما که در جدول دیگر به صورت کلید خارجی تعریف شده است گزینه cascade delete روی اون تنظیم نشده است به همین خاطر وقتی که یک رکورد رو از جدول اصلی دارید حذف میکنید که زیر مجموعه داره خطا میده.برای رفع می تونید در بخش تنظیم relationship روی فیلد مورد نظر رو انتخاب کرده و گزینه cascade delete رو انتخاب کنید.با این کار رکوردهای زیر مجموعه کلید اصلی نیز حذف میشود.

با سلام
لطفا در این مورد کمی بیشتر توضیح دهید . چرا باید این کار صورت بگیره؟
(من هیچ وقت روی جداولم این کار را نمیکنم)

حمیدرضاصادقیان
شنبه 15 آبان 1389, 08:24 صبح
سلام. ببینید در رابطه Master-Detail شما وقتی در جدول اصلی یک رکورد اضافه میکنید و برای اون زیر مجموعه نیز اضافه میکنید نمیتونید اطلاعات جدول اصلی رو از بین ببرید.
فرض کنید جدول اصلی ما هدر فاکتور هست و جدول زیر مجموعه ریز فاکتور.
حالا مثلا برای فاکتور شماره 1 ما 10 قلم جنس ثبت کردیم. اگر بیایم فاکتور شماره 1 رو حذف کنیم ولی اقلام اون بمونه در سیستم دچار مشکل میکنه. یا نباید اجازه بدیم حذف کنه یعنی ابتدا کاربر زیر محموعه ها رو حذف کنه بعد اطلاعات جدول اصلی . یا با روشی که عرض کردم وقتی اطلاعات جدول اصلی پاک میشه تمامی جزئیات اون نیز از بین میره. یعنی به صورت واضحتر اگر بیان کنم هیچ فرزندی وجود نداره که پدرش معلوم نباشه!!

موفق باشید

shahab2025
شنبه 15 آبان 1389, 08:33 صبح
سلام. ببینید در رابطه Master-Detail شما وقتی در جدول اصلی یک رکورد اضافه میکنید و برای اون زیر مجموعه نیز اضافه میکنید نمیتونید اطلاعات جدول اصلی رو از بین ببرید.
فرض کنید جدول اصلی ما هدر فاکتور هست و جدول زیر مجموعه ریز فاکتور.
حالا مثلا برای فاکتور شماره 1 ما 10 قلم جنس ثبت کردیم. اگر بیایم فاکتور شماره 1 رو حذف کنیم ولی اقلام اون بمونه در سیستم دچار مشکل میکنه. یا نباید اجازه بدیم حذف کنه یعنی ابتدا کاربر زیر محموعه ها رو حذف کنه بعد اطلاعات جدول اصلی . یا با روشی که عرض کردم وقتی اطلاعات جدول اصلی پاک میشه تمامی جزئیات اون نیز از بین میره. یعنی به صورت واضحتر اگر بیان کنم هیچ فرزندی وجود نداره که پدرش معلوم نباشه!!

موفق باشید

مرسی متوجه شدم
من این کار را به تریگر می سپارم - تریگر ابتدا صلاحیت فرد در حذف را بررسی میکنه سپس ضمن حذف هدر ، زیر مجموعه های آنرا نیز حذف میکنه
خارج از بررسی صلاحیت فرد ؛آیا با این کار از این تریگر بی نیاز میشم؟

حمیدرضاصادقیان
شنبه 15 آبان 1389, 08:49 صبح
سلام.بله این خودش به نوعی trigger هست. شما فقط کافیه هنگام حذف در برنامه مشخص کنید که کاربر دسترسی داره رکوردی رو حذف کنه بعدش همه کارارو به Sql server بسپارید.
موفق باشید

f_arab
شنبه 15 آبان 1389, 08:59 صبح
سلام.فکر میکنم کلید اصلی شما که در جدول دیگر به صورت کلید خارجی تعریف شده است گزینه cascade delete روی اون تنظیم نشده است به همین خاطر وقتی که یک رکورد رو از جدول اصلی دارید حذف میکنید که زیر مجموعه داره خطا میده.برای رفع می تونید در بخش تنظیم relationship روی فیلد مورد نظر رو انتخاب کرده و گزینه cascade delete رو انتخاب کنید.با این کار رکوردهای زیر مجموعه کلید اصلی نیز حذف میشود.

سلام، کاری که شما گفتید انجام دادم ولی باز هم حذف انجام نشد،در ضمن توی سؤالم هم گفته بودم که رکوردی که دو جدول رو به هم مربوط کنه و مانع حذف بشه وجود نداره یا به طور واضح تر بگم زیرمجموعه ای توی جدولی که دارای کلید خارجی هست وجود نداره با این حال عمل حذف انجام نمیشه. در این مورد چه نظری دارید؟

f_arab
شنبه 15 آبان 1389, 09:16 صبح
در بخش تنظیم relationship روی فیلد مورد نظر رو انتخاب کرده و گزینه cascade delete رو انتخاب کنید
منظورتون از اینکه فیلد مورد نظر رو انتخاب کنم چیه؟
من تو بخش relationships رابطه مورد نظرم رو انتخابکردم و از قسمت delete role گزینه cascade رو انتخاب کردم درسته؟
اینم ساختار دوتا جدولمه:

USE [it]
GO
/****** Object: Table [dbo].[network] Script Date: 11/06/2010 09:49:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[network](
[user_name] [nvarchar](20) COLLATE Arabic_CI_AS NOT NULL,
[password] [nvarchar](20) COLLATE Arabic_CI_AS NULL,
[nod_number] [smallint] NULL,
[ip_add] [nvarchar](20) COLLATE Arabic_CI_AS NULL,
[tarikh_engheza] [nchar](10) COLLATE Arabic_CI_AS NULL,
[net_type] [nvarchar](20) COLLATE Arabic_CI_AS NULL,
[resources] [nvarchar](max) COLLATE Arabic_CI_AS NULL,
[tarikh_tarif_karbar] [nchar](10) COLLATE Arabic_CI_AS NULL,
CONSTRAINT [PK_network] PRIMARY KEY CLUSTERED
(
[user_name] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

USE [it]
GO
/****** Object: Table [dbo].[karmand] Script Date: 11/06/2010 09:52:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[karmand](
[code_karmand] [nvarchar](15) COLLATE Arabic_CI_AS NOT NULL,
[name] [nvarchar](20) COLLATE Arabic_CI_AS NULL,
[familly_name] [nvarchar](20) COLLATE Arabic_CI_AS NULL,
[user_name] [nvarchar](20) COLLATE Arabic_CI_AS NULL,
[semat] [nvarchar](20) COLLATE Arabic_CI_AS NULL,
[makan] [nvarchar](20) COLLATE Arabic_CI_AS NULL,
CONSTRAINT [PK_karmand_1] PRIMARY KEY CLUSTERED
(
[code_karmand] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
USE [it]
GO
ALTER TABLE [dbo].[karmand] WITH CHECK ADD CONSTRAINT [FK_karmand_network] FOREIGN KEY([user_name])
REFERENCES [dbo].[network] ([user_name])
ON UPDATE CASCADE
ON DELETE CASCADE

حمیدرضاصادقیان
شنبه 15 آبان 1389, 10:19 صبح
سلام.بله با این روش مشکل باید حل بشه.اگر نشد باید توضیح بیشتری ارائه بفرمائید

f_arab
شنبه 15 آبان 1389, 16:28 عصر
سلام
جناب صادقیان از راهنماییتون ممنونم مشکل حذف رکورد برطرف شد:لبخندساده:
فقط یه سؤال می مونه اونم اینه که چطور اون رکوردهایی که فقط فیلد کلیدشون با داده پر شده بود حذف می شدند؟
ولی رکوردی که تمام فیلدهای اون با داده پر شده بود با اینکه زیرمجموعه ای هم تو جدول دیگه ای نداشت که مانع حذف اون بشه ،حذف نمیشد؟
اگه در این مورد هم توضیحی هست لطفا جهت بالا رفتن اطلاعاتم راهنمایی کنید؟