检查数据库是否存在且当前登录可以访问

时间:2013-10-23 22:30:00

标签: sql-server tsql ssis

我知道我可以使用...

检查数据库是否存在

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,并且甚至不执行以下步骤。

作为参考,我使用的登录名仅分配给“公共”服务器角色。

1 个答案:

答案 0 :(得分:6)

尝试:

Select HAS_DBACCESS('YourDatabaseNameHere')

如果返回1,则登录具有访问权限。 0表示无法访问。 NULL表示数据库不存在。