当连接字符串中的登录/用户既不是"所有者",也没有分配"db_owner"角色时,我试图理解为什么DbUp Upgrade在dbo授权下创建模式的根本原因.
为了详细说明,假设我使用sa帐户手动创建了以下内容:
- 服务器登录名MyTestUser,它只有一个服务器角色-PUBLIC.
- -数据库MyTest.
- 数据库用户MyTestUser,它映射到MyTestUser登录帐户,该用户最初不拥有任何架构,并且包含以下数据库角色:db_backupOPERATOR、db_datareader、db_dataWriter、db_ddladmin
现在,假设我有创建模式的初始脚本:
DECLARE @User NVARCHAR(MAX)
SET @User = (SELECT CURRENT_USER)
DECLARE @Sql NVARCHAR(MAX)
SET @Sql = 'CREATE SCHEMA [MyTestSchema] AUTHORIZATION ' + @User;
EXEC(@Sql)
如果我使用MyTestUser登录到数据库,并直接在数据库上执行SQL,我会得到期望的结果,其中新模式的所有者是MyTestUser.
现在,每当我使用DbUp for SQL Server(MyTestUser是在连接字符串中指定的)运行升级时,在dbo下创建相同的架构--这不是我想要的.DbUp为新数据库创建的初始模式也会发生这种情况.我用的是dbup-sqlserver 4.6.0 Nuget.
执行升级的代码:
var upgradeEngine = DeployChanges.To
.SqlDatabase(databaseSettings.Value.ConnectionString, databaseSettings.Value.DefaultSchema)
.JournalToSqlTable(databaseSettings.Value.DefaultSchema, "SchemaVersions")
.WithScriptsFromFileSystem(scriptsPath)
.LogTo(upgradeLog)
.Build();
var result = upgradeEngine.PerformUpgrade();
为了清楚起见,下面是连接字符串:
数据源=LOCALHOST\SQL EXPRESS;初始目录=MyTest;用户 ID=MyTestUser;密码=超级机密;集成 安全性=True;多个ActiveResultSets=False
我很难理解为什么这两个过程会有不同,也许有人能给我一些启发?