Sql-Server
數據庫“master”中的 CREATE DATABASE 權限被拒絕。無法附加
在 T-SQL 腳本中,使用如下連接字元串:
Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=C:\Temp\ContextTest.mdf;Initial Catalog=ContextTest;Integrated Security=True
… 一世 …
- 創建 SQL Server LocalDB 數據庫
- 創建登錄名並將使用者添加到我創建的數據庫中
- 我沒有向使用者添加任何數據庫角色。
- 我創建一個表並向使用者授予 SELECT、INSERT、UPDATE、DELETE、REFERENCE 權限
該腳本類似於以下內容:
CREATE LOGIN [U] WITH PASSWORD = '***' CREATE USER [U] FROM LOGIN [U] CREATE TABLE [U].[TestEntities] ( Id INT PRIMARY KEY IDENTITY , Name NVARCHAR(100) NOT NULL UNIQUE ) GRANT INSERT, DELETE, SELECT, REFERENCES, UPDATE ON [U].[TestEntities] TO [U];
接下來,我使用 SSMS 來檢查所有內容,使用我剛剛創建的憑據。
當我使用新創建的使用者在 SSMS 中連接時,我可以
[U].[TestEntities]
使用如下查詢輕鬆查詢表:SELECT COUNT(*) FROM U.TestEntities
然後,如果我在 .NET 中執行相同操作,我會收到一條錯誤消息,聲稱我需要 CREATE DATABASE 權限:
using namespace System.Data.SqlClient try { $con = [SqlConnection]::new('Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=C:\Temp\ContextTest.mdf;Initial Catalog=ContextTest;User ID=U;Password=***') $cmd = $con.CreateCommand() $cmd.CommandText = 'SELECT COUNT(*) FROM [U_MCL].[TestEntities] AS [t]' $con.Open() $cmd.ExecuteScalar() } finally { $con.Dispose() }
MethodInvocationException: C:\Temp\Test.ps1:9:2 Line | 9 | $con.Open() | ~~~~~~~~~~~ | Exception calling "Open" with "0" argument(s): "CREATE DATABASE permission denied in database 'master'. Cannot attach the file | 'C:\Temp\ContextTest.mdf' as database 'ContextTest'."
我錯過了什麼?
如果我正確閱讀了您的問題,那麼當您在 SSMS 中執行此操作時,您是在您的帳戶上下文中創建數據庫(使用集成安全性),然後在創建數據庫後,您將使用有限的憑據連接以查詢數據庫。這很好用,因為您的帳戶有權創建數據庫,但受限憑證沒有。
當您使用 C# 連接時,您使用的是有限的憑據,並傳入 AttachDbFilename,這導致 SQL Express 嘗試在該上下文中創建一個新數據庫,但有限的憑據無權創建/附加像您的帳戶一樣的數據庫,因此它失敗了。如果您已經創建了數據庫,則不需要在 C# 連接字元串中指定 AttachDbFilename,您可以像在 SSMS 中第二次那樣進行連接。
AttachDbFilename 不是執行此操作的理想方法,因此也值得閱讀Aaron Bertrand 的這篇部落格文章,了解有關如何更好地處理此問題的更多詳細資訊。