Sql 向所有人执行(实际选择)用户定义函数的权限

Sql 向所有人执行(实际选择)用户定义函数的权限,sql,sql-server,Sql,Sql Server,我们已经创建了一个UDF,现在它从一些受限数据库获取信息,并读取受限数据库的扩展属性。我们希望保持受限数据库不变,即不能直接访问这些数据库 但是,我们希望每个人(我指的是每个经过身份验证的SQL用户)都能够像这样运行此scaler UDF: 选择somedatabase.dbo.udf_getInfo() 因此,换句话说,每个人都应该只能访问scaler函数udf_getInfo,并且这个scaler-value函数将读取一些数据库信息,用户无法直接访问这些信息。udf引用的所有对象是否与udf

我们已经创建了一个UDF,现在它从一些受限数据库获取信息,并读取受限数据库的扩展属性。我们希望保持受限数据库不变,即不能直接访问这些数据库

但是,我们希望每个人(我指的是每个经过身份验证的SQL用户)都能够像这样运行此scaler UDF:

选择somedatabase.dbo.udf_getInfo()


因此,换句话说,每个人都应该只能访问scaler函数udf_getInfo,并且这个scaler-value函数将读取一些数据库信息,用户无法直接访问这些信息。

udf引用的所有对象是否与udf存在于同一个数据库和模式中?阅读以下内容:UDF引用主数据库上的扩展属性,以及同一(自身)数据库中的表。我们不希望将这两个问题直接暴露给所有人。因此,表的定标器UDFSo应该是正常的,但是您需要为扩展属性启用跨数据库所有权链接。发布您尝试过的代码和您得到的错误/不希望出现的行为。UDF引用的所有对象是否与UDF存在于同一数据库和架构中?阅读以下内容:UDF引用主数据库上的扩展属性,以及同一(自身)数据库中的表。我们不希望将这两个问题直接暴露给所有人。因此,表的定标器UDFSo应该是正常的,但是您需要为扩展属性启用跨数据库所有权链接。张贴您尝试过的代码和您得到的错误/不希望出现的行为。GRANT SELECT正在抛出错误。GRANT EXECUTE可以工作,因为这是UDF,而不是表/视图。我会试试,并让你们知道。我不建议授予公众,除了基本的内在场景。GETDATE()或IsLastDayOfYear()可能是公用的。如果有任何远程非公共数据,那么我将为所有用户提供一个角色并授予该角色。我同意,我也不太赞成授予对SQL Server的公共访问权限。事实上,这是我的第二个担忧,我希望只授予那些可以登录服务器(SQL或Windows身份验证)的人访问权限。有什么建议吗?他们必须登录该数据库才能成为公共服务的一部分。但这是所有登录到该数据库。public不包括数据库中您不允许的人员,所以这就是您描述的。如果其中只有一个是正确的,为什么要让我们对您的答案保持悬念?GRANT SELECT是一个错误。GRANT EXECUTE可以工作,因为这是UDF,而不是表/视图。我会试试,并让你们知道。我不建议授予公众,除了基本的内在场景。GETDATE()或IsLastDayOfYear()可能是公用的。如果有任何远程非公共数据,那么我将为所有用户提供一个角色并授予该角色。我同意,我也不太赞成授予对SQL Server的公共访问权限。事实上,这是我的第二个担忧,我希望只授予那些可以登录服务器(SQL或Windows身份验证)的人访问权限。有什么建议吗?他们必须登录该数据库才能成为公共服务的一部分。但这是所有登录到该数据库。public不包括数据库中您不允许的人,所以这就是您描述的。如果其中只有一个是正确的,为什么要让我们对您的答案保持悬念?
use YourDbName
GO

-- only one of these is correct 
GRANT SELECT on dbo.udf_getinfo() TO public 
GO
-- only one of these is correct 
GRANT EXEC  on dbo.udf_getinfo() TO public 
GO


-- YOU MUST HAVE PERMISSION also - AND - you need to have the GRANT on it to give the permission.