SQL命令管理数据库

本文介绍在RDS SQL Server实例中使用SQL命令创建和删除数据库,并通过专用存储过程更改数据库名称的方法,同时说明管理数据库时禁止执行的高风险操作。

前提条件

RDS SQL Server实例版本为2012及以上。

创建数据库

执行如下命令,创建数据库:

CREATE DATABASE TestDb
说明

RDS SQL Server实例中创建数据库时会产生默认路径,请您不要指定任何文件的路径。

您可以执行以下命令,查询SQL Server实例的所有数据库的数据文件和日志文件的路径信息:

SELECT db_name(database_id), physical_name
FROM sys.master_files;

删除数据库

执行如下命令,删除数据库:

DROP DATABASE [TestDb]

需注意,若您在删除数据库前没有对该数据库进行过任何备份,系统会返回如下提示信息:

DROP DATABASE [TestDb]
        -------------------------------------------------------------------------------------------------
        Kindly reminder:
            your database [TestDb] does not exist any backup set.
        -------------------------------------------------------------------------------------------------
Login User [Test11] has dropped database [TestDb] .

更改数据库名称

RDS SQL Server提供存储过程sp_rds_modify_db_name用于安全修改数据库名称,该存储过程无需额外授权,普通账号也可执行。

T-SQL命令

sp_rds_modify_db_name

支持的实例

  • 高可用系列

  • 集群系列

  • 基础系列

描述

更改数据库的名称。高可用系列和集群系列实例在更改名称后会自动重建主备关系,重建过程中会进行备份和还原,当数据库空间比较大时,需要注意当前实例的剩余可用空间。

使用方法

USE db
GO
EXEC sp_rds_modify_db_name 'db','new_db'
GO
  • 第一个参数是原数据库的名称。

  • 第二个参数是新数据库的名称。

数据库的更改限制

您可以更改数据库的大部分属性,但请不要执行如下操作:

  • 请勿将数据库移动到错误的文件路径。

    例如,若您执行如下命令并指定了错误的文件路径:

    ALTER DATABASE [TestDb]MODIFY FILE( NAME = N'TestDb', FILENAME = N'E:\KKKK\DDD\DATA\TestDb.mdf' )

    则系统会返回如下错误信息:

    Msg 50000, Level 16, State 1, Procedure ******, Line 152
    The file path [ 
    E:\KKKK\DDD\DATA\TestDb.mdf ] is invalid,please specify correct path folder [ E:\mmm\gggg\ ].
    Msg 3609, Level 16, State 2, Line 2
    The transaction ended in the trigger. The batch has been aborted.
  • 请勿将数据库的恢复模式设置为FULL之外的其他模式。

    例如,若您执行了如下将数据库的恢复模式设置为SIMPLE的命令:

    ALTER DATABASE [TestDb]  --[TestDb]为数据库名称。
    SET RECOVERY SIMPLE

    数据库日志链会断开,系统会将恢复模式重置为FULL,但不会实际修改数据库恢复模式为SIMPLE。会返回如下报错信息:

    Msg 50000, Level 16, State 1, Procedure ******, Line 46
    Login User [Test11] can't change database [TestDb] recovery model.
    Msg 3609, Level 16, State 2, Line 2
    The transaction ended in the trigger. The batch has been aborted.
    重要

    如果日志已满只能截断日志链进行收缩。原则上不允许将数据库修改为SIMPLE简单模式,这种方式会影响RDS的备份链,导致经过当前时间点的所有恢复任务失败。如果紧急情况下您需要通过修改数据库恢复模式为SIMPLE简单模式并需要截断数据库日志链,表示您已经理解并愿意承担上述风险。此时您可忽略执行如下命令后显示的错误信息,数据库日志链依然会断开。

  • 将数据库设置为OFFLINE后,请勿直接执行ONLINE命令。

    例如,对于当前状态为OFFLINE的数据库,若您直接执行ONLINE的命令,如下所示:

    USE [master]
      GO
      --set offline
      --ALTER DATABASE [TestDb]
      --SET OFFLINE
      --WITH ROLLBACK AFTER 0
      ALTER DATABASE [TestDb]
      SET ONLINE

    则系统会返回如下错误信息:

    Msg 5011, Level 14, State 9, Line 1
    User does not have permission to alter database 'TestDb', the database does not exist, or the database is not in a state that allows access checks.
    Msg 5069, Level 16, State 1, Line 1
    ALTER DATABASE statement failed.

    如需将数据库的状态从OFFLINE改成ONLINE,您可以执行sp_rds_set_db_online存储过程命令进行状态的变更:

    EXEC sp_rds_set_db_online 'TestDb'

常见报错

通过原生SQLALTER DATABASE命令或SSMS图形界面修改RDS SQL Server数据库名称报错?

问题描述

通过原生SQLALTER DATABASE命令或SSMS图形界面直接修改RDS SQL Server数据库名称出现报错,具体如下:

  • 原生SQLALTER DATABASE命令报错

    Msg 5011, Level 14, State 2, Line 4
    User does not have permission to alter database 'jmdb01', the database does not exist, or the database is not in a state that allows access checks.

    image

  • SSMS图形界面报错unable to rename db_name.

    image

问题原因

  • RDS SQL Server用户账号(普通账号和高权限账号)默认仅被授予了master数据库的CREATE DATABASE权限,这不足以支持修改数据库名称的操作,因此无法通过原生SQLSSMS直接修改数据库名称。

  • (不推荐)如需修改可开通SA权限,通过SA权限账号手动为用户账号(普通账号和高权限账号)授予相关权限才能完成操作。账号的具体权限说明如下:

    • 仅被授予master库的CREATE DATABASE权限:用户没有权限修改任何数据库的名称。

    • 被授予实例级别的CREATE ANY DATABASE权限:用户可以修改其作为Owner的数据库名称。但需注意,用户必须是数据库的Owner,而不是被授予了db_owner角色。修改数据库Owner的方法,请参见修改数据库属性(高级信息db_owner)

    • 被授予实例级别的ALTER ANY DATABASE权限:用户可以修改其被授予了ALTER权限的数据库名称。

解决方案

RDS SQL Server提供存储过程sp_rds_modify_db_name用于安全修改数据库名称,该存储过程无需额外授权,普通账号也可执行。

T-SQL命令

sp_rds_modify_db_name

支持的实例

  • 高可用系列

  • 集群系列

  • 基础系列

描述

更改数据库的名称。高可用系列和集群系列实例在更改名称后会自动重建主备关系,重建过程中会进行备份和还原,当数据库空间比较大时,需要注意当前实例的剩余可用空间。

使用方法

USE db
GO
EXEC sp_rds_modify_db_name 'db','new_db'
GO
  • 第一个参数是原数据库的名称。

  • 第二个参数是新数据库的名称。

相关文档