我知道我可以使用...
检查数据库是否存在 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类似于hack。
那么是否有查询只返回当前登录可以访问的数据库?我想在SSIS包中使用它来确定数据库是否存在和可以在继续之前访问。正如现在编写的那样(使用IF EXISTS...
),执行SQL任务返回true,然后执行以下步骤失败。我更倾向于执行SQL任务返回false,并且甚至不执行以下步骤。
作为参考,我使用的登录名仅分配给“公共”服务器角色。
答案 0 :(得分:6)
尝试:
Select HAS_DBACCESS('YourDatabaseNameHere')
如果返回1,则登录具有访问权限。 0表示无法访问。 NULL表示数据库不存在。