MSSQL Error 15517: Cannot execute as the database principal because it does not exist
- Ошибка
Msg 15517, Level 16, State 1: Cannot execute as the database principal because the principal 'dbo' does not exist, this type of principal cannot be impersonated, or you do not have permission. - Регламентные задания, Service Broker, CDC или планы обслуживания падают сразу после восстановления базы из бэкапа на новом сервере.
- Невозможно открыть свойства базы данных в среде SQL Server Management Studio (SSMS).
1. Проверка текущего владельца базы данных
SELECT name, owner_sid, SUSER_SNAME(owner_sid) AS OwnerLoginName
FROM sys.databases
WHERE name = 'your_1c_db';Если в колонке OwnerLoginName отображается NULL, значит учетная запись, создавшая базу на старом сервере, отсутствует на текущем сервере.
2. Восстановление валидного владельца базы (Fix dbo)
USE your_1c_db;
GO
-- Назначение локального sa владельцем базы
ALTER AUTHORIZATION ON DATABASE::your_1c_db TO [sa];
GO3. Проверка параметров TRUSTWORTHY и контекста EXECUTE AS
-- Включение доверительного контекста (если процедуры используют внешние ресурсы)
ALTER DATABASE your_1c_db SET TRUSTWORTHY ON;4. Проверка и перекомпиляция модулей с конструкцией WITH EXECUTE AS
SELECT o.name, m.definition, m.execute_as_clause
FROM sys.sql_modules m
JOIN sys.objects o ON m.object_id = o.object_id
WHERE m.execute_as_clause IS NOT NULL; Частые вопросы (FAQ)
Почему ошибка 15517 всегда возникает после операции RESTORE базы 1С?
Резервная копия сохраняет оригинальный SID владельца базы. Если на новом экземпляре SQL Server нет логина с таким же SID (например, это был локальный администратор старого сервера), база остается без владельца.
Обязательно ли устанавливать владельцем именно sa?
Не обязательно, но рекомендуется. Владельцем может быть любой валидный серверный логин (Server Principal) с правами sysadmin, который гарантированно не будет удален.
Влияет ли ошибка 15517 на регламентные задания 1С:Предприятие?
Да, встроенные механизмы SQL Server (CDC, фоновые очистки индексов, Service Broker очереди), вызываемые от имени dbo, перестают работать до устранения ошибки.
Как исправить владельца сразу для всех баз данных 1С на сервере?
Используйте курсор по sys.databases: EXEC sp_MSforeachdb 'IF ''?'' NOT IN (''master'',''model'',''msdb'',''tempdb'') ALTER AUTHORIZATION ON DATABASE::[?] TO [sa];'.