SQL Server跨数据库授予执行权限:是否存在等效简化语法?
在SQL Server中跨数据库授予EXECUTE权限的正确方法
你遇到的问题其实是因为SQL Server中GRANT语句的作用域限制——它默认只对当前连接的数据库生效,而且不能直接把EXECUTE权限授予整个数据库对象本身。下面给你两种可行的解决方案:
方法1:切换到目标数据库后执行授权
这是最直接的方式,先切换到你要授权的数据库,然后执行授予全库EXECUTE权限的语句:
USE [SomeOtherDatabase]; GRANT EXECUTE TO [domain\UserLogin];
这条语句会把SomeOtherDatabase中所有现有可执行对象(存储过程、标量函数、表值函数等)的执行权限授予指定用户。如果后续在该库创建新的可执行对象,默认不会自动继承这个权限,你要么手动重新授权,要么通过DDL触发器来自动设置权限。
方法2:不切换数据库,跨库执行授权语句
如果不想切换当前数据库的上下文,可以用系统存储过程sp_executesql在目标数据库的环境中运行授权命令:
EXEC [SomeOtherDatabase].sys.sp_executesql N'GRANT EXECUTE TO [domain\UserLogin];';
这种方式相当于在目标数据库的会话中执行了授权语句,效果和方法1完全一致,但不需要切换当前连接的数据库。
为什么你的原写法不生效?
你尝试的grant execute On [SomeOtherDatabase] to [domain\UserLogin]语法错误,因为EXECUTE权限是针对数据库内的可执行对象,而不是数据库本身。SQL Server不支持直接把EXECUTE权限授予整个数据库对象,必须在目标数据库的上下文内执行GRANT EXECUTE TO ...来覆盖全库的可执行对象。
另外补充一点:如果你只需要授予某个特定架构(比如dbo)下的所有可执行对象权限,可以用更精准的语句:
USE [SomeOtherDatabase]; GRANT EXECUTE ON SCHEMA::dbo TO [domain\UserLogin];
内容的提问来源于stack exchange,提问作者Charles Bretana
相关产品推荐
相关产品推荐

