如何通过AWS RDS SQL Server主用户执行sp_changedbowner?

问题描述 投票:0回答:1

最近,我创建了一个AWS RDS SQL Server数据库(SQL Server 2017 Express版,v14.00.3281.6.v1使用免费层模板)。然后我可以使用主用户名和密码登录数据库服务器,可以创建databaselogin,但无法执行

EXEC sp_changedbowner 'testLogin'

将dba改为新创建的登录名。testLogin,我得到一个错误

SQL错误[15151] [S0001]。Cannot find the principal 'testlogin', because it does not exist or you do not have permission.

下面是我运行的整个SQL脚本。看来是主用户的权限不够?谁能告诉我如何解决这个问题,或者如何让脚本运行成功。另外,同样的脚本在传统的SQL Server数据库中也能成功运行。

非常感谢。

SET IMPLICIT_TRANSACTIONS OFF

USE master;

-- Get the SQL Server data path
DECLARE @data_path nvarchar(256)
SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
                  FROM master.sys.master_files
                  WHERE database_id = 1 AND file_id = 1)
DECLARE @model_data_size_kb int
SET @model_data_size_kb = (SELECT SUM(size) * 8
                  FROM master.sys.master_files
                  WHERE database_id = 3 and [type] = 0)
IF @model_data_size_kb < (250 * 1024)
    SET @model_data_size_kb = 250 * 1024
DECLARE @model_log_size_kb int
SET @model_log_size_kb = (SELECT SUM(size) * 8
                  FROM master.sys.master_files
                  WHERE database_id = 3 and [type] = 1)
IF @model_log_size_kb < (50 * 1024)
    SET @model_log_size_kb = 50 * 1024
DECLARE @schema_data_size_str nvarchar(12)
DECLARE @schema_log_size_str nvarchar(12)
SET @schema_data_size_str = CAST(@model_data_size_kb AS nvarchar(12))
SET @schema_log_size_str = CAST(@model_log_size_kb AS nvarchar(12))
-- execute the CREATE DATABASE statement
EXECUTE ('CREATE DATABASE testdb
ON
( NAME = testdb_dat1,
    FILENAME = '''+ @data_path + 'testdb.mdf'',
    SIZE = ' + @schema_data_size_str + 'KB,
    MAXSIZE = UNLIMITED,
    FILEGROWTH = 25MB )
LOG ON
( NAME = testdb_log1,
    FILENAME = '''+ @data_path + 'testdb.ldf'',
    SIZE = ' + @schema_log_size_str + 'KB,
    MAXSIZE = 10GB,
    FILEGROWTH = 5MB )
COLLATE SQL_Latin1_General_CP1_CS_AS'
);
GO

ALTER DATABASE testdb SET READ_COMMITTED_SNAPSHOT ON;

IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE type = 'S' and name = N'testlogin')
BEGIN
    CREATE LOGIN testlogin WITH PASSWORD='testlogin', DEFAULT_DATABASE=testdb, CHECK_POLICY = OFF   
END


USE testdb;

EXEC sp_changedbowner 'testlogin';  -- this statement reports exception
sql-server amazon-rds
1个回答
0
投票

经过研究,我发现AWS RDS SqlServer不支持给主用户添加更多的权限,也就是说不能执行 "sp_changedbowner",因为它需要数据库上的 "Take Ownship "权限,并且需要新的所有者有 "impersonate "的登录权限或服务器上的 "control server "权限。点击这里查看更多关于sp_changedbowner的细节。

就是说我们在RDS SqlServer中不能把db的所有者换成其他人,它始终是一个内置的 "rdsa "用户,但我们可以用 ALTER ROLE db_owner ADD MEMBER testlogin 来添加用户到db_owner角色,这样它就可以执行任何数据库操作。

所以我把我的脚本改成了下面的,效果很好。

-- The above is the same

USE testdb;

IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE type = 'S' and name = N'testlogin')
BEGIN
    CREATE LOGIN testlogin WITH PASSWORD='testlogin', DEFAULT_DATABASE=testdb, CHECK_POLICY = OFF  
    CREATE USER testlogin FOR LOGIN testlogin 
END

ALTER ROLE db_owner ADD MEMBER testlogin
© www.soinside.com 2019 - 2024. All rights reserved.