Sql server 如何通过Azure CI/CD部署SQL脚本?
我们有很多SQL脚本(.SQL文件),我们正在从一台服务器手动部署到另一台服务器 所有SQL脚本都通过Azure中的SQL项目进行管理Sql server 如何通过Azure CI/CD部署SQL脚本?,sql-server,azure-devops,Sql Server,Azure Devops,我们有很多SQL脚本(.SQL文件),我们正在从一台服务器手动部署到另一台服务器 所有SQL脚本都通过Azure中的SQL项目进行管理 如何通过Azure CI/CD部署SQL脚本?管理数据库架构以及如何在您的环境中提升它们,应同等考虑应用程序和基础架构的部署。这里有一些高层次的指导方针 源代码管理-您需要将脚本置于源代码管理中。如果您使用的是Azure DevOps,请使用Git存储库来存储生成的所有脚本。此外,我们在源代码管理中需要它们,这样我们的CI/CD工具就可以使用它们。如果你是DBA
如何通过Azure CI/CD部署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");
}
}
//
///使用helper方法自定义DbMigration
///
基于公共抽象类的DbMigration:DbMigration
{
///
///应用存储在嵌入式资源中的SQL语句
///
///
受保护的无效SqlFromEmbeddedResource(字符串resourceName)
{
Assembly Assembly=typeof(BaseDbMigration).Assembly;
字符串baseNamespace=typeof(BaseDbMigration).Namespace;
resourceName=baseNamespace+“+”resourceName;
bool exists=assembly.GetManifestResourceNames()。其中(r=>r==resourceName)。SingleOrDefault()!=null;
如果(存在)
{
字符串sql=null;
使用(var stream=assembly.GetManifestResourceStream(resourceName))
{
变量读取器=新的流读取器(流);
sql=reader.ReadToEnd();
}
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");
}
}
//
///迁移:部署存储过程
///
公共部分类CalculateTotalsV1:BaseDbMigration
{
///
///
公共覆盖作废()
{
base.SqlFromEmbeddedResource(“sp_CalculateTotals.v1.Up.sql”);
}
///
///
公共覆盖无效向下()
{
base.sqlfromEmbeddedResource