2017-04-26 38 views
1

我的程序在運行時創建數據庫和表。我對Schema的理解是它是多個數據庫和數據庫表的概念文件夾。所以我寫了一些無意義的代碼來測試一下模式會對我的代碼做些什麼。無法在SQL Server 2016 Express中創建或查找架構

我的程序中使用SQL Server身份驗證,而不是Windows身份驗證,而不是TmpUserSA的用戶名進行創建數據庫和表。

如果我通過CREATE TABLE TmpTable創建一個表格,我會得到dbo.TmpTable表名稱。如果我明確CREATE TABLE abc.TmpTable鍵入一個新的架構,然後我得到以下異常,因爲模式不存在:

SQLEXCEPTION:在指定架構名稱不存在,或者你 沒有使用它

許可

我進入SSMS並通過執行CREATE SCHEMA abc手動創建一個模式。 SSMS輸出表明abc的模式已經成功創建。但在SSMS 對象瀏覽器>安全>我看到沒有架構名稱,也沒有任何其他名稱abc

我的模式在哪裏?如果abc未創建,那麼爲什麼CREATE SCHEMA abc被執行,它創建了什麼?

我又回到Visual Studio和CREATE TABLE abc.TmpTable了,仍然收到相同的異常。

+0

你可以爲每個數據庫創建模式,你確定在調用create schema abc後,你無法在[DatabaseName] \ Security \ Schemas下找到它嗎? – Behzad

+0

我在SeverInstance \ Databases \ System Database \ master \ Security \ Schema中找到它,但從我讀的教程中,它應該位於SeverInstance \ Security中,但即使Schema文件夾也不存在。另外當我在C#中創建abc.TmpTable時,我仍然得到架構不存在的異常 – KMC

回答

1

您的TmpUser無權訪問該架構。

選項從https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql報價1

CREATE SCHEMA abc AUTHORIZATION TmpUser; 

「授權OWNER_NAME 指定數據庫級主體的將擁有架構名稱,這個主要可以擁有其他架構,並且可能不會。使用當前模式作爲其默認模式。「

TmpUser將擁有架構,因此將有權限訪問它。

選項2

明確授予權限的TmpUser:

GRANT SELECT, UPDATE, DELETE, INSERT SCHEMA abc TO TmpUser; 

查看https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-schema-permissions-transact-sql

這就像選1的用法,但你可以細粒度的權限。

選項3

穿戴TmpUser一些數據庫角色,例如db_datareader:

USE MyDatabase 
GO 
ALTER ROLE db_datareader ADD MEMBER TmpUser 

TmpUser將具有對數據庫中所有模式的讀訪問權限。

選項4

它類似於選項3,但不是使用內置的角色,創建自己的一個:

USE MyDatabase 
GO 
CREATE ROLE myrole 
GRANT SELECT, DELETE, INSERT, UPDATE, EXECUTE TO myrole 
ALTER ROLE myrole ADD MEMBER TmpUser 

在myrole用戶將具有讀/寫/執行訪問數據庫中的所有模式。

相關問題