如何阻止SQL Server生产环境用户创建临时表且保留登录权限?
如何在不撤销登录权限的前提下收回SQL Server用户创建临时表的权限
要解决这个问题,得先搞清楚SQL Server里临时表权限的底层逻辑:所有登录用户默认都属于public角色,而public在tempdb数据库里默认拥有CREATE TABLE权限——这就是普通登录用户能随便创建临时表的原因。我们的核心操作就是调整tempdb的权限配置,同时确保这个设置能在SQL Server重启后保留(毕竟tempdb每次重启都会被重建)。
下面是具体的实操步骤:
1. 先收回public角色在tempdb的建表权限
首先切换到tempdb,执行这条命令撤销public的CREATE TABLE权限:
USE tempdb; REVOKE CREATE TABLE FROM public;
执行后,所有没被单独授权的用户就没法创建临时表了,但完全不会影响他们的登录权限。如果有部分用户确实需要创建临时表,给他们单独开权限就行:
USE tempdb; GRANT CREATE TABLE TO [你的特定用户名];
2. 让权限设置在SQL Server重启后不丢失
因为tempdb是系统临时库,每次SQL Server服务重启都会被重新初始化,刚才的权限设置会被清掉。所以得把这个配置做成自动执行的启动脚本,有两种常用方法:
方法一:创建启动存储过程
首先在master库创建一个存储过程,里面放tempdb的权限配置:
USE master; GO CREATE PROCEDURE tempdb_permissions_setup AS BEGIN SET NOCOUNT ON; USE tempdb; -- 收回public的建表权限 REVOKE CREATE TABLE FROM public; -- 这里可以添加需要单独授权的用户 -- GRANT CREATE TABLE TO [允许创建临时表的用户]; END; GO
然后把这个存储过程设置为SQL Server启动时自动执行:
EXEC sp_procoption @ProcName = N'tempdb_permissions_setup', @OptionName = N'startup', @OptionValue = N'true';
方法二:用SQL Server代理作业实现
如果你更习惯用代理作业,也可以这么做:
- 打开SQL Server代理,新建一个作业
- 新增作业步骤,步骤类型选“Transact-SQL脚本(T-SQL)”,执行内容就是tempdb的权限配置脚本
- 切换到“计划”选项卡,新建计划,计划类型选择“SQL Server启动时自动启动”
- 保存作业即可
几个需要注意的点
- 执行这些操作你得有
sysadmin或者tempdb的db_owner权限 - 一定要先在测试环境验证,确保不会影响依赖tempdb的系统操作(不过放心,收回public的建表权限不会影响SQL Server自身的进程,它们用的是高权限账户)
- 如果用户有
CONTROL SERVER、ALTER ANY USER这类高权限,可能能绕开限制,但你说的是仅拥有登录权限的普通用户,这个方案完全能满足需求
内容的提问来源于stack exchange,提问作者Eric B
相关产品推荐
相关产品推荐

