Обновить таблицы с одинаковыми именами разных схем - PullRequest
1 голос
/ 29 июля 2010

Используя SQL Server и T-SQL, как я могу обновить ВСЕ таблицы таблиц с определенным именем, но разными схемами в одной базе данных?

: Обновление:

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

Я хочу иметь возможность развертывать изменения в таблице во всех схемах. Используя конструктор таблиц SQL Server Management Studio, когда я делаю изменения и сохраняю, это позволяет мне сохранить сценарий, который можно использовать для развертывания этих изменений в другой таблице. Я хочу использовать этот сценарий для всех таблиц с определенным именем во всех схемах.

: обновление 2:

Существует причина, по которой этот запрос заключается в том, что я хочу убедиться, что обновление определенной таблицы в нескольких схемах легко. В будущем мое приложение, несомненно, изменится, и если я увижу, что сложно или неэффективно обновить схемы, я решу использовать что-то еще.

Ниже я попробовал:

DECLARE @update_sql NVARCHAR(max)
DECLARE @table_name VARCHAR(45)

DECLARE c_tables CURSOR FOR
  SELECT t.table_name
    FROM INFORMATION_SCHEMA.TABLES t
   WHERE t.table_name = 'TestTable'
     AND t.table_catalog = 'MyDataBase'

OPEN c_tables
FETCH c_tables INTO @table_name

WHILE @@Fetch_Status = 0
BEGIN

  SET @update_sql = N'ALTER TABLE '+@table_name+' ADD ColumnThree nvarchar(50) NULL'
  EXEC sp_executesql @update_sql

END

CLOSE c_tables
DEALLOCATE c_tables

При выполнении этого генерируется следующая ошибка:

Не удается найти объект "TestTable", так как он не существует или у вас нет прав.

Таблица существует, и я работаю под dbo, который является владельцем схемы.

Я также заметил, что для выполнения запроса требуется некоторое время, даже если в базе данных есть только 7 таблиц и 3 схемы, используемые в этих таблицах. Будет ли эффективнее просто войти в систему с владельцем каждой схемы и запустить общий сценарий? Каждый владелец схемы будет иметь доступ только к своей соответствующей схеме и таблицам.

Ответы [ 2 ]

4 голосов
/ 29 июля 2010

В SQL Server 2005+ вы можете использовать INFORMATION_SCHEMA.TABLES , чтобы получить список таблиц в базе данных:

SELECT t.table_name,
       t.table_schema
  FROM INFORMATION_SCHEMA.TABLES t
 WHERE t.table_name = 'Table_1'
   AND t.table_catalog = 'your_database'

Но вы не указали, какое обновление вам нужно - DML или DDL ...

Обновление

DECLARE @update_sql NVARCHAR(max)
DECLARE @table_name VARCHAR(45)

DECLARE c_tables CURSOR FOR
  SELECT t.table_name
    FROM INFORMATION_SCHEMA.TABLES t
   WHERE t.table_name = 'Table_1'
     AND t.table_catalog = 'your_database'

OPEN c_tables
FETCH c_tables INTO @table_name

WHILE @@Fetch_Status = 0
BEGIN

  SET @update_sql = N'UPDATE @table_name SET ...'
  EXEC sp_executesql @update_sql

  SET @update_sql = N'ALTER TABLE @table_name ...'
  EXEC sp_executesql @update_sql

END

CLOSE c_tables
DEALLOCATE c_tables
3 голосов
/ 29 июля 2010

Вы можете использовать sp_MSforeachtable , если действие будет одинаковым для всех (я бы сначала добавил в скрипты несколько довольно надежных средств обработки ошибок и отката)

exec sp_MSforeachtable 
   '
    if parsename(''?'',1) = ''TargetTableName''
    begin
    update ? set ColumnToUpdate=NewValue;

    execute sp_rename N''?.newname'', N''obsoletename'', ''column'' ;

    alter table ? add newcol int null;

    alter table ? drop column oldcol;
    end'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...