MSSQL Error 15405: Cannot use the special principal — решение ошибки
- Ошибка
Msg 15405, Level 16, State 1: Cannot use the special principal '%.*ls'. - Скрипты развертывания прав или ролей для 1С завершаются аварийно при попытке изменения системных субъектов безопасности.
- Попытка удаления или переназначения ролей
guest,dbo,sysилиINFORMATION_SCHEMA.
1. Идентификация запрещенных специальных учетных записей
SQL Server запрещает выполнять операции DROP, CREATE или явный DENY над зарезервированными субъектами:
dbo(Database Owner)guestINFORMATION_SCHEMAsys- Серверные фиксированные роли (
sysadmin,publicи др.)
2. Корректная смена владельца базы вместо изменения субъекта dbo
-- НЕПРАВИЛЬНО: ALTER USER dbo WITH LOGIN = new_login;
-- ПРАВИЛЬНО: смена владельца всей базы через ALTER AUTHORIZATION
ALTER AUTHORIZATION ON DATABASE::your_1c_db TO [sa];3. Корректное отключение гостевого доступа (guest)
Учетную запись guest нельзя удалить, но можно отозвать разрешение на подключение к базе 1С:
USE your_1c_db;
GO
REVOKE CONNECT FROM guest;4. Исправление скриптов генерации прав для пользователей 1С
Исключите специальные учетные записи из скриптов пакетного назначения прав:
SELECT name FROM sys.database_principals
WHERE principal_id > 4
AND name NOT IN ('guest', 'INFORMATION_SCHEMA', 'sys', 'public'); Частые вопросы (FAQ)
Почему нельзя удалить учетную запись INFORMATION_SCHEMA?
INFORMATION_SCHEMA и sys являются внутренними системными схемами стандарта ANSI SQL, используемыми метаданными движка для генерации системных представлений.
Как переназначить права, если процесс требует владения от имени dbo?
Назначьте нужного пользователя владельцем всей базы данных через ALTER AUTHORIZATION ON DATABASE, и он автоматически станет dbo внутри этой базы.
Можно ли отключить пользователя guest в базе master?
Нет, в системных базах master, msdb и tempdb гостевой доступ (guest) отключить нельзя, так как это нарушит внутреннюю работу ядра СУБД.
Почему скрипт миграции пользователей 1С выдает ошибку 15405?
Скрипт содержит слепую выборку из sys.database_principals без фильтрации principal_id <= 4, пытаясь выполнить DROP USER для системных сущностей.