2013-10-23 55 views
1

我知道我可以檢查是否存在數據庫使用...檢查數據庫是否存在,當前的登錄可以訪問

SELECT * FROM sys.databases WHERE name = 'database_name'

或...

SELECT DB_ID('database_name')

該檢查可無論當前登錄是否可以訪問database_name,都要執行此操作。如果當前登錄沒有訪問權限,例如,則本聲明

USE database_name

...將理所當然地失敗,這條消息:

The server principal "login_name" is not able to access the database "database_name" under the current security context.

我要的是一個查詢告訴我當前登錄是否可以訪問當前數據庫。我試圖在一個嘗試抓包...

begin try 
    use database_name; 
end try 
begin catch 
    select 'cannot access database_name' 
end catch 

......但是,產生與上述相同的錯誤,甚至沒有得到捕獲。這對我來說令人驚訝 - 我希望能夠重新獲得自定義信息。也許你不能在try catch塊中有USE語句,但無論如何try..catch類似於黑客。

那麼有沒有查詢只返回當前登錄可以訪問的數據庫?我想在SSIS包中使用它來確定數據庫是否存在可以在繼續之前訪問。由於它是現在編寫的(使用IF EXISTS...),執行SQL任務返回true,則以下步驟失敗。我更願意執行SQL任務返回false,並且下面的步驟甚至沒有執行。

僅供參考,我正在使用的登錄名僅分配給「公共」服務器角色。

回答

5

嘗試:

Select HAS_DBACCESS('YourDatabaseNameHere') 

如果返回1,登錄訪問。 0表示無法訪問。 NULL表示數據庫不存在。

相關問題