Задать вопрос
Casper-SC
@Casper-SC
Программист (.NET)

Выполнение DML запроса после DDL. Как это провернуть?

Текст ошибки:
Msg 2760, Level 16, State 1, Line 588
The specified schema name "copy" either does not exist or you do not have permission to use it.
Msg 208, Level 16, State 1, Line 607
Invalid object name 'copy.REPORTS'.
Msg 15151, Level 16, State 1, Line 664
Cannot find the object 'REPORTS', because it does not exist or you do not have permission.
Msg 15151, Level 16, State 1, Line 665
Cannot drop the schema 'copy', because it does not exist or you do not have permission.


Патчи запускаются из командной строки с помощью "sqlcmd"

В чём суть: Создаём схему "copy", создаём таблицу, которая уже есть в бд, но в схеме dbo. Далее из dbo.REPORTS получаем данные, модифицируем (там удаление дубликатов со сложением некоторых значений). Помещаем модифицированные данные в copy.REPORTS. Далее удаляем dbo.REPORTS и у copy.REPORTS меняем схему на dbo.

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

При выполнении этого запроса, когда он запущен из командной строки (это часть патча к БД), то после создания схемы, дальше вылетает ошибка, что такой схемы нет или нет прав на её создание. Как это фиксить? Скрипт запускается из под Service administrator (sa).

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'copy')
  EXECUTE( N'CREATE SCHEMA copy')
GO

IF OBJECT_ID('copy.REPORTS', 'U') IS NOT NULL
  DROP TABLE copy.REPORTS;
GO

-- Таблица реальная немного другая, это от фонаря
CREATE TABLE copy.REPORTS (
  REPORT_DATE DATE NOT NULL
 ,REPORT_ID INT NOT NULL
 ,CONSTRAINT PK_REPORTS PRIMARY KEY CLUSTERED (REPORT_DATE, REPORT_ID)
) ON [PRIMARY]
GO

-- ЗАПРОС МОДИФИЦИРУЮЩИЙ ДАННЫЕ ИЗ dbo.REPORTS и помещающий их в copy.REPORTS

DROP TABLE dbo.REPORTS;  
GO

ALTER SCHEMA dbo TRANSFER copy.REPORTS
GO

EXECUTE( N'DROP SCHEMA copy');
  • Вопрос задан
  • 274 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Casper-SC
@Casper-SC Автор вопроса
Программист (.NET)
Оказалось, что проблема была в том, что весь вышеприведённый код выполнялся после изменения хранимой процеруды (ALTER PROCEDURE), и после кода этого самого изменения не стоял оператор GO. Вот и вся проблема, а так код рабочий.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы