Вот высокоуровневое представление об использовании схем. Скрипты создают тестовую базу данных, создают в ней двух пользователей (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
получить разрешение.