2

我知道我可以使用...检查数据库是否存在

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.

我想要的是一个查询,告诉我当前登录是否可以访问当前数据库。我试着用 try catch 包裹起来......

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

...但这会产生与上述相同的错误,甚至没有抓住问题。这让我感到惊讶——我希望能得到自定义消息。也许您不能USE在 try catch 块中包含语句,但无论如何,try..catch 似乎有点像 hack。

那么是否有一个查询只返回当前登录可以访问的数据库?我想在 SSIS 包中使用它来确定数据库是否存在并且可以在继续之前访问。正如现在所写的那样(使用IF EXISTS...),执行 SQL 任务返回 true,然后以下步骤失败。我宁愿执行 SQL 任务返回 false,甚至不执行以下步骤。

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

4

1 回答 1

6

尝试:

Select HAS_DBACCESS('YourDatabaseNameHere')

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

于 2013-10-23T22:59:57.477 回答