如何从 SQL Server 数据库中擦除所有数据库和用户?

Mic*_*ite 4 sql-server windows-server

好的,故事就到这里。

我有一个安装了 SQL Server 2008 R2 Standard 的 Windows 7 Ultimate 机器,这是我从一个在我进入公司之前很久就离开公司的人那里继承来的。没有留下关于用户的文档。

除了能够设置sa密码并且不需要盒子上当前的任何数据库之外,我不需要任何用户。

我不能从包装盒中取出 SQL Server 的唯一原因是我在这个办公室没有原始媒体,而且很难从另一个办公室获取媒体。我需要标准安装,因为我要加载的数据库之一的大小为 70GB(它们将图像存储在表中)。

有没有办法重新开始?

Aar*_*and 7

假设您可以访问该框(如果您需要恢复访问权限,请参阅 Kin 已经指出的链接),您需要:

  • 删除所有用户数据库。请运行第PRINT一个并确保您没有丢弃任何您可能会后悔的东西。您可能希望首先备份所有数据库以防万一。

    DECLARE @sql NVARCHAR(MAX) = N'';
    
    SELECT @sql += N'
      DROP DATABASE ' + QUOTENAME(name)
      + N';' 
    FROM sys.databases
    WHERE name NOT IN (N'master',N'tempdb',N'model',N'msdb');
    
    PRINT @sql;
    -- EXEC master.sys.sp_executesql @sql;
    
    Run Code Online (Sandbox Code Playgroud)
  • 删除所有非系统登录。再次,请运行PRINT第一个命令,看看名单上非常谨慎。如果您通过 Windows 身份验证登录,我有一个过滤器可以防止自己丢失,但是如果您以sa或类似的身份登录并且不想放弃您的 Windows 登录,您可能希望添加其他特定过滤器。

    DECLARE @sql NVARCHAR(MAX) = N'';
    
    SELECT @sql+= N'
      DROP LOGIN ' + QUOTENAME(name) + ';' 
    FROM sys.server_principals 
    WHERE name <> N'sa'
    AND name NOT LIKE N'##%'
    AND name NOT LIKE N'NT [AS]%'
    AND [type] IN ('R', 'S', 'U', 'G')
    AND principal_id > 256
    AND name <> SUSER_SNAME(); -- don't drop yourself!
    
    PRINT @sql;
    -- EXEC master.sys.sp_executesql @sql;
    
    Run Code Online (Sandbox Code Playgroud)
  • 更正您保留的任何登录名的默认数据库。您可能会发现如果您的默认数据库不再存在,您可以将自己锁定。因此,将您的登录名设置为默认为masteror tempdb

    ALTER LOGIN [DOMAIN\Login] WITH DEFAULT_DATABASE = tempdb;
    
    Run Code Online (Sandbox Code Playgroud)
  • 更正任何引用旧数据库的作业/维护计划。您需要手动查看列表并确定与这些数据库相关的任何内容,否则它们将开始失败。您可以获得一个起始列表,但这不一定是一个完整的列表 - 它不会告诉您该作业是否使用引用具有三部分命名的数据库的即席 SQL 或调用这样做的存储过程. 谢天谢地,您不必担心同义词(除非某些邪恶的人将同义词放入系统数据库中)。

    SELECT j.name 
    FROM msdb.dbo.sysjobs AS j
    WHERE EXISTS 
    (
      SELECT 1 
        FROM msdb.dbo.sysjobsteps AS js
        WHERE js.job_id = j.job_id
        AND js.database_name NOT IN (N'msdb',N'master',N'tempdb',N'model')
    );
    
    Run Code Online (Sandbox Code Playgroud)

    事实上,您可能希望首先运行此步骤,以便您可以在所有作业开始失败之前清理它们。我还将验证所有剩余的工作仍然具有有效的所有者。删除任何登录后,您必须更正以下任何作业:

    SELECT j.name FROM msdb.dbo.sysjobs AS j
    WHERE NOT EXISTS
    (
      SELECT 1 
        FROM sys.server_principals AS p
        WHERE p.sid = j.owner_sid
    );
    
    Run Code Online (Sandbox Code Playgroud)


Kin*_*hah 1

除了能够设置 sa 密码之外,我不需要任何用户,并且不需要当前盒子上的任何数据库。

您可以使用多种方法来重置 sa 密码,或者参阅 Aaron 关于 MSSQLTips 的文章。要删除所有数据库,您可以使用

select 'DROP DATABASE '+ name + char(10) + 'go'
from sys.databases where database_id > 4
Run Code Online (Sandbox Code Playgroud)

我无法从框中删除 sql 的唯一原因是因为我在这个办公室中没有原始媒体,并且从其他办公室获取媒体时会遇到困难。我需要标准安装,因为我想要加载的数据库之一大小为 70GB(它们将图像存储在表中)。

为什么不安装另一个 SQL Server 实例,例如名为的命名实例INSTANCE2或类似的适合您需要的实例。

顺便说一句,没有 Windows 2007 版本。