PDA

View Full Version : ساخت اسکریپتی برای حذف و ساخت ویوهای یک دیتابیس



efarzad
چهارشنبه 24 آبان 1391, 16:20 عصر
با سلام خدمت دوستان و مدیر محترم بخش !
خود SSMS دارای بخشی به نام Generate Scripts برای ساخت اسکریپت از تمام اجزای دیتا بیس هست, اما مشکلی که داره اینه که Dependency ها رو رعایت نمیکنه.
حالا من میخوام با داشتن اطلاعات یک دیتابیس, بتوانم با کد نویسی ، اسکریپتی برای Drop و Create ویوهای آن بسازم که Dependency هم در آن رعایت شده باشد.
با تشکر

حمیدرضاصادقیان
چهارشنبه 24 آبان 1391, 21:58 عصر
سلام.
شما با استفاده از جداول سیستمی و View ها میتونید لیست اشیای دیتابیس رو بدست آورده و برای اون Script مورد نظر رو ایجاد کنید.ولی به جز همه این موارد وقتی شما دارید یک Script رو ایجاد میکنید در قسمتی که فایل رو مشخص میکنید با زدن دکمه Advanced گزینه Generate Script For Dependent Object رو به True تغییر بدید چون در حالت پیش فرض غیر فعال هست.

efarzad
شنبه 27 آبان 1391, 16:06 عصر
ممنون از جوابتون، این گزینه ای رو که گفتید من در SQL Server 2005 ندیدم. مربوط به نسخه های بالاتر میشه ؟

efarzad
سه شنبه 30 آبان 1391, 09:18 صبح
بعد از مقداری جستجو به کوئری زیر رسیدم، منتها باز هم در این روش Dependency رعایت نمیشه. در Sp_Dependency تمام Dependency ها با توجه به Object_Id آنها ذکر شده، اما نمیدونم چه جوری میتونم با این کوئری ترکیبش کنم :


SELECT 'DROP VIEW ' + v.name As DropCmd, RTRIM(ISNULL(smv.definition, ssmv.definition) ) AS CreateCmd
FROM sys AS v
LEFT OUTER JOIN sys.sql_modules AS smv ON smv.object_id = v.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmv ON ssmv.object_id = v.object_id
WHERE v.type = 'V' AND SCHEMA_NAME(v.schema_id) = N'dbo'
ORDER BY v.name

efarzad
چهارشنبه 01 آذر 1391, 12:27 عصر
متوجه شدم که از کلاس Scripter موجود در SMO هم میتوانم استفاده کنم، اما این کلاس هم مثل Generate Script از SSMS در صورتی که رعایت Dependency را مشخص کرده باشم، جداولی را هم که به نحوی با ویوها مرتبط باشند، اسکریپتشان را ایجاد میکند که درست نیست یعنی من نمیخواهم اسکریپتم شامل جداول نیز بشود، من فقط میخواهم اسکریپتی از ایجاد و حذف ویوها داشته باشم که Dependency در آنها رعایت شده باشد.

efarzad
یک شنبه 19 آذر 1391, 13:51 عصر
بالاخره جواب رو پیدا کردم ، البته این برای حالتیه که ویوها بیشتر از یک سطح وابستگی نداشته باشند.

SELECT MIN(Row) AS Row, CreateCmd FROM (
SELECT Row_Number() OVER (ORDER BY S.Row) As Row, S.CreateCmd FROM (
SELECT 0 AS Row, RTRIM(ISNULL(smv.definition, ssmv.definition)) AS CreateCmd
FROM sys.all_objects AS v
LEFT OUTER JOIN sys.sql_modules AS smv ON smv.object_id = v.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmv ON ssmv.object_id = v.object_id
INNER JOIN (SELECT object_id, referenced_major_id FROM sys.sql_dependencies
GROUP BY object_id, referenced_major_id) AS a ON v.object_id = a.referenced_major_id
WHERE (v.type = 'V' OR v.type = 'P' OR v.type = 'IF' OR v.type = 'TF' OR v.type = 'FN')
AND SCHEMA_NAME(v.schema_id) = N'dbo' AND is_ms_shipped <> 1
AND smv.execute_as_principal_id IS NULL AND ssmv.execute_as_principal_id IS NULL
GROUP BY v.Name, smv.definition, ssmv.definition
UNION ALL
SELECT 1 AS Row, RTRIM(ISNULL(smv.definition, ssmv.definition)) AS CreateCmd
FROM sys.all_objects AS v
LEFT OUTER JOIN sys.sql_modules AS smv ON smv.object_id = v.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmv ON ssmv.object_id = v.object_id
INNER JOIN (SELECT object_id, referenced_major_id FROM sys.sql_dependencies
GROUP BY object_id, referenced_major_id) AS a ON v.object_id = a.object_id
WHERE (v.type = 'V' OR v.type = 'P' OR v.type = 'IF' OR v.type = 'TF' OR v.type = 'FN')
AND SCHEMA_NAME(v.schema_id) = N'dbo' AND is_ms_shipped <> 1
AND smv.execute_as_principal_id IS NULL AND ssmv.execute_as_principal_id IS NULL
GROUP BY v.Name, smv.definition, ssmv.definition
) S GROUP BY S.Row, CreateCmd
) D GROUP BY CreateCmd ORDER BY Row