PDA

View Full Version : حرفه ای: آیا از این رکورد استفاده شده ؟!



Arghavan_Reza
جمعه 21 آبان 1389, 18:15 عصر
سلام,
فرض 1 : جدولی بنام Table1 داریم که از رکوردهای آن در ده ها جدول دیگر استفاده شده است.
فرض 2 : نام جداول دیگر را نمیدانیم یا به آنها دسترسی نداریم.
سوال : چگونه میتوان تشخیص داد که از یک رکورد خاص این جدول در جداول دیگر استفاده شده است؟
با تشکر

بهزادصادقی
جمعه 21 آبان 1389, 19:57 عصر
وقتی می گویی «از رکوردهای آن در یک جدول دیگر استفاده شده» منظورت دقیقا چیست؟

این یعنی چی که من از یک روکورد توی یک جدول دیگه استفاده کنم؟

اگر شما این را دقیقا توضیح بدهی، شاید راهی برای حل مسئله پیدا شود.

dataking
جمعه 21 آبان 1389, 20:07 عصر
سلام
دقیقا سوال را نگرفتم
ولی اگه بخوای بعد از این که یک رکورد جدول توی یک جدول دیگه ذخیره شد متوجه بشی یک فیلد بولین تو جدول اولی ایجاد کن و true کن

حمیدرضاصادقیان
شنبه 22 آبان 1389, 07:20 صبح
سلام,
فرض 1 : جدولی بنام Table1 داریم که از رکوردهای آن در ده ها جدول دیگر استفاده شده است.
فرض 2 : نام جداول دیگر را نمیدانیم یا به آنها دسترسی نداریم.
سوال : چگونه میتوان تشخیص داد که از یک رکورد خاص این جدول در جداول دیگر استفاده شده است؟
با تشکر

سلام. به این شکل که نمیشه متوجه شد این رکورد در جداول دیگه استفاده شده است یا خیر.
شما باید مثلا براساس یک فیلد اصلی با جداول مختلف join بزنید یا با Select های تودرتو مشخص کنید که این رکورد در اون جداول وجود دارند یا خیر.

Arghavan_Reza
یک شنبه 23 آبان 1389, 13:35 عصر
با عرض پوزش از اساتید فن, سوال خود را به این شکل مطرح میکنم:
ID کلید جدول Table1 است و این کلید بعنوان ForeignKey در جداول دیگر استفاده شده.
مثلا فرض جدول فوق حاوی اطلاعات اشخاص باشد. و از ID آن در جداول دیگری مانند فاکتور فروش, سند حسابداری, دفتر تلفن, اسناد انبار, حقوق و دستمزد و ... و ده ها یا صدها جدول دیگر استفاده شده باشد.
میتوان برای هر جدولی که به جدول اشخاص ارتباط دارد دستوری مثل دستور زیر نوشت:

IF EXISTS(SELECT * FROM TableA WHERE Table1_ID = @ID)
....
IF EXISTS(SELECT * FROM TableB WHERE Table1_ID = @ID)
....

اما این شکل نوشتن شاید قدری بچگانه بنظر بیاید و لازم است که اسامی تمامی جدول خارجی جدول اشخاص شناخته شده باشد و ....

اما مشکل اینست (با فرض دانستن اسامی جداول) که نوشتن ده ها (یا چند صد) دستور مثل فوق برای اینکه چک کنیم از ID جدول اشخاص استفاده شده یا خیر, هم سرعت را کند میکند هم ممکنه نام جدولی از دستمان در برود. لذا فرض میکنیم که اسامی جداول را نمیدانیم. (البته ممکنه شرایطی هم پیش بیاید که واقعا ندانیم)

اصلا خود SQL برای اینکار دستوری, تابعی یا پیشنهادی داره؟

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

علیرضا مداح
یک شنبه 23 آبان 1389, 18:12 عصر
سلام،

فرض 2 : نام جداول دیگر را نمیدانیم یا به آنها دسترسی نداریم.
منظورتان از "نمیدانیم" چیست؟ می توانید توسط جداول سیستمی SQL Server جداول مرتبط دیگر را پیدا کرده و با ساخت یک Dynamic Query به مقصود خود برسید،/

Bahmany
یک شنبه 23 آبان 1389, 21:31 عصر
سلام,
فرض 1 : جدولی بنام Table1 داریم که از رکوردهای آن در ده ها جدول دیگر استفاده شده است.
فرض 2 : نام جداول دیگر را نمیدانیم یا به آنها دسترسی نداریم.
سوال : چگونه میتوان تشخیص داد که از یک رکورد خاص این جدول در جداول دیگر استفاده شده است؟
با تشکر


SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint,
SCHEMA_NAME(schema_id) AS SchemaName,
OBJECT_NAME(parent_object_id) AS TableName,
type_desc AS ConstraintType
FROM sys.objects
WHERE type_desc LIKE '%CONSTRAINT'


دوست عزیز اگه بانکی داری که از قوانین و کلیدها و ... بی خبری کد فوق رو در محیط SQLQuery اجرا کن

amin1softco
یک شنبه 23 آبان 1389, 21:41 عصر
http://barnamenevis.org/forum/attachment.php?attachmentid=60267&stc=1&d=1289760054
خوب حالا از کجا باید بفهمیم کدوم کلید ماله کدوم بانکه؟!

Bahmany
دوشنبه 24 آبان 1389, 08:34 صبح
خوب حالا از کجا باید بفهمیم کدوم کلید ماله کدوم بانکه؟!



TableName نام جدولی که اون Constraint در اون قرار گرفته رو نشون میده
Constraint ها همون Index,PrimaryKey,ForiegnKey,Check... هستند که اگه توجه کنی توی Constraint Type اولش رو با نام اون Constraint شروع کرده و تو ستون NameOfConstraint هم نام جدول مبدا و مقصد برای Constraint هایی از نوع Foreign Key نوشته شده

Arghavan_Reza
دوشنبه 24 آبان 1389, 16:26 عصر
با این اوصاف باز هم باید از دستوری شبیه دستور زیر استفاده کنیم:


IF EXISTS(SELECT * FROM TableA WHERE Table1_ID = @ID)

با این تفاوت که اسامی جداولی مثل TableA پارامتریک است.
اما دستور SELECT نام جدول را که به صورت پارامتر نمیپذیرد.

Rezahak
دوشنبه 24 آبان 1389, 16:49 عصر
سلام
اين طور كه مي فرماييد نيست . اگر من درست مطالب شما را درك كرده باشم جواب شما اين است :
در sql server يك object (شما فرض كنيد يك جدول) سيستمي به نام sys.objects وجود دارد كه ساختار پايه تمام اجزاي database اعم از view , type و ... در آن قرار دارد شما بايد در داخل sys.objects دنبال جدول و كليد هاي خود بگرديد يعني فقط :
select * from sys.objects where tablename = @id

Arghavan_Reza
دوشنبه 24 آبان 1389, 17:00 عصر
بخشی از سوال توسط جناب آقای بهمنی پاسخ داده شد. و آن یافتن جداولی است که با جدول مورد نظر ارتباط دارند.
بخش دوم سوال اینه که حال که اسامی جداول مرتبط را با استفاده از جدول sysobjects دانستیم. چگونه بفهمیم که در جدول یافت شده, رکورد(هایی) وجود دارد که از کلید جدول مورد نظر استفاده شده است؟
این مطلب را هم یادآور شوم که دستور SELECT نام جدول را به صورت پارامتریک نمیپذیرد.

FastCode
دوشنبه 24 آبان 1389, 17:43 عصر
این مطلب را هم یادآور شوم که دستور SELECT نام جدول را به صورت پارامتریک نمیپذیرد.

ولی دستور exec می پذیرد.

Arghavan_Reza
دوشنبه 24 آبان 1389, 19:57 عصر
exec میپذیرد ولی لازمه از exec خروجی بگیریم.
چگونه به منظور خود برسیم؟
اگر ممکنه مثال بزنید.