我们有一堆SQL脚本(.sql文件),我们手动将其从一个服务器部署到另一个服务器。
所有SQL脚本都通过Azure中的SQL Project进行管理。
如何通过Azure CI / CD部署SQL脚本?
管理数据库模式以及如何在环境中进行升级应同等考虑应用程序和基础架构部署。这是一些高级指南。
更新:使用实体框架
从上面列出的方法可以看出,我显然非常有兴趣将数据库架构更改限制在特定用户帐户,以防止使用具有不受限制访问权限的用户帐户意外部署应用程序。您的里程可能会有所不同,但您可以使用以下几种方法:
请注意,将存储过程作为资源嵌入到迁移中是完全可行的,然后只需从迁移中调用原始sql语句:
基础迁移:
/// <summary>
/// Custom DbMigration with helper methods
/// </summary>
public abstract class BaseDbMigration : DbMigration
{
/// <summary>
/// Apply a SQL statement stored in an embedded resource
/// </summary>
/// <param name="resourceName"></param>
protected void SqlFromEmbeddedResource(string resourceName)
{
Assembly assembly = typeof(BaseDbMigration).Assembly;
string baseNamespace = typeof(BaseDbMigration).Namespace;
resourceName = baseNamespace + "." + resourceName;
bool exists = assembly.GetManifestResourceNames().Where(r => r == resourceName).SingleOrDefault() != null;
if (exists)
{
string sql = null;
using (var stream = assembly.GetManifestResourceStream(resourceName))
{
var reader = new StreamReader(stream);
sql = reader.ReadToEnd();
}
base.Sql(sql);
}
}
}
示例迁移:
/// <summary>
/// Migration: Deploy Stored Proc
/// </summary>
public partial class CalculateTotalsV1 : BaseDbMigration
{
/// <summary>
/// </summary>
public override void Up()
{
base.SqlFromEmbeddedResource("sp_CalculateTotals.v1.Up.sql");
}
/// <summary>
/// </summary>
public override void Down()
{
base.SqlFromEmbeddedResource("sp_CalculateTotals.v1.Down.sql");
}
}
此外,如果您希望将数据库迁移与应用程序部署分开,则应该不要说您希望将代码优先迁移分离到自己的.net程序集中。这样可以更轻松地调用迁移。