عنوان:

‫تمرین کوئری نویسی: یافتن آدرس‌های ایمیل


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۱/۰۷ ۰۸:۴۳
آدرس: www.dntips.ir
مقدمه
در دنیای توسعه نرم‌افزار، به‌ویژه در اکوسیستم دات‌نت مایکروسافت (Microsoft .NET Framework)، مدیریت داده‌ها یکی از مهم‌ترین وظایف توسعه‌دهندگان است. اطلاعات حساسی مانند آدرس‌های ایمیل، شماره‌های تلفن یا سایر داده‌های شناسایی شخصی (Personally Identifiable Information - PII) اغلب به‌طور ناخواسته در ستون‌هایی از پایگاه داده ذخیره می‌شوند که برای این منظور طراحی نشده‌اند. این موضوع می‌تواند چالش‌های امنیتی و عملکردی را به همراه داشته باشد. در این مقاله، با استفاده از ابزارها و تکنیک‌های SQL Server، روشی برای شناسایی این‌گونه داده‌ها و بهبود فرآیندهای توسعه بررسی می‌شود. هدف این است که توسعه‌دهندگان دات‌نت بتوانند با دیدی عمیق‌تر به بهینه‌سازی کوئری‌ها (Queries) و مدیریت پایگاه داده بپردازند. این مطلب بر اساس تحلیل یک تمرین واقعی در حوزه برنامه‌نویسی پایگاه داده شکل گرفته و با مثال‌های عملی همراه است.

اهمیت شناسایی اطلاعات حساس
داده‌های حساس مانند آدرس‌های ایمیل، اگر در ستون‌های نامناسب مانند ستون Location در یک جدول کاربران ذخیره شوند، می‌توانند مشکلات متعددی ایجاد کنند. از منظر امنیتی، این داده‌ها ممکن است به‌راحتی در دسترس افراد غیرمجاز قرار گیرند. از نظر عملکردی نیز، جستجو برای یافتن چنین اطلاعاتی بدون ساختار مشخص، کوئری‌های پیچیده و کندی را به دنبال دارد. توسعه‌دهندگان دات‌نت که با SQL Server کار می‌کنند، باید بتوانند این موارد را به‌سرعت شناسایی کرده و راه‌حل‌هایی برای اصلاح آن‌ها ارائه دهند.
یکی از سناریوهای رایج این است که کاربران به‌جای وارد کردن اطلاعات در فیلدهای مشخص‌شده (مانند EmailAddress)، آن‌ها را در ستون‌های متنی آزاد مانند Location وارد کنند. برای مثال، ممکن است به‌جای "Tehran, Iran"، چیزی مانند "user@example.com" در این ستون ثبت شود. این ناسازگاری نیازمند کوئری‌هایی است که بتوانند الگوهای ایمیل را تشخیص دهند.

رویکرد اولیه: جستجوی ساده با LIKE
برای شروع، می‌توان از یک کوئری ساده با عملگر LIKE در SQL Server استفاده کرد تا ستون‌هایی که ممکن است حاوی آدرس ایمیل باشند، شناسایی شوند. مثال زیر یک جستجوی اولیه را نشان می‌دهد:
SELECT TOP 100 DisplayName, Location
FROM dbo.Users
WHERE Location LIKE '%@%.%';
این کوئری به دنبال رشته‌هایی می‌گردد که شامل کاراکتر "@" و حداقل یک نقطه (.) باشند—الگویی که معمولاً در آدرس‌های ایمیل دیده می‌شود. با این حال، این روش محدودیت‌هایی دارد. برای نمونه، ممکن است مواردی مانند "Meeting@3.pm" را نیز به اشتباه به‌عنوان ایمیل تشخیص دهد. همچنین، از نظر عملکرد، اگر جدول بزرگ باشد و ایندکس (Index) مناسبی وجود نداشته باشد، این کوئری می‌تواند کند عمل کند، زیرا SQL Server باید کل جدول را اسکن کند (Table Scan).

بهبود دقت با REGEX در SQL Server
در نسخه‌های جدیدتر SQL Server (مانند SQL Server 2025) و Azure SQL Database، امکان استفاده از عبارات منظم (Regular Expressions - REGEX) فراهم شده است. این قابلیت به توسعه‌دهندگان اجازه می‌دهد الگوهای پیچیده‌تری را برای شناسایی ایمیل‌ها تعریف کنند. به‌عنوان مثال:
SELECT TOP 100 DisplayName, Location
FROM dbo.Users
WHERE REGEXP_LIKE(Location, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');
این کوئری از یک الگوی REGEX استفاده می‌کند که ایمیل‌های معتبر را با دقت بیشتری تشخیص می‌دهد. توضیح الگو به این صورت است:
  • ^[A-Za-z0-9._%+-]+: شروع رشته با حروف، اعداد یا کاراکترهای خاص مجاز در ایمیل.
  • @: وجود کاراکتر "@" اجباری است.
  • [A-Za-z0-9.-]+: دامنه پس از "@" که می‌تواند شامل حروف و اعداد باشد.
  • \.[A-Za-z]{2,}$: پایان با نقطه و حداقل دو حرف (مانند .com یا .org).
با این حال، استفاده از REGEX در SQL Server هنوز در مراحل اولیه است و از نظر عملکرد بهینه نیست. تست‌ها نشان داده‌اند که حتی با وجود ایندکس روی ستون Location، موتور SQL Server ممکن است از آن استفاده نکند و به اسکن کامل جدول روی آورد. این موضوع برای جداول بزرگ می‌تواند زمان‌بر باشد.

بهینه‌سازی عملکرد با ایندکس و جداول موقت
برای بهبود عملکرد، می‌توان از ترکیبی از ایندکس‌گذاری و جداول موقت (Temporary Tables) استفاده کرد. ابتدا یک ایندکس روی ستون Location ایجاد می‌کنیم:
CREATE NONCLUSTERED INDEX IX_Users_Location ON dbo.Users(Location);
سپس، به‌جای اسکن مکرر جدول اصلی، نتایج اولیه را در یک جدول موقت ذخیره کرده و تحلیل دقیق‌تر را روی آن انجام می‌دهیم:
SELECT DisplayName, Location
INTO #TempUsers
FROM dbo.Users
WHERE Location LIKE '%@%.%';

SELECT DisplayName, Location
FROM #TempUsers
WHERE REGEXP_LIKE(Location, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');
این روش دو مزیت دارد:
  1. کاهش بار روی جدول اصلی با محدود کردن داده‌ها در مرحله اول.
  2. اجرای REGEX روی مجموعه داده کوچک‌تر، که زمان پردازش را کاهش می‌دهد.

اعتبارسنجی و رفع مشکلات
پس از شناسایی ردیف‌های مشکل‌دار، باید آن‌ها را اعتبارسنجی کنیم. برای مثال، می‌توان یک ستون جدید به نام IsEmailInLocation اضافه کرد و با استفاده از کوئری زیر آن را پر کرد:
ALTER TABLE dbo.Users ADD IsEmailInLocation BIT;

UPDATE dbo.Users
SET IsEmailInLocation = CASE 
    WHEN REGEXP_LIKE(Location, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$') THEN 1 
    ELSE 0 
END;
این ستون به توسعه‌دهندگان دات‌نت کمک می‌کند تا در برنامه‌های خود، کاربرانی که اطلاعات را در مکان اشتباه وارد کرده‌اند، شناسایی کرده و برای انتقال داده‌ها به ستون مناسب (مانند EmailAddress) اقدام کنند.

بهترین روش‌ها در توسعه دات‌نت
توسعه‌دهندگان دات‌نت می‌توانند از این درس‌ها در لایه برنامه (Application Layer) نیز استفاده کنند. به‌جای تکیه صرف بر پایگاه داده، می‌توان اعتبارسنجی ورودی‌ها را در سطح رابط کاربری (UI) یا سرویس‌ها با استفاده از کتابخانه‌هایی مانند System.Text.RegularExpressions در C# انجام داد. این کار از ورود داده‌های ناسازگار به پایگاه داده جلوگیری می‌کند. برای مثال:
using System.Text.RegularExpressions;

public bool IsValidEmail(string input)
{
    string pattern = @"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$";
    return Regex.IsMatch(input, pattern);
}
این رویکرد، بار پردازشی را از SQL Server به برنامه منتقل کرده و عملکرد کلی سیستم را بهبود می‌بخشد.

نتیجه‌گیری
شناسایی و مدیریت اطلاعات حساس در پایگاه داده‌ها نیازمند ترکیبی از ابزارهای SQL Server و بهترین روش‌های توسعه در دات‌نت است. استفاده از کوئری‌های ساده با LIKE می‌تواند نقطه شروع باشد، اما برای دقت و عملکرد بهتر، ابزارهایی مانند REGEX، ایندکس‌ها و جداول موقت ضروری هستند. توسعه‌دهندگان باید ابتدا از ورود داده‌های ناسازگار در لایه برنامه جلوگیری کنند و سپس با کوئری‌های بهینه، مشکلات موجود را شناسایی و رفع کنند. این فرآیند نه‌تنها امنیت داده‌ها را افزایش می‌دهد، بلکه عملکرد سیستم را نیز بهبود می‌بخشد.


مشاهده مطلب اصلی