Sp changedbowner: примеры (SQL)
sp_changedbowner([@loginame =] 'login'): intОписание функции sp_changedbowner
Системная хранимая процедура sp_changedbowner в Microsoft SQL Server используется для изменения владельца текущей базы данных. Эта операция может потребоваться при переносе базы, восстановлении из резервной копии или в целях безопасности для назначения ответственного. Выполнение разрешено членам предопределенной роли сервера sysadmin или пользователям с разрешением TAKE OWNERSHIP на базу данных.
Процедура принимает следующие аргументы:
- @loginame (sysname, без значения по умолчанию): Имя входа (логин) SQL Server, который станет новым владельцем базы. Если параметр равен NULL, владельцем становится текущий пользователь, выполняющий процедуру.
- @map (bit, со значением по умолчанию false): Устаревший параметр, сохраненный для обратной совместимости. Если передано значение true, процедура пытается сопоставить старых пользователей базы данных с новым владельцем. В современных версиях SQL Server этот параметр игнорируется, и сопоставление выполняется автоматически.
Процедура возвращает целочисленное значение: 0 при успешном выполнении и 1 в случае возникновения ошибки.
Примеры использования sp_changedbowner
Изменение владельца базы данных на конкретное имя входа.
USE MyDatabase;
EXEC sp_changedbowner 'sa';Команда выполнена успешно.
Назначение текущего пользователя владельцем базы данных.
USE MyDatabase;
EXEC sp_changedbowner;Команда выполнена успешно.
Попытка назначить несуществующего пользователя приводит к ошибке.
USE MyDatabase;
EXEC sp_changedbowner 'NonExistentLogin';Сообщение 15007, уровень 16, состояние 1, процедура sp_changedbowner, строка 50 Логин 'NonExistentLogin' не существует.
Альтернативные функции в MS SQL
В современных версиях SQL Server рекомендуется использовать оператор ALTER AUTHORIZATION. Он предоставляет более унифицированный способ управления владельцами различных объектов (баз данных, схем, объектов).
USE MyDatabase;
ALTER AUTHORIZATION ON DATABASE::MyDatabase TO sa;Ключевое отличие: ALTER AUTHORIZATION позволяет явно указать тип объекта (например, DATABASE), что делает синтаксис более понятным. sp_changedbowner работает только в контексте текущей базы данных, в то время как ALTER AUTHORIZATION может выполняться из другой базы, если указано полное имя целевой.
Аналоги в других СУБД
PostgreSQL: Для смены владельца базы данных используется команда ALTER DATABASE.
ALTER DATABASE my_database OWNER TO new_owner;Oracle: Понятие "владелец базы данных" отсутствует. Аналогичную роль выполняет схема (пользователь). Для передачи прав на все объекты схемы используется экспорт/импорт или создание нового пользователя.
MySQL: Нет прямой команды. Владелец базы данных ассоциируется с пользователем, создавшим ее. Для изменения требуется повторное создание БД с указанием другого пользователя или сложное манипулирование привилегиями.
SQLite: Концепция владельца базы данных отсутствует, доступ контролируется правами файловой системы.
Sybase ASE: Используется системная процедура sp_changedbowner, аналогичная MS SQL, что обусловлено общими корнями.
Типичные ошибки
Недостаточные права для выполнения процедуры.
USE MyDatabase;
EXEC sp_changedbowner 'SomeLogin'; -- Выполняется не членом sysadminСообщение 15247, уровень 16, состояние 1, процедура sp_changedbowner, строка 50 Пользователь не имеет разрешения на выполнение этой процедуры.
Попытка изменить владельца у системной базы данных.
USE master;
EXEC sp_changedbowner 'sa';Сообщение 50501, уровень 16, состояние 1, процедура sp_changedbowner, строка 50 Невозможно изменить владельца системных баз данных.
Новый владелец уже является пользователем в базе данных под другим именем.
-- Логин 'NewOwner' уже сопоставлен с пользователем 'OldUser' в базе.
USE MyDatabase;
EXEC sp_changedbowner 'NewOwner';Сообщение 15055, уровень 16, состояние 1, процедура sp_changedbowner, строка 50 Имя входа уже имеет учетную запись в базе данных под другим именем пользователя.
Изменения в последних версиях
Начиная с SQL Server 2005, корпорация Майкрософт рекомендует использовать инструкцию ALTER AUTHORIZATION вместо sp_changedbowner. Сама процедура sp_changedbowner сохранена для обеспечения обратной совместимости, но в будущих версиях может быть удалена. Параметр @map перестал оказывать какое-либо влияние, сопоставление пользователей выполняется автоматически.
Расширенные примеры
Использование в динамическом SQL для смены владельца у нескольких пользовательских баз данных, исключая системные.
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N'';
SELECT @SQL = @SQL +
'USE [' + name + ']; EXEC sp_changedbowner ''sa''; '
FROM sys.databases
WHERE database_id > 4 AND state_desc = 'ONLINE';
EXEC sp_executesql @SQL;Команды выполнены для каждой базы данных.
Обработка возможных ошибок с помощью TRY...CATCH.
BEGIN TRY
USE MyDatabase;
EXEC sp_changedbowner 'sa';
PRINT 'Владелец успешно изменен.';
END TRY
BEGIN CATCH
PRINT 'Ошибка: ' + ERROR_MESSAGE();
END CATCHВладелец успешно изменен.
Проверка текущего владельца базы данных перед выполнением смены.
USE MyDatabase;
DECLARE @CurrentOwner SYSNAME;
SELECT @CurrentOwner = SUSER_SNAME(owner_sid) FROM sys.databases WHERE name = DB_NAME();
IF @CurrentOwner <> 'sa'
EXEC sp_changedbowner 'sa';
ELSE
PRINT 'Владелец уже является sa.';Команда выполнена успешно.