是否可以作为某些用户执行内联表值函数?例如
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