sqlserver无法删除用户常见问题补充

本文介绍两种解决SQL Server数据库还原后用户权限问题的方法。一种是在安全性处删除并重建用户;另一种是处理用户登录状态问题,通过查找占用数据库的进程并终止,以便成功删除用户。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1第一种情况,在还原数据库之后,sqlserver数据库对应的用户权限也还原了,于是想在安全性那里删除掉用户重新建一个用户授予权限,结果总是提示用户已存在了,然后修改用户权限就发觉无法修改权限,怀疑是用户和数据库之间的关联没有删除掉,于是用一下脚本把数据库用户彻底删除再重新建立分配权限:

ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo
go
 EXEC sys.sp_revokedbaccess  @name_in_db = user -- sysname
 DROP USER user
 DROP LOGIN user

上面sql语句中user是登录名,只需要在想删除对应用户相关联的数据库中新建查询,然后copy这个脚本,执行一下就可以彻底删除了
 

2第二种情况,在还原sqlserver数据库后,我新建用户名,配置权限之后,在点击确认后发现提示数据库用户已经存在,这时,在想删除原先的数据库用户时提示了另外一个信息,“SQLServer无法删除登录名'***',因为该用户当前正处于登录状态“,问题描述很清楚了,就是这个用户占用着数据库,那么可以先找出哪个用户占着数据库,然后Kill掉这个进程,再删除用户就可以了:

exec sp_who 'admin'

我这里想要删除的用户是admin,具体的根据你想删除的用户名来改,然后就会看到下图

这里发现是spid为86的进程占用着,所以我们用一下命令杀掉进程:

kill 86

然后再删除这个用户,就可以了

<think>好的,我现在需要回答用户关于SQL Server批量删除表的SQL语句的问题。首先,我应该回忆一下用户提供的引用内容,看看有没有相关的例子。用户提到了引用[2],里面提到了删除以“tmp”开头的表,使用动态SQL生成DROP语句。这应该是关键点。 接下来,我需要确定批量删除表的几种常见情况。比如,按表名前缀、后缀或者特定模式来删除用户的问题可能涉及不同的情况,所以需要给出不同的示例。比如,删除所有以“test_”开头的表,或者删除包含“temp”的表。 然后,动态SQL的使用很重要。因为不能直接在SELECT语句中执行DROP,必须构造一个字符串,然后执行它。这里需要用到变量来拼接SQL语句,然后使用EXEC或者sp_executesql来执行。引用[2]中的例子使用了@sql变量来拼接语句,然后执行。 另外,需要注意权限问题,执行DROP TABLE需要有足够的权限。同时,要确保WHERE条件准确,避免误删其他表。比如,使用INFORMATION_SCHEMA.TABLES来获取表的信息,并过滤TABLE_TYPE为BASE TABLE,排除视图。 还要考虑事务处理,可能需要使用BEGIN TRANSACTION和ROLLBACK来测试,避免直接删除。不过用户提供的例子中没有提到这点,可能需要补充说明,作为安全建议。 然后,根据用户的问题,给出具体的示例。比如,删除以“tmp”开头的表,或者按日期后缀删除。每个示例都需要展示如何构造动态SQL,并强调安全注意事项。 最后,生成相关问题,比如如何安全删除、如何批量删除视图等,这些可以引导用户进一步了解相关知识。 总结步骤:确定用户需求,引用现有资料,扩展不同情况,强调安全和动态SQL的使用,最后生成相关问题。</think>以下是SQL Server批量删除表的SQL语句实现方法,根据不同场景提供三种典型示例: ### 一、按表名前缀删除 适用于清理临时表或测试表场景: ```sql DECLARE @sql NVARCHAR(MAX) = ''; SELECT @sql += 'DROP TABLE ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + ';' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'tmp%' -- 表名前缀条件 AND TABLE_TYPE = 'BASE TABLE'; -- 排除视图[^2] EXEC sp_executesql @sql; ``` ### 二、按日期后缀删除 适用于按日期归档的表结构清理: ```sql DECLARE @sql NVARCHAR(MAX) = ''; SELECT @sql += 'DROP TABLE ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + ';' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%202301' -- 2023年1月的表 AND TABLE_TYPE = 'BASE TABLE'; EXEC(@sql); ``` ### 三、按架构批量删除 适用于特定业务模块表的清理: ```sql DECLARE @sql NVARCHAR(MAX) = ''; SELECT @sql += 'DROP TABLE ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + ';' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'Sales' -- 指定架构 AND TABLE_NAME NOT LIKE '%Archive%'; -- 排除归档表 EXEC sp_executesql @sql; ``` **安全建议**: 1. 执行前先运行SELECT语句验证目标表 2. 添加事务控制: ```sql BEGIN TRANSACTION; -- 执行删除语句 ROLLBACK; -- 确认无误后改为COMMIT ``` 3. 避免使用`DROP TABLE IF EXISTS`语法(SQL Server 2016+支持)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值