PDA

View Full Version : کپی یک Object از یک DB به DB دیگر با TSQL ؟



Modifier
شنبه 25 دی 1389, 13:43 عصر
سلام

میخوام یه Object مثل View,Table,StorProcedure یا... رو از یک DB بفرستم توی یک DB دیگه...
شاید بهتره بگم همون Import....

چطور این کا رو انجام بدم با TSQL ؟

ممنون.
یاعلی.

m_omrani
یک شنبه 26 دی 1389, 22:19 عصر
فکر نمی کنم چیزی (مثلاً دستوری در T-SQL) تحت عنوان کپی برای این کار وجود داشته باشه، برای این کار بهتره از ابزارهای آماده مثل Database Publishing Waizard استفاده کنید که البته در SQL Server 2008 به طور آماده وجود داره. چون اگه نخواین از ابزارهای آماده استفاده کنین باید خودتون اسکریپت لازم برای این کار رو بنویسید که برای این کار هم حتماً باید از Dynamic SQL استفاده کنید و این کار هم بسیار بسیار مفصله و در واقع خودتون با این کار دارید یه Database Publishing Wizard می نویسید!

به عنوان مثال لیست تمام اشیاء دیتابیس در sys.objects ثبت شده، لیست تمام فیلد جداول در sys.columns، لیست تمام پارامترهای توابع و رویه های ذخیره شده در sys.parameters، لیست تمام تریگرها در sys.triggers و ... نوشتن اسکپریتی که بتونه اسکریپت لازم برای ایجاد همه اشیاء رو تولید کنه تا بعد اونو در دیتابیس مقصد اجرا کنین، صرفنظر از ملاحظات دسترسی و در نظر گرفتن شرایط مختلف (مثلاً این که اگه یک شیء از قبل در دیتابیس مقصد وجود داشت چی کار باید بکنید)، اعطای دسترسی ها، ایجاد کلیدهای اصلی و خارجی، ایجاد ایندکس ها، ایجاد قیود و غیره و غیره، همه اینها کار بسیار بسیار مفصلیه!

لذا به هیچ وجه بهتون توصیه نمی کنم خودتون بخواید این کار رو انجام بدید و اصولاً هم به نظرم دلیلی برای این کار وجود نداره. چون مگه چند بار چنین چیزی پیش میاد؟ چون آدم باید وقت و انرژی و هزینه اش رو به تناسب و مناسبت خرج کنه و منطقی نیست که به خاطر یه کاری که ممکنه چند سال یک بار پیش بیاد، بیاید مثلاً 6 ماه وقت بذارید که ابزاری رو درست کنید که تازه از قبل هم وجود داره.

حالا خود دانید.

اما این که چطور می شه سورس مثلاً یه رویه ذخیره شده رو توسط T-SQL به دست آورد برای خودم جالب بود و محض کنجکاوی یه Search کردم ببینم چطور می شه این کار رو کرد. چون به هر حال خود ابزارهای از قبل آماده به یه نحوی باید این کار رو انجام بدن دیگه! با کمی جستجو به همچین چیزی رسیدم:


select sp.name as sproc,m.definition as sproc_source
from sys.sql_modules m inner join sys.objects sp
on m.object_id = sp.object_id
where sp.type = 'p'


این اسکریپت سورس رویه های ذخیره شده رو هم می ده. قطعاً ابزاری مثل Database Publishing Wizard از چنین روشی استفاده می کنه. البته توجه کنین فقط سورس رویه های ذخیره شده رمز نشده رو می تونین با این کار به دست بیارید. سورس رویه هایی که با with encryption رمز شدن رو دیگه نمی تونین با T-SQL از این طریق به دست بیارید. ولی اگه جایی گیر کردین، برای اون کار هم ابزارهایی هست که می تونه حتی سورس رویه ذخیره شده رمز شده رو هم بهتون بده.

Modifier
شنبه 09 بهمن 1389, 17:28 عصر
با استفاده از دستور زیر:

select sp.name as sproc,m.definition as sproc_source
from sys.sql_modules m inner join sys.objects sp
on m.object_id = sp.object_id
where sp.type = 'p'


با تغییر شرطش میشود Source ، همه Object ها رو به غیر از Table گرفت ..
Source مربوط به Table ها رو چطور میشه بدست آورد ؟

ممنون.
یاعلی

m_omrani
سه شنبه 12 بهمن 1389, 19:39 عصر
سورس جدول رو نمی تونید مستقیماً به دست بیارید. باید خودتون اسکریپتش رو بر اساس اطلاعات کل جدول و فیلدهاش که از جداول sys.tables و sys.columns و sys.foreign_keys و ... به دست میاد ایجاد کنید و این می شه دقیقاً نوشتن یه ابزار Database Publishing Wizard. :لبخندساده: