SQL Server ИЗМЕНИТЬ СХЕМУ

В этом руководстве вы узнаете, как использовать оператор SQL Server ALTER SCHEMA для переноса защищаемого объекта из одной схемы в другую.

Обзор оператора SQL Server ALTER SCHEMA

Оператор ALTER SCHEMA позволяет переносить защищаемый объект из одной схемы в другую в пределах одной и той же базы данных.

Обратите внимание, что защищаемый объект — это ресурс, доступ к которому контролирует система авторизации Database Engine. Например, таблица — это защищаемый объект.

Ниже показан синтаксис оператора ALTER SCHEMA:

ALTER SCHEMA target_schema_name   
    TRANSFER [ entity_type :: ] securable_name;

В этом синтаксисе:

  • target_schema_name — имя схемы в текущей базе данных, в которую вы хотите переместить объект. Обратите внимание, что это не может быть SYS или INFORMATION_SCHEMA.
  • entity_type может быть Object, Type или XML Schema Collection. По умолчанию Object. entity_type представляет класс сущности, для которой изменяется владелец.
  • object_name — это имя защищаемого объекта, который вы хотите переместить в target_schema_name.

Если вы перемещаете хранимую процедуру, функцию, представление или триггер, SQL Server не изменит имя схемы этих защищаемых объектов. Поэтому рекомендуется удалить и заново создать эти объекты в новой схеме вместо использования оператора ALTER SCHEMA для перемещения.

Если вы перемещаете объект, например, таблицу или синоним, SQL Server не будет автоматически обновлять ссылки для этих объектов. Вам необходимо вручную изменить ссылки, чтобы отразить новое имя схемы.

Например, если вы перемещаете таблицу, на которую ссылается хранимая процедура, вам необходимо изменить хранимую процедуру, чтобы она отражала новое имя схемы.

Пример оператора SQL Server ALTER SCHEMA

Сначала создайте новую таблицу с именем offices в схеме dbo:

CREATE TABLE dbo.offices
(
    office_id      INT
    PRIMARY KEY IDENTITY, 
    office_name    NVARCHAR(40) NOT NULL, 
    office_address NVARCHAR(255) NOT NULL, 
    phone          VARCHAR(20),
);

Далее вставьте несколько строк в таблицу dob.offices:

INSERT INTO 
    dbo.offices(office_name, office_address)
VALUES
   ('Silicon Valley','400 North 1st Street, San Jose, CA 95130'),
   ('Sacramento','1070 River Dr., Sacramento, CA 95820');

Затем создайте хранимую процедуру, которая находит офис по идентификатору:

CREATE PROC usp_get_office_by_id(
    @id INT
) AS
BEGIN
    SELECT 
        * 
    FROM 
        dbo.offices
    WHERE 
        office_id = @id;
END;

После этого перенесите эту таблицу dbo.offices в схему продаж:

ALTER SCHEMA sales TRANSFER OBJECT::dbo.offices;  

Если вы выполните хранимую процедуру usp_get_office_by_id:

exec usp_get_office_by_id @id=1;

SQL Server выдаст ошибку:

Msg 208, Level 16, State 1, Procedure usp_get_office_by_id, Line 5 [Batch Start Line 30]
Invalid object name 'dbo.offices'.

Наконец, вручную измените dbo.offices на sales.offices внутри хранимой процедуры, чтобы отразить новую схему:

CREATE PROC usp_get_office_by_id(
    @id INT
) AS
BEGIN
    SELECT 
        * 
    FROM 
        sales.offices
    WHERE 
        office_id = @id;
END;

Краткое содержание

  • Используйте оператор SQL Server ALTER SCHEMA для переноса защищаемого объекта из одной схемы в другую в пределах одной и той же базы данных.
Мирослав С.

Автор статей, ИБ-специалист