将 VS 2019 Professional 升级到最新版本 16.10.0。打开一个已有的SSDT工程,双击工程中任意一个sql脚本文件,在tab窗口中无法打开该文件。
如果 sql 脚本定义了一个表,我可以看到消息:设计图面正在加载。我可以看到设计和脚本表面之间的分隔符。如果我拖动分隔符来调整曲面的大小,窗口会刷新并且脚本将正确打开。
如果 sql 脚本定义了视图或存储过程,我只会看到空白的选项卡窗口。我没有看到任何消息。
如果我重新启动 VS2019,之前打开的脚本工作正常。但是每当我想打开一个在重新启动之前没有打开的脚本时,仍然是同样的问题。
我们已经开始使用SSDT来管理脚本部署。最初,我们使用Schema Compare并取消选中了我们不想部署的部分。现在,我们需要使用仅包含在“发布”功能中的“预部署”和“部署后”脚本,并且我们还尝试清理排除的部分。
在发布中添加了2个差异,但没有在“模式比较”中添加这些差异,即使设置与我可以设置的相近,我似乎也无法弄清。
首先是Publish脚本想要删除dacpac中不存在的表的统计信息,即使DropStatisticsNotInSource将其设置为false。我能够根据SSDT / SqlPackage丢弃统计信息中的DeploymentFilterContributor答案来解决此问题。
第二个继续让我难过。大多数应用程序安全性都是通过授予角色来实现的,并且取决于环境,使各个系统帐户成为成员,但是在dev数据库中,也没有角色的用户(通常是管理员,但具有各种权限的实用程序)。我们在不同的环境中有不同的用户。我的长期目标是仅让用户担任角色,但我们还没有。同时,我们需要将用户排除在外。我从设置Exclude Users,开始ExcludeLogins,ExcludeRoleMembership这是我们在“模式比较”中使用的功能,并且效果很好。但是,在“发布”脚本中,我们获得了REVOKE CONNECT脚本(但不是DROP LOGIN或DROP USER)。
我已经阅读了使用SqlPackage.exe发布DACPAC时防止用户掉线,以及在SqlPackage.exe部署的dacpac中创建用户时导致登录失败SqlException(这看起来像是类似的脚本结果,目的不同,也没有答案)。我曾尝试使用AgileSqlClub.DeploymentFilterContributor有IgnoreType(Login),IgnoreType(User),IgnoreType(RoleMembership),以及IgnoreType(Permissions),IgnoreSecurity。前3个无效。最后2个(我也尝试过等效的SSDT config选项)也删除GRANT了我想针对数据库角色包含的脚本。
我觉得我应该能够执行此操作而无需创建自定义项DeploymentContributor,也无需在部署后编写所有这些用户的脚本。我如何摆脱这些REVOKE CONNECT电话?
另外,如果有人知道Visual Studio是否实际上在其路径中调用SqlPackage.exe或正在使用库,那么我将很感激该信息...我似乎无法使计算机上的5个SqlPackage.exe中的任何一个都能正常工作VS使用的内置.dacpac和.publish.xml文件。
我包含完整的发布配置文件以供参考:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AdditionalDeploymentContributors>AgileSqlClub.DeploymentFilterContributor</AdditionalDeploymentContributors>
<!--AdditionalDeploymentContributorArguments>SqlPackageFilter0=IgnoreType(Statistics);SqlPackageFilter1=IgnoreType(Login);SqlPackageFilter2=IgnoreType(User);SqlPackageFilter3=IgnoreType(RoleMembership);SqlPackageFilter4=IgnoreSchema(SEQUENCES)</AdditionalDeploymentContributorArguments-->
<!--AdditionalDeploymentContributorArguments>SqlPackageFilter4=IgnoreSchema(SEQUENCES)</AdditionalDeploymentContributorArguments-->
<AdditionalDeploymentContributorArguments>SqlPackageFilter0=IgnoreType(Statistics);SqlPackageFilter1=IgnoreSecurity</AdditionalDeploymentContributorArguments>
<IncludeCompositeObjects>True</IncludeCompositeObjects>
<TargetDatabaseName>BRM</TargetDatabaseName>
<DeployScriptFileName>BRM.sql</DeployScriptFileName>
<TargetConnectionString>Data Source=mydb;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True</TargetConnectionString>
<BlockOnPossibleDataLoss>True</BlockOnPossibleDataLoss>
<ExcludeAggregates>False</ExcludeAggregates>
<ExcludeApplicationRoles>False</ExcludeApplicationRoles> …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 EFCore:Square和Position. 位置有一个(位置)多(正方形)与名为平方关系squares,还有两个一-到-之间的一个关系Square命名enPassentTakablePawnOfWhite和enPassentTakablePawnOfBlack。请注意,两个实体中的 FK 和 PK 都是阴影属性:
public class PositionTypeConfiguration : IEntityTypeConfiguration<Position>
{
public void Configure(EntityTypeBuilder<Position> builder)
{
builder.ToTable("Positions");
builder.Property<Guid>("BoardId");
builder.Property<Guid?>("CurrentPositionId");
builder.HasOne<Board>().WithMany("previosPositions").HasForeignKey("BoardId");
builder.HasOne<Board>().WithOne("currentPosition").IsRequired(false).HasForeignKey<Position>("CurrentPositionId");
builder.HasMany<Square>("squares").WithOne().HasForeignKey("PositionId");
builder.Property<Guid?>("EnPassentTakableWhitePawnId");
builder.Property<Guid?>("EnPassentTakableBlackPawnId");
builder.HasOne<Square?>("enPassentTakablePawnOfWhite").WithOne().HasForeignKey<Position>("EnPassentTakableWhitePawnId");
builder.HasOne<Square?>("enPassentTakablePawnOfBlack").WithOne().HasForeignKey<Position>("EnPassentTakableBlackPawnId");
builder.Property("canWhiteCastleKingSide");
builder.Property("canWhiteCastleQueenSide");
builder.Property("canBlackCastleKingSide");
builder.Property("canBlackCastleQueenSide");
builder.Property("_50MovesRuleCounter");
builder.Property<Guid>("Id").ValueGeneratedOnAdd();
builder.HasKey("Id");
}
}
Run Code Online (Sandbox Code Playgroud)
public class SqaureTypeConfiguration : IEntityTypeConfiguration<Square>
{
public void Configure(EntityTypeBuilder<Square> builder)
{
builder.ToTable("Sqaures");
builder.Property(s => s.File);
builder.Property<Guid>("PositionId");
builder.Property(s => s.Row);
//this is FK to some other, irrelavant entity.
builder.HasOne(s => s.Occupier).WithOne().IsRequired(false).HasForeignKey<Square>("OccupierId").IsRequired(false);
builder.Property<Guid>("Id"); …Run Code Online (Sandbox Code Playgroud)