最近,我创建了一个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
经过研究,我发现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