2011-03-11 29 views
3

我目前擁有80位客戶的軟件。 當數據不同時,全部共享相同的數據庫結構。將SqlServer(2008)命名實例遷移到模式

我們爲每個客戶提供了5個數據庫。

今天,我們已命名實例,所以程序被訪問到BDD的東西,如:從base1..table1

  • 連接到127.0.0.1/CUSTOMER1
  • SELECT *

    現在,我們需要改變,我們有很多例子。

    這個想法是有獨特的SQLSERVER實例,顯然我想避免更改代碼(VB.NET)。

    只是試圖用模式和用戶玩,似乎是一種選擇,但因爲模式是對數據庫下,在不能讓它工作:

    • 連接到127.0.0.1/GLOBAL_INSTANCE爲特定用戶(customer1表)
    • 從base1..table1選擇* - >錯誤@這一點

    當這個作品:

    • 連接到127.0.0.1/GLOBAL_INSTANCE爲特定用戶(customer1表)
    • 使用基礎1
    • SELECT * FROM base1..table1 /或SELECT * FROM表1

    我可以很容易的腳本一些用戶或創建模式,並更改所有客戶的連接字符串,但我無法真正改變所有請求:數量巨大。

    感謝您的任何迴應或想法。

回答

1

下面是使用模式的高級視圖。腳本創建一個測試數據庫,在其中創建兩個用戶(T1和T2)和兩個模式(S1和S2)。然後,它以每個用戶的身份「登錄」,並以該用戶的形式創建表,並將其綁定到該模式,然後插入一些數據並將其讀出。然後它「註銷」(REVERT)並使用模式限定名從這兩個表中進行選擇。如果您註銷掉部件,您可以以其中一個用戶身份登錄並執行不合格的SELECT * FROM Test,它會自動找到正確的模式。

下方運行與sa或其他管理員帳戶(一個有權限創建表,登錄模式和permision到補助金)的代碼

--//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的權限。