亚马逊 RDS SQL Server:如何检测是否为 RDS?

3

我正在尝试将我的数据库迁移到RDS。由于限制,需要进行一些更改。

是否可能在脚本(存储过程等)内检测当前数据库是否在RDS中?

更新: 在我的函数中,我使用以下方法进行测试:

if CHARINDEX(N'EC2AMAZ',(cast(serverproperty('ServerName') as nvarchar(256))))>0 
   return 1 
else 
   return 0

你的[编辑]确实是一个答案,而且在我看来和目前唯一的答案一样好。你应该将它发布为一个答案(如果你确实成功使用过它,还可以接受它)。这将有助于其他人不会错过它,谢谢。 - Frédéric
3个回答

3

我喜欢@xiani的方法,并决定稍微改进一下(假设“正常”的SQL Server实例有一个名为[rdsadmin]的数据库)。

DECLARE @IsAmazonRDS BIT = 0;

--1st test: does the [rdsadmin] database exist?
IF DB_ID('rdsadmin') IS NOT NULL
BEGIN
    BEGIN TRY
        --2nd test: If this is an Amazon RDS instance, we should not able to access the database "model" under the current security context.
        DECLARE @FileCount INT;
        SELECT @FileCount = COUNT(*) FROM model.sys.database_files;
    END TRY
    BEGIN CATCH
        SET @IsAmazonRDS = 1;
        --Comment/uncomment to verify the flag is set.
        --SELECT 'Inside Catch';
    END CATCH
END

这可以通过基于任何你确定的标准进行第三、第四等额外检查来补充。决定自己要走多远。


1

这并不是万无一失的,需要依赖rdsadmin数据库(AWS似乎总是会创建)的存在,但我使用以下代码:

SELECT CASE WHEN db_id('rdsadmin') IS NULL THEN 0 ELSE 1 END AS RDS_DATABASE;

1
我在我的函数中使用了这种方式:

if CHARINDEX(N'EC2AMAZ',(cast(serverproperty('ServerName') as nvarchar(256))))>0 
   return 1 
else 
   return 0

目前它可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接