Миграция SqlServer (2008) именованных экземпляров в схемы - PullRequest
3 голосов
/ 11 марта 2011

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

Мы получили 5 баз данных для каждого клиента.

Сегодня мы назвали экземпляры, поэтому программа обращается к Bdd с помощью чего-то вроде:

  • Подключение к 127.0.0.1/CUSTOMER1
  • select * from base1..table1

Теперь нам нужно измениться, мы получили много экземпляров.

Идея состоит в том, чтобы иметь уникальный экземпляр SQLSERVER, очевидно, я хочу избежать изменения кода (VB.NET).

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

  • Подключиться к 127.0.0.1/GLOBAL_INSTANCE как определенный пользователь (customer1)
  • выбрать * из базы1..table1 -> error @ this point

Когда ЭТО работает:

  • Подключиться к 127.0.0.1/GLOBAL_INSTANCE как определенный пользователь (customer1)
  • ИспользоватьBase1
  • выберите * из base1..table1 / или выберите * из таблицы1

Я могу легко написать сценарий для создания какого-либо пользователя или схемы и изменить строки подключения для всех клиентов, но я не могу изменить все запросы: огромное количество.

Спасибо за любой ответ или идею.

1 Ответ

1 голос
/ 11 марта 2011

Вот высокоуровневое представление об использовании схем. Скрипты создают тестовую базу данных, создают в ней двух пользователей (T1 и T2) и две схемы (S1 и S2). Затем он «регистрируется» под каждым пользователем и создает таблицы под этим пользователем и, следовательно, привязывается к этой схеме, а затем вставляет некоторые данные и считывает их. Затем он «выходит из системы» (REVERT) и выбирает из обеих таблиц, используя имена, соответствующие схеме. Если вы закомментируете удаленные части, вы можете войти в систему как один из пользователей и выполнить неквалифицированную SELECT * FROM Test, и она автоматически найдет правильную схему.

Запустите приведенный ниже код с учетной записью sa или другой учетной записи администратора (у которой есть права на создание таблиц, логинов, схем и разрешений для GRANT)

--//Make sure we're using the correct credentials, this undoes any calls to EXECUTE AS ...
REVERT
GO

--//Switch to the master database
USE MASTER
GO

--//Create our test database
CREATE DATABASE Tester
GO

--//Swtich to the test database
USE Tester
GO

--//CREATE two logins, T1 and T2
CREATE LOGIN T1 WITH PASSWORD = 'T1'
CREATE USER T1 WITH DEFAULT_SCHEMA = S1

CREATE LOGIN T2 WITH PASSWORD = 'T2'
CREATE USER T2 WITH DEFAULT_SCHEMA = S2
GO

--//Give them permission to create tables
GRANT CREATE TABLE to T1
GRANT CREATE TABLE to T2
GO

--//Create two schemas, S1 and S2
CREATE SCHEMA S1 AUTHORIZATION T1
GO
CREATE SCHEMA S2 AUTHORIZATION T2
GO

--//Switch context to the T1 user
EXECUTE AS USER = 'T1'
GO

--//Create our table
CREATE TABLE Test
(
Col1 varChar(255)
)
GO

--//Insert some data
INSERT INTO Test VALUES ('This is from schema 1')
GO

--//Displays schema 1
SELECT * FROM Test

--//Switch back to the currently logged in user
REVERT
GO

--//Switch context to the T2 user
EXECUTE AS USER = 'T2'
GO

--//Create our table
CREATE TABLE Test
(
Col1 varChar(255)
)
GO

--//Insert some data
INSERT INTO Test VALUES ('This is from schema 2')
GO

--//Displays schema 2
SELECT * FROM Test
GO

--//Switch back to the currently logged in user
REVERT
GO

--//As the main user now select from both tables by schema-prefix
SELECT * FROM S1.Test
UNION
SELECT * FROM S2.Test


--//Cleanup everything that we just made
DROP TABLE S1.Test
DROP TABLE S2.Test

DROP SCHEMA S1
DROP SCHEMA S2

DROP LOGIN T1
DROP LOGIN T2
GO

USE MASTER
GO

DROP DATABASE Tester
GO

Вам не нужно GRANT разрешение на создание таблицы для входа в систему, если вы не хотите, вместо этого вы можете просто использовать учетную запись более высокого уровня и делать CREATE TABLE S1.Test(...). Мне просто легче делать это таким образом, чтобы мне не приходилось постоянно все квалифицировать. После того, как я создаю вещи, я могу REVOKE получить разрешение.

...