意外更改数据库名称(SQL Server 2008)


8

还没有发生在我身上。但是我在想这个。

我在搞乱我的培训环境,错误地单击了数据库名称,然后触摸了字母A。

案件

假设我按下Enter键。现在数据库称为A,我不记得原来的名字了。CTRL + Z不起作用。

案例2

在生产环境中,在这种情况下该怎么办?

我知道这不会发生,因为数据库未设置为“单用户”。但是,如果发生这种情况。该怎么办?为了论证,让我们说这是一个没有人使用的数据库。


2
我将有一个具有ALTER DATABASE权限的特定用户,并且仅当我实际要运行ALTER DATABASE脚本时才以该用户身份登录。这样一来,您将永远不会做上述事情
马克·辛金森

Answers:


12

右键单击数据库,转到文件。您可以看到原始文件名。这将帮助您轻松找到正确的数据库名称。重命名不会更改文件名。

您也可以尝试看看您的fn_dblog。它没有记录,但您可以查看(和过滤)最新操作。

SELECT * 
FROM fn_dblog(NULL,NULL)

2
该查询中的数据不会以纯文本显示。需要使用类似以下内容的形式将其转换为可读形式SELECT CAST([RowLog Contents 0] AS sysname) ,CAST([RowLog Contents 1] AS sysname) FROM sys.fn_dblog(NULL,NULL) WHERE Context = 'LCX_BOOT_PAGE' AND [Offset in Row] =52
Martin Smith

7

我怀疑您在生产中是否会有一个数据库,您的名字不知道或没有在某个地方记录过。

如果万一发生在生产中,则可以使用以下命令查找现有备份的列表

RESTORE HEADERONLY FROM DISK = '<backuplocation>' 

dbo.backupset从msdb 使用。

SELECT DISTINCT database_name FROM msdb.dbo.backupset

5

您可以查看上一次SQL Server启动时的SQL Server日志,并查找“启动数据库'DBName'的每个实例。然后,您可以将此列表与sys.databases的结果进行比较。任何新数据库和您更改的数据库都不会出现在SQL Server日志列表中。

另一种也许更好的方法是查询默认跟踪并通过:: fn_trace_gettable database_id进行过滤。假设最近有一些数据库使用情况,databaseName列将显示旧名称,然后在较新的行中显示新名称,其事件类型为Object:Altered。

SELECT  *
        ,cast(value as nvarchar(1000))
FROM   ::fn_trace_getinfo(default)
WHERE   traceid = 1 and   property = 2;

SELECT  ftg.StartTime,
        ftg.EndTime,
        te.name,
        ftg.sessionLoginName,
        ftg.ObjectName,
        ftg.DatabaseName,
        ftg.ServerName,
        ftg.LoginName,
        ftg.hostName,
        ftg.NTUserName,
        ftg.DatabaseID,
        ftg.TextData,
        ftg.TargetuserName
        ,SPACE(10) AS [Space]
        ,*
FROM    ::fn_trace_gettable('Z:\SQLServer\MSSQL\Log\log_5.trc', default) AS ftg 
INNER JOIN
        sys.trace_events AS te 
        ON  ftg.EventClass = te.trace_event_id  
ORDER BY
        ftg.StartTime DESC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.