内联表值函数以"用户"身份执行



是否可以作为某些用户执行内联表值函数?例如

CREATE FUNCTION fun()
WITH EXECUTE AS owner
RETURN(
...
)

从EXECUTE AS子句(Transact-SQL)的语法部分:

语法
-- SQL Server Syntax  
Functions (except inline table-valued functions), Stored Procedures, and DML Triggers  
{ EXEC | EXECUTE } AS { CALLER | SELF | OWNER | 'user_name' }   

所以你不能,内联表值函数被显式地表示为而不是能够定义WITH EXECUTE AS选项。

EXECUTE AS在回复和评论中提到的@Larnu和@MartinSmith的函数中是不允许的。此外,即使允许,EXECUTE AS安全上下文也会被沙盒化到当前数据库,除非您设置了数据库TRUSTWORTHY,这是只有在绝对必要时才会做的事情。

所有权链是EXECUTE AS的替代方案。因为对象存在于其他数据库中,所以所涉及的数据库需要设置DB_CHAINING ON选项并具有相同的所有者(假设dbo模式对象)。调用者需要在所有涉及的数据库中被定义为用户,但不需要对间接使用的对象授予对象权限。

只有当受信任的用户具有创建对象的权限时,才应该启用DB_CHAINING,以避免特权的提升。

跨数据库链接的示例脚本:
ALTER DATABASE DB1 SET DB_CHAINING ON;
ALTER DATABASE DB2 SET DB_CHAINING ON;
GO
USE DB1;
GO
--user needs only SELECT on function
CREATE USER YourUser;
GRANT SELECT ON dbo.Fun TO YourUser;
GO
--user needs a security context in other database but no object permissions
USE DB2;
CREATE USER YourUser;
GO

最新更新