اگر هنگام اتصال به SQL Server از طریق SSMS یا هر برنامهی دیگری با پیام Login failed for user '...' روبهرو شدهای، خبر خوب این است که این یکی از رایجترین و قابلرفعترین خطاهای SQL Server است. در این راهنما قدمبهقدم علت اصلی خطا را پیدا میکنیم و آن را هم از طریق SSMS (رابط گرافیکی) و هم با T-SQL رفع میکنیم.
Error: 18456 همراه است. مهمترین سرنخ برای پیدا کردن علت واقعی، عدد State است که در ادامه توضیح میدهیم.این خطا زمانی رخ میدهد که SQL Server هویت کاربری که قصد اتصال دارد را تأیید نمیکند. به زبان ساده، سرور میگوید: «کسی که پشت این نامکاربری/رمزعبور یا این حساب ویندوزی ایستاده، مجاز به ورود نیست.» این خطا میتواند در سطح Login (احراز هویت در سطح سرور) یا در مرحلهی نگاشت آن Login به یک User در پایگاهدادهی مقصد رخ دهد.
وقتی خطا را در SQL Server Error Log میبینی (نه در پیام کلاینت، چون به دلایل امنیتی جزئیات کامل فقط در لاگ سرور ثبت میشود)، یک عدد State کنار آن هست که دقیقاً علت را مشخص میکند:
| State | معنی |
|---|---|
| State 5 | Login (نام کاربری) اصلاً وجود ندارد. |
| State 8 | رمز عبور اشتباه وارد شده است. |
| State 7 / 11 / 12 | Login معتبر است، اما دسترسی رد شده (مثلاً غیرفعال بودن یا محدودیت سطح دسترسی). |
| State 13 | سرویس SQL Server در حال Shutdown است. |
| State 18 | رمز عبور منقضی شده و باید تغییر کند. |
| State 38 / 40 | خطا در دسترسی به پایگاهدادهی پیشفرض تعریفشده برای آن Login. |
برای دیدن این عدد باید Error Log سرور را از مسیر SSMS → Management → SQL Server Logs باز کنی؛ خودِ کلاینت (مثلاً پیام خطای SSMS) این جزئیات را نشان نمیدهد.
در ادامه رایجترین سناریو را قدمبهقدم در SQL Server Management Studio رفع میکنیم: فعالسازی Mixed Mode Authentication، فعالکردن یک Login قفلشده یا غیرفعال، تنظیم مجدد رمز عبور، و نگاشت آن به یک پایگاهداده.
ابتدا در Object Explorer، روی نام سرور راستکلیک کن و Properties را بزن، سپس صفحهی Security را باز کن:
مسیر: Object Explorer → Security → Logins، روی Login موردنظر راستکلیک کن و Properties را انتخاب کن، سپس به تب Status برو:
اگر گزینهی Login is locked out فعال بود یا وضعیت Login روی Disabled بود، همینجا آن را به Enabled تغییر بده و OK را بزن.
در همان پنجرهی Properties، به تب General برگرد و رمز جدید را در دو فیلد Password و Confirm password وارد کن. اگر Policy رمز عبور شرکت فعال است، تیک Enforce password policy را برحسب نیاز تنظیم کن.
در تب User Mapping، پایگاهدادهی موردنظر را تیک بزن تا SQL Server یک User متناظر برایش بسازد، و در بخش پایین، نقشهای (Role) لازم مثل db_datareader یا db_datawriter را انتخاب کن:
اگر ترجیح میدهی بهجای رابط گرافیکی مستقیم از کوئری استفاده کنی، همهی مراحل بالا معادل T-SQL هم دارند:
-- فعال کردن یک Login غیرفعال ALTER LOGIN ali_app ENABLE; -- تنظیم مجدد رمز عبور (بدون بررسی رمز قبلی) ALTER LOGIN ali_app WITH PASSWORD = N'N3wStr0ngP@ss!'; -- خارج کردن Login از حالت قفلشده (Unlock) ALTER LOGIN ali_app WITH PASSWORD = N'N3wStr0ngP@ss!' UNLOCK; -- ساخت User متناظر در پایگاهدادهی مقصد و نگاشت به Login USE ShopDB; CREATE USER ali_app FOR LOGIN ali_app; -- دادن دسترسی خواندن به آن User ALTER ROLE db_datareader ADD MEMBER ali_app;
| بررسی کن | مسیر |
|---|---|
| نام کاربری/رمز عبور درست است؟ | وارد کردن مجدد و دقت به Caps Lock |
| Mixed Mode Authentication فعال است؟ | Server Properties → Security |
| سرویس بعد از تغییر Authentication ریاستارت شده؟ | SQL Server Configuration Manager |
| Login فعال (Enabled) و قفلنشده است؟ | Login Properties → Status |
| Login به پایگاهدادهی مقصد نگاشت شده؟ | Login Properties → User Mapping |
| عدد State در Error Log چیست؟ | Management → SQL Server Logs |
خطای Login failed for user تقریباً همیشه یکی از این چند علت را دارد: اطلاعات ورود اشتباه، غیرفعالبودن SQL Authentication، غیرفعال یا قفلبودن خودِ Login، یا نبودِ نگاشت به یک User در پایگاهدادهی مقصد. با نگاهکردن به عدد State در Error Log و دنبالکردن مراحل بالا، تقریباً همیشه میتوانی این مشکل را در کمتر از چند دقیقه رفع کنی.
برای درک عمیقتر مفاهیم امنیتی SQL Server، درسهای Logins، Users، Roles و Permissions را در دورهی SQLFarsi دنبال کن.
فصل امنیت دورهی SQLFarsi، Login، User، Role و Permission را از پایه توضیح میدهد.
شروع فصل امنیت