数据库项目视图中的动态变量

Dynamic variables in Database Project views

我有一个包含一些视图的数据库项目。

视图的行为应根据它们发布到的环境而有所不同。

发布到开发环境时,INNER JOIN 应该为目标架构名称使用特定前缀,并在测试环境中使用另一个前缀。

有可能实现吗?在下面的代码片段中,id喜欢在本地开发和发布到开发环境时使用Hub,发布到测试时使用ISA。

示例:

CREATE VIEW [ISA].[v_CoveredRisk]
    AS SELECT
                CR.Bkey_CoveredRisk_Unique
                ,CO.Bkey_Coverage_Unique
                ,CO.Name
                ,PO.EKey_Policy
                ,CoObj.Bkey_CoveredObject
                ,CoObj.BKey_Building
                ,CoObj.Bkey_Home
                ,CoObj.BKey_Object
                ,CoObj.BKey_Person
                ,CoObj.BKey_Pet
                ,CoObj.BKey_Vehicle
                ,Risk_Excess
                ,Risk_Sum
                ,CAST(CurrentYearPremiumAmount AS float) AS CurrentYearPremiumAmount
                ,IsActive
                ,PO.BKey_Policy
                ,CR.Record_Timestamp

     FROM Hub.[CoveredRisk] CR
     INNER JOIN Hub.Coverage CO ON CR.EKey_Coverage = CO.EKey_Coverage
     INNER JOIN Hub.CoveredObject CoObj ON CR.EKey_CoveredObject = CoObj.EKey_CoveredObject
     INNER JOIN Hub.[Policy] PO ON CR.EKey_Policy = PO.Ekey_Policy

有一个生成您的 SQL 脚本的 T4 模板

在您的模板中找出您运行反对的环境...相应地创建输出

要找出您需要为哪个环境生成输出,请查看发布配置文件和配置特定变量(a.k.a。"conditional compilation symbols" 在项目的构建属性中)

你可以探查T4模板中的那些

您不能在架构或对象名称中使用变量。如果你真的想实现你所说的,我可以建议你两种方式:

  1. 你不会用变量来控制它,但你会用发布配置来控制它。您可以在 sqlproj 文件中使用条件语句。所以,我创建了 2 个视图:

    创建视图 [HUB]。[View1] AS SELECT 1 为一;

    创建视图 [ISA].[View1] AS SELECT 1 为一;

然后在 sqlproj 文件中我做了以下事情:

<Build Include="View1.sql" />
<None Include="View1.sql"  Condition=" '$(Configuration)' == 'Debug'" />
<None Include="View1_1.sql" />
<Build Include="View1_1.sql"  Condition=" '$(Configuration)' == 'Release' " />

然后在部署时选择正确的发布配置

注意:您需要在构建中包含和排除相同的文件才能实现这一点。

  1. 这是一种更简单的方法。始终使用相同的视图创建视图并将其移动到发布脚本中的正确模式。例如:

    IF DB_NAME() = 'Dev' 执行 sp_rename ....

第一件事是您应该删除此要求并在所有数据库中使用相同的代码。您几乎 100% 肯定会在某个时候犯错,并部署一些在不同环境中不起作用的东西。

如果您确实想这样做,您可以使用同义词来实现 - 在您的视图中引用同义词并将其指向相应的模式。您无法获得直接指向模式的同义词,但可以获取模式中的对象,因此如果您有:

  • 开发 table devSchema.table
  • 生产 table prodSchema.table

在 dev 中,有一个同义词,如:

create synonym Hub.table for devSchema.table

然后你的视图引用 Hub.table 它将被解析给开发者 table。