جلوگیری از اجرای ناخواسته کد 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 تغییر دهید. این کار باعث میشود کد بسیار عمومی باشد و به شما امکان میدهد به راحتی کنترل کنید که کد باید اجرا شود یا خیر.