将SqlServer(2008)命名实例迁移到模式

时间:2011-03-11 15:43:04

标签: sql-server vb.net schema instance

我目前有80位客户的软件。 当数据不同时,它们共享相同的数据库结构。

我们为每位客户提供了5个数据库。

今天,我们已经命名了实例,因此程序正在访问Bdd,例如:

  • 连接到127.0.0.1/CUSTOMER1
  • 从base1..table1
  • 中选择*

现在,我们需要改变,我们有很多实例。

这个想法是拥有唯一的SQLSERVER实例,显然我想避免更改代码(VB.NET)。

只是尝试使用模式和用户,似乎是一个选项,但由于模式在数据库下,因此无法使其工作:

  • 以特定用户(customer1)
  • 连接到127.0.0.1/GLOBAL_INSTANCE
  • select * from base1..table1 - >错误@此点

当这项工作时:

  • 以特定用户(customer1)
  • 连接到127.0.0.1/GLOBAL_INSTANCE
  • 使用Base1
  • 从base1..table1 /中选择*或从table1
  • 中选择*

我可以轻松编写一些用户或模式创建脚本,并为所有客户更改连接字符串,但我无法真正更改所有请求:数量庞大。

感谢您的回应或想法。

1 个答案:

答案 0 :(得分:1)

这是使用模式的高级视图。脚本创建一个测试数据库,在其中创建两个用户(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获得许可。