下面是使用模式的高級視圖。腳本創建一個測試數據庫,在其中創建兩個用戶(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
的權限。