Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

MSSQL_ORPHANED_USERS 1С:Предприятие и СУБД

Восстановление потерянных пользователей (Orphaned Users) в MSSQL после RESTORE

Обновлено: 26.08.2026 · Официальная документация ↗
  • Пользователи или сервисные учетные записи 1С не могут авторизоваться в восстановленной базе с ошибкой Login failed for user (Error 18456).
  • В системной таблице sys.database_principals пользователь существует, но его SID не совпадает с SID в sys.server_principals инстанса.
  • Невозможно пересоздать пользователя базы, так как объект с таким именем уже зарегистрирован.

1. Поиск изолированных пользователей (Orphaned Users)

USE [TradeEnterprise];
GO

-- Поиск пользователей базы без сопоставленного серверного логина
SELECT 
    dp.name AS DatabaseUserName,
    dp.type_desc,
    dp.sid AS DatabaseSID
FROM sys.database_principals dp
LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid
WHERE sp.sid IS NULL 
  AND dp.type IN ('S', 'U', 'G') -- SQL, Windows User, Windows Group
  AND dp.authentication_type = 1; -- INSTANCE authentication

2. Автоматическое сопоставление пользователя с существующим серверным логином

Используйте современный синтаксис ALTER USER:

USE [TradeEnterprise];
GO

-- Привязка существующего пользователя базы к одноименному логину инстанса
ALTER USER [user_1c] WITH LOGIN = [user_1c];
GO

3. Массовое исправление всех изолированных пользователей через курсор

USE [TradeEnterprise];
GO

DECLARE @username VARCHAR(100);
DECLARE user_cursor CURSOR FOR
    SELECT dp.name
    FROM sys.database_principals dp
    LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid
    WHERE sp.sid IS NULL AND dp.type = 'S' AND dp.name NOT IN ('guest', 'INFORMATION_SCHEMA', 'sys');

OPEN user_cursor;
FETCH NEXT FROM user_cursor INTO @username;

WHILE @@FETCH_STATUS = 0
BEGIN
    IF EXISTS (SELECT 1 FROM sys.server_principals WHERE name = @username)
    BEGIN
        EXEC('ALTER USER [' + @username + '] WITH LOGIN = [' + @username + '];');
        PRINT 'Fixed user: ' + @username;
    END
    ELSE
    BEGIN
        PRINT 'Server Login not found for user: ' + @username;
    END
    FETCH NEXT FROM user_cursor INTO @username;
END;

CLOSE user_cursor;
DEALLOCATE user_cursor;
💡 Практика специалистов: При регулярной миграции баз 1С между серверами используйте базы данных с автономными пользователями (Contained Database Users) — их учетные данные хранятся целиком внутри самой базы данных и не требуют привязки к серверным логинам master.

Частые вопросы (FAQ)

Почему возникают Orphaned Users при переносе базы на другой сервер?

Права внутри базы привязаны к глобальному идентификатору безопасности (SID). При создании одноименного логина на новом сервере ему присваивается новый уникальный GUID/SID, не совпадающий с сохраненным внутри файла базы.

Почему процедура sp_change_users_login считается устаревшей?

Хранимая процедура sp_change_users_login объявлена как Deprecated начиная с SQL Server 2012. Ее официальной заменой является инструкция ALTER USER ... WITH LOGIN.

Как перенести серверные логины с сохранением оригинальных SID и паролей?

Используйте официальную хранимую процедуру sp_help_revlogin от Microsoft, которая генерирует T-SQL скрипт создания логинов с параметрами SID и HASHED паролем.

Что делать, если учетная запись базы является владельцем схемы (Schema Owner)?

Перед удалением или сменой прав передайте владение схемой пользователю dbo: ALTER AUTHORIZATION ON SCHEMA::[SchemaName] TO [dbo];.

Полезные материалы
Рекомендуем