سلام به همگی
خیلی وقته اینجا چیزی ننوشتم، مشغله کاری و ذهنی اجازه نمی داد، به همین خاطر تصمیم گرفتم مطالبی که توی ذهنم هست را خیلی ساده و با زبان محاوره ای بیان کنم، شاید بدرد کسی خورد.
امروز در محیط کار سخت مشغول بودم که یکی از کاربران گفت فلان فرم خطا می ده! طبق روال عادی فازهای بررسی شخصی خطا در برنامه و تأیید حرف کاربر، اجرای پروفایلر، به چنگ آوردن اسکریپت اس کیو ال و در نهایت سلاخی اون اسکریپت تا بفهمم کدوم تیکش باعث و بانی هست؛ اجرا شد و در کمال تعجب چی پیدا کردم! اجرای یک ویو خطا می داد. یعنی چی؟ ویویی که درست بوده، روی دیتابیس دیگه کار می کنه چشه آخه!
راه حلی که در مرحله اول به ذهن آدم می رسه اینه که کد های Select داخل ویو را جداگانه اجرا کنیم ببینیم مشکل کجاست که در کمال تعجب می بینیم هیچ خطایی وجود نداره، اما اجرای خود ویو خطاهای عجیب غریب تولید می کنه!
پس مشکل کجاست؟
اگر ویو را Drop کنیم و دوباره بسازیم، مشکل ویو حل خواهد شد اما دلیل خطا را هنوز نفهمیدیم. با کنکاش بیشتر متوجه می شیم بعضی از Object هایی که ویو به آنها وابستگی داشته (مثل جداولی که در Select بکار رفتن) تغییر کردن و به همین خاطر متادیتای ویو خراب شده و نمی تونه بدرستی اجرا بشه.
خب، دفعه بعد که یک ویوی معیوب را پیدا کردید می تونید از دستور Sp_refreshview برای اصلاح کد اون استفاده کنید اما وقتی یه جدول را تغییر دادیم چطور بدونیم کدام ویوها نیاز به بروز رسانی دارند؟ با فرض تغییرات در جدول Person، کد زیر مشکل گشاست :
USE AdventureWorks2012;
GO
SELECT DISTINCT 'EXEC sp_refreshview ''' + name + ''''
FROM sys.objects AS so
INNER JOIN sys.sql_expression_dependencies AS sed
ON so.object_id = sed.referencing_id
WHERE so.type = 'V' AND sed.referenced_id = OBJECT_ID('Person.Person');
سال نو شما مبارک ویرگولی ها :)