当连接字符串中的登录/用户既不是"所有者",也没有分配"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

我很难理解为什么这两个过程会有不同,也许有人能给我一些启发?

推荐答案

事实证明,这种行为是由于我自己没有意识到连接字符串的内容.通过设置integrated security=True,我告诉升级程序使用我的Windows凭据,从而忽略连接字符串中指定的凭据.一旦我将其设置为FALSE,一切都变得井然有序.

Sql相关问答推荐

如何将多个 Select 查询从一个表中组合出来

SQL—如何在搜索的元素之后和之前获取元素?

Postgres trunc_date删除一个月

按每天的最大值分组

如何在PostgreSQL中的一列中添加两个文本?

Oracle 23c ROUND,数据类型为DATE

如何在SQL中从多个查询进行分组

SQL仅返回第一个字母在A-Z之间的值

SQL:使用年/月/日分区查询某个时间段的数据

将SQL Server查询改进为;线程安全;

根据具有特定值的 ID 创建自定义组

将最近的结束日期与开始日期相匹配

每个ID的SQL返回可能的最低级别及其值

计数时如何为所有时间间隔返回 0 而不是什么都不返回

使用其他表 SUM 的交换价格转换价格并获得 AVG

在 postgresql 中保存带有时间戳的几何类型数据

具有关联统计信息 N+1 的 Rails 6 索引资源?

使用 JSON_BUILD_OBJ 从 Postgres 返回 JSON

SQL/Postgres:按日期和其他属性对相关性能进行分组

从 JSON 数组中移除对象