Sp changedbowner: примеры (SQL)

Смена владельца базы данных через sp_changedbowner
Раздел: Системные административные функции, Безопасность
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 для смены владельца у нескольких пользовательских баз данных, исключая системные.

Пример 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.

Пример sql
BEGIN TRY
    USE MyDatabase;
    EXEC sp_changedbowner 'sa';
    PRINT 'Владелец успешно изменен.';
END TRY
BEGIN CATCH
    PRINT 'Ошибка: ' + ERROR_MESSAGE();
END CATCH
Владелец успешно изменен.

Проверка текущего владельца базы данных перед выполнением смены.

Пример sql
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.';
Команда выполнена успешно.

MS SQL sp_changedbowner function comments

En
Sp changedbowner Changes the owner of the current database