gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:48:03 24 4
gpt4 key购买 nike

我目前有一个有 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

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

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

    最佳答案

    这是使用模式的高级 View 。这些脚本创建了一个测试数据库,在其中创建了两个用户(T1 和 T2)和两个模式(S1 和 S2)。然后它以每个用户的身份“登录”并以该用户的身份创建表并因此绑定(bind)到该模式,然后插入一些数据并将其读出。然后它“注销”( REVERT )并使用模式限定名称从两个表中进行选择。如果您注释掉 drop 部分,您可以作为用户之一登录并执行不合格的 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许可。

    关于sql-server - 将 SqlServer(2008) 命名实例迁移到模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5275030/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com