【问题标题】:Migrating SqlServer(2008) named instances to schemas将 SqlServer(2008) 命名实例迁移到模式
【发布时间】:2023-03-15 13:47:01
【问题描述】:

我目前有一个有 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
  • select * from base1..table1 / 或 select * from table1

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

感谢您的任何回复或想法。

【问题讨论】:

    标签: sql-server vb.net schema instance


    【解决方案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 获得权限。

    【讨论】:

      猜你喜欢
      • 2016-11-23
      • 1970-01-01
      • 2018-10-07
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      相关资源
      最近更新 更多