Sql-Server

數據庫“master”中的 CREATE DATABASE 權限被拒絕。無法附加

  • October 20, 2021

在 T-SQL 腳本中,使用如下連接字元串:

Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=C:\Temp\ContextTest.mdf;Initial Catalog=ContextTest;Integrated Security=True

… 一世 …

  1. 創建 SQL Server LocalDB 數據庫
  2. 創建登錄名並將使用者添加到我創建的數據庫中
  3. 我沒有向使用者添加任何數據庫角色。
  4. 我創建一個表並向使用者授予 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

SSMS 截圖

然後,如果我在 .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 的這篇部落格文章,了解有關如何更好地處理此問題的更多詳細資訊。

引用自:https://dba.stackexchange.com/questions/301368