背景
我正在使用SQL Server 2008 R2的全文搜索来检索大量文档,并希望使用sys.dm_fts_parser
的结果来突出显示匹配的术语。
这样做通常需要应用程序用户不应拥有的权限。有一个解决方案proposed on MSDN以及一个deleted question/answer on StackOverflow(请参阅why it was deleted)。
问题
我正在尝试实施该解决方案,但无法向IIS App Pool用户授予执行权限。
我尝试了什么
在安全/登录下的SSMS中,我创建了一个用户IIS APPPOOL\My App
。我授予该用户db_datareader
和db_datawriter
表格访问权限,并且工作正常。
再次在SSMS中:
dbo.usp_fts_parser
IIS APPPOOL\My App
问题
为什么此拨款不足以执行dbo.usp_fts_parser
?
备注
IIS APPPOOL\My App
,则代码可以执行dbo.usp_fts_parser
答案 0 :(得分:2)
如果您查看官方MSDN help for this system function,那么您会发现它确实需要,
权限
需要sysadmin固定服务器角色和访问权限 对指定的停止列表的权利。
如此说,该用户必须是sysadmin固定服务器角色的成员。我认为没有任何解决办法。
答案 1 :(得分:1)
以下是最初在https://stackoverflow.com/questions/3816023/sys-dm-fts-parser-permission/3816407#3816407发布的答案:
在您的数据库中:
create procedure usp_fts_parser
@query nvarchar(max)
with execute as caller
as
select * from sys.dm_fts_parser(@query, 1033, 0, 0);
go
grant execute on usp_fts_parser to [<some low priviledged user>]
go
create certificate sign_fts_parser
encryption by password = 'Password#1234'
with subject = 'sign_fts_parser';
go
add signature to object::usp_fts_parser
by certificate sign_fts_parser with password = 'Password#1234';
go
alter certificate sign_fts_parser
remove private key;
go
backup certificate sign_fts_parser
to file = 'c:\temp\sign_fts_parser.cer';
go
在主人:
create certificate sign_fts_parser
from file = 'c:\temp\sign_fts_parser.cer';
go
create login login_sign_fts_parser
from certificate sign_fts_parser;
go
grant control server to login_sign_fts_parser;
go
我刚刚在SQL Server 2008上测试了这些步骤,并且我能够从低权限登录中执行usp_fts_parser
。与原始帖子答案的唯一区别是我在存储过程中添加了显式GRANT EXECUTE,并删除了无回复的启用可信任步骤。在您的情况下,<low priviledged user>
应为IIS APPPOOL\My App
,假设您不在ASP应用程序中使用模拟。
调用sys.dm_fts_parser
所需的权限来自过程中的签名,该签名通过导出并导入master
数据库的证书具有显式的CONTROL SERVER权限(最高可能的权限)。由于证书的私钥被明确删除,因此无法滥用与此证书关联的高权限,因为它无法再签署任何内容(私钥永远丢失)。有关详细信息,请参阅Module Signing (Database Engine)。
请注意,每次修改存储过程时,必须重复上述步骤。该过程的任何ALTER都将导致相关签名的自动,静默,丢弃。丢失模块签名意味着丢失从此签名派生的权限,因此对sys.dm_fts_parser
的后续调用将对低权限用户失败。