جلوگیری از اجرای کد TSQL در محیط عملیات(Opration)

جلوگیری از اجرای ناخواسته کد T-SQL در سرورهای عملیاتی

استقرار SQL Server معمولاً شامل چندین محیط از جمله توسعه (Development)، تضمین کیفیت (QA) و عملیات (Opration) است. گاهی اوقات هنگام نوشتن کد T-SQL، می‌خواهید از اجرای آن در محیط عملیات جلوگیری کنید. این مطلب چندین روش برای انجام این کار را پوشش خواهد داد.

استفاده از @@SERVERNAME

این احتمالاً ساده‌ترین راه برای جلوگیری از اجرای کد در سرور تولیدی است. تابع @@SERVERNAME نام سرور محلی را برمی‌گرداند. بنابراین، اگر سرور تولیدی شما “ProductionSQL” نام دارد، می‌توانید کد زیر را به اسکریپت خود اضافه کنید تا از اجرای آن در محیط تولید جلوگیری شود.


IF @@SERVERNAME = 'ProductionSQL'
BEGIN
    RAISERROR('This code cannot be run on Production',16,1)
    RETURN
END

با استفاده از این کد، هر دستوری که پس از شرط IF بیاید، اجرا نخواهد شد و یک پیام خطا به کاربر بازگردانده می‌شود.

استفاده از @@VERSION

روش دیگر برای جلوگیری از اجرای کد در سرور عملیاتی ، استفاده از تابع @@VERSION است. این تابع نسخه SQL Server در حال اجرا را برمی‌گرداند. نقطه ضعف این روش این است که @@VERSION می‌تواند برای چندین نسخه از SQL Server یکسان باشد، اما به اندازه کافی متفاوت است که به شما امکان می‌دهد یک سرور SQL Server 2000 را از یک SQL Server 2005 متمایز کنید.


IF @@VERSION LIKE '%SQL Server 2000%'
BEGIN
    RAISERROR('This code cannot be run on Production',16,1)
    RETURN
END

مشابه رویکرد @@SERVERNAME، این روش نیز از اجرای هر کدی که پس از شرط IF قرار می‌گیرد، جلوگیری می‌کند. تفاوت اصلی در این است که این بررسی بر اساس نسخه SQL Server انجام می‌شود، نه نام واقعی سرور.

بررسی نام پایگاه داده

رویکرد دیگر بررسی نام پایگاه داده است. به عنوان مثال، اگر پایگاه داده‌ای دارید که فقط در سیستم توسعه استفاده می‌شود، می‌توانید وجود آن را بررسی کنید. یا شاید نام پایگاه داده‌ای دارید که همیشه در محیط عملیات با محیط توسعه شما متفاوت است. به عنوان مثال، اگر پایگاه داده تولیدی شما “OprationDB” نام دارد و می‌خواهید از اجرای کد در “OprationDB” جلوگیری کنید، از دستور زیر استفاده خواهید کرد.


IF DB_NAME() = 'OprationDB'
BEGIN
    RAISERROR('This code cannot be run on Production',16,1)
    RETURN
END

این کد از تابع DB_NAME() برای دریافت نام پایگاه داده فعلی استفاده می‌کند. مشابه رویکردهای دیگر، اگر نام پایگاه داده “OprationDB” باشد، کد ادامه پیدا نخواهد کرد.

بررسی نام سرور با استفاده از SERVERPROPERTY(‘ServerName’)

مشابه تابع @@SERVERNAME، می‌توانید از SERVERPROPERTY('ServerName') نیز برای بررسی نام سرور استفاده کنید.


IF SERVERPROPERTY('ServerName') = 'ProductionSQL'
BEGIN
    RAISERROR('This code cannot be run on Production',16,1)
    RETURN
END

این رویکرد مشابه استفاده از @@SERVERNAME است، اما از تابع SERVERPROPERTY بهره می‌برد.

استفاده از یک جدول یا فلگ PRODUCTION اختصاصی

این رویکرد ممکن است در ابتدا پیچیده‌تر به نظر برسد، اما احتمالاً انعطاف‌پذیرترین روش است. ایده این است که یک جدول کوچک در پایگاه داده master یا msdb ایجاد کنید که حاوی یک مقدار برای شناسایی اینکه آیا این سرور عملیاتی است یا خیر، باشد. اگر یک کلاستر (cluster) دارید، احتمالاً می‌خواهید این جدول را در پایگاه داده master ایجاد کنید تا برای تمام اینستنس‌های روی کلاستر در دسترس باشد. یا حتی می‌توانید یک جدول اختصاصی برای این منظور در هر پایگاه داده استفاده کنید.


USE master
GO
CREATE TABLE dbo.ProductionFlag (IsProduction bit)
GO
INSERT INTO dbo.ProductionFlag (IsProduction) VALUES (1)
GO

پس از تنظیم این موارد، می‌توانید به سادگی از این جدول کوئری بگیرید تا مشخص کنید که آیا این سرور عملیاتی است یا خیر. سپس در کد خود می‌توانید به صورت زیر عمل کنید:


IF (SELECT IsProduction FROM master.dbo.ProductionFlag) = 1
BEGIN
    RAISERROR('This code cannot be run on Production',16,1)
    RETURN
END

مزیت این رویکرد این است که می‌توانید یک اسکریپت واحد داشته باشید که این جدول را در تمام سرورهای شما ایجاد می‌کند و فقط فلگ “IsProduction” را برای سرورهای تولیدی خود به 1 و برای سرورهای عملیاتی خود به 0 تغییر دهید. این کار باعث می‌شود کد بسیار عمومی باشد و به شما امکان می‌دهد به راحتی کنترل کنید که کد باید اجرا شود یا خیر.

 

من علی دستجردی‌ام؛ عاشق کار با دیتا، از SQL Server تا بیگ‌دیتا و هوش مصنوعی. دغدغه‌ام کشف ارزش داده‌ها و به‌اشتراک‌گذاری تجربه‌هاست. ✦ رزومه من: alidastjerdi.com ✦

عضویت
منو باخبر کن!!!
guest
نام
ایمیل

0 دیدگاه
Inline Feedbacks
دیدن تمامی کامنتها

فوتر سایت

ورود به سایت

sqlyar

هنوز عضو نیستید؟

ورود به سایت

هنوز تبت نام نکردید ؟