SQL SERVER——生成sql:删除所有log表中,user_name是某用户的数据

前言

等保要求去掉admin账户,并且删除所有admin产生的日志。

由于数据库太多,一个一个找太麻烦,于是就有了这篇文章:

总体思路:

  1. 遍历所有用户数据库
  2. 表名匹配 %LOG%
  3. 确保有 user_name 字段
  4. 支持任意 Schema
sql 复制代码
-- 创建临时表存储所有 DELETE 语句
CREATE TABLE #DeleteStatements (DeleteStatement NVARCHAR(4000));

DECLARE @dbname SYSNAME;
DECLARE @sql NVARCHAR(MAX);

-- 声明局部游标(避免命名冲突)
DECLARE db_cursor CURSOR LOCAL FOR
    SELECT name
    FROM sys.databases
    WHERE database_id > 4          -- 排除系统数据库
      AND state = 0                -- 在线
      AND is_read_only = 0;        -- 可写

OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @dbname;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 动态构建查询:找出当前库中 表名含 LOG + 有 user_name 列 的表,并生成 DELETE 语句
    SET @sql = N'
        INSERT INTO #DeleteStatements (DeleteStatement)
        SELECT 
            ''DELETE FROM '' + 
            QUOTENAME(''' + @dbname + ''') + ''.'' + 
            QUOTENAME(s.name) + ''.'' + 
            QUOTENAME(t.name) + 
            '' WHERE user_name = ''''admin'''';''
        FROM ' + QUOTENAME(@dbname) + N'.sys.tables t
        INNER JOIN ' + QUOTENAME(@dbname) + N'.sys.schemas s ON t.schema_id = s.schema_id
        INNER JOIN ' + QUOTENAME(@dbname) + N'.sys.columns c ON t.object_id = c.object_id
        WHERE UPPER(t.name) LIKE ''%LOG%''
          AND c.name = ''user_name''
        GROUP BY s.name, t.name;
    ';

    BEGIN TRY
        EXEC sp_executesql @sql;
    END TRY
    BEGIN CATCH
        -- 忽略无法访问的数据库(如权限不足、脱机等)
        PRINT 'Skipped database: ' + @dbname + ' (' + ERROR_MESSAGE() + ')';
    END CATCH

    FETCH NEXT FROM db_cursor INTO @dbname;
END

CLOSE db_cursor;
DEALLOCATE db_cursor;

-- 一次性返回所有 DELETE 语句(单个结果集)
SELECT DeleteStatement FROM #DeleteStatements ORDER BY DeleteStatement;

-- 清理
DROP TABLE #DeleteStatements;
相关推荐
这个DBA有点耶9 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
这个DBA有点耶11 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技11 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend12 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence15 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
先吃饱再说1 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils1 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend1 天前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent
这个DBA有点耶1 天前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构
smallyoung2 天前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql