Quero desconectar todas as conexões com o banco de dados em tempo de design ao executar o programa em computadores clientes. Porque todos eles estão conectados a outro banco de dados no momento do design e podem permanecer conectados no momento da criação de uma nova versão para lançamento. Como no onCreate nos clientes ele primeiro se conecta ao banco de dados de teste e depois meu programa (que inclui a leitura das configurações relacionadas ao banco de dados do arquivo ini e sua configuração) é executado, ocorre um erro. Além disso, eu uso componentes firedac para conectar-me ao banco de dados.
Como parte de um projeto T-SQL em um Microsoft SQL Server, estou usando um CTE de união recursiva para rastrear uma série de relacionamentos de pais filhos por meio de alguns dados hierárquicos para colocar cada elemento individual em uma linha que posso então dinamizar em um único linha.
Por exemplo, minha união recursiva CTE transformaria as seguintes linhas de A (a tabela de origem) para B (a tabela unida recursivamente) para quatro dos valores HCC. C seria o resultado desejado após o pivô.
A
NOME DO MEMBRO | NOME DOS PAIS |
---|---|
HCC_AS1 | SEC_SMI |
SEC_SMI | BRC_AND |
BRC_AND | OBU_AND |
HCC_AK4 | BRC_BOZ |
BRC_BOZ | OBU_LKY |
HCC_BH1 | OBU_BGH |
HCC_Z5 | SEC_LNG |
SEC_LNG | BRC_LYN |
BRC_LYN | OBU_LNM |
B
NOME DO MEMBRO | NOME DOS PAIS | Hierarquia | Valor |
---|---|---|---|
HCC_AS1 | SEC_SMI | SEC | SMI |
HCC_AS1 | SEC_SMI | BRC | E |
HCC_AS1 | SEC_SMI | OBU | E |
HCC_AK4 | BRC_BOZ | BRC | BOZ |
HCC_AK4 | BRC_BOZ | OBU | LKY |
HCC_BH1 | OBU_BGH | OBU | BGH |
HCC_Z5 | SEC_LNG | SEC | GNL |
HCC_Z5 | SEC_LNG | BRC | LIN |
HCC_Z5 | SEC_LNG | OBU | LNM |
C
NOME DO MEMBRO | NOME DOS PAIS | SEC | BRC | OBU |
---|---|---|---|---|
HCC_AS1 | SEC_SMI | SMI | E | E |
HCC_AK4 | BRC_BOZ | BOZ | LKY | |
HCC_BH1 | OBU_BGH | BGH | ||
HCC_Z5 | SEC_LNG | GNL | LIN | LNM |
A única coisa que estou tendo problemas é preservar o original MEMBER_NAME
e PARENT_NAME
para todo o CTE recursivo que é um requisito do projeto. Eu o envolvi em um cursor e o inseri em uma tabela temporária para que eu tivesse algo para eles verem, mas eles querem alterá-lo para uma visualização, então não acredito que meu design atual se mantenha. Não sou muito proficiente com consultas recursivas. Existe uma solução que estou perdendo e que poderia ser usada para transformar isso em uma visualização?
DECLARE @member varchar(80)
DECLARE @parent varchar(80)
CREATE TABLE #Temp
(
MEMBER_NAME varchar(80),
PARENT_NAME varchar(80),
Hierarchy varchar(80),
[Value] varchar(80)
);
DECLARE member_cursor CURSOR FOR
SELECT
[MEMBER_NAME], [PARENT_NAME]
FROM
[CACHED_OUTLINE_MEMBERS]
WHERE
DIMENSION_NAME = 'Delivery_Center'
AND LEFT(MEMBER_NAME, 3) = 'HCC'
AND LEFT(PARENT_NAME, 3) IN ('SEC', 'OBU', 'BRC')
OPEN member_cursor
FETCH NEXT FROM member_cursor INTO @member, @parent
WHILE @@FETCH_STATUS = 0
BEGIN
WITH Parent AS
(
SELECT
LEFT(PARENT_NAME, CHARINDEX('_', Parent_name) -1) AS Hierarchy,
RIGHT(Parent_name, LEN(parent_name) - CHARINDEX('_', Parent_name)) AS [Value]
FROM
[CACHED_OUTLINE_MEMBERS]
WHERE
MEMBER_NAME = @member
UNION ALL
SELECT
LEFT(C.PARENT_NAME, CHARINDEX('_', C.Parent_name) -1) AS Hierarchy,
RIGHT(C.Parent_name, LEN(C.parent_name) - CHARINDEX('_', C.Parent_name)) AS [Value]
FROM
[CACHED_OUTLINE_MEMBERS] C
INNER JOIN
Parent ON C.member_name = parent.parent_name
WHERE
LEFT(C.PARENT_NAME, CHARINDEX('_', C.Parent_name) -1) IN ('SEC', 'OBU', 'BRC')
)
INSERT INTO #Temp
SELECT
@member AS MEMBER_NAME, @parent AS PARENT_NAME, Hierarchy, [Value]
FROM
Parent
FETCH NEXT FROM member_cursor INTO @member, @parent
END
CLOSE member_cursor
DEALLOCATE member_cursor
SELECT * FROM #Temp
Tentei o cursor, mas foi aí que pensei que poderia ser apenas uma tabela construída uma vez por dia. Eles querem que seja uma visualização, então eu teria que criar um design que não usasse cursor.
Antes de chegar a um CTE recursivo, tentei apenas fazer uma tabela de autojunção, mas o relacionamento pai-filho dos dados não é consistente. Alguns valores HCC não têm SEC ou BRC ou ambos, portanto, apenas fazer três auto-junções às vezes levaria OBUs às colunas SEC ou BRC.
Eu tenho 2 tabelas:
Fatura
CustomerInvoiceID - PK
RecordLocator - Text
createdDate - date
Fatura Simplificada
CustomerInvoiceID - PK / FK Invoices
CountryCode - text
VatPercentage - number
SubtotalAmount - number
TotalAmount - number
Se eu executar a seguinte consulta:
select
si.CountryCode,
si.RecordLocator,
si.CustomerInvoiceID,
i.CreatedDate,
i.VatPercentage,
si.SubTotalAmount,
si.TotalAmount
from
SimpliedInvoice si , invoice i
where
si.CustomerInvoiceID = i.CustomerInvoiceID
and si.CountryCode = 'GR'
Meu resultado é um conjunto de dados vazio.
Mas se eu executar esta consulta:
select *
from SimpliedInvoice
where CustomerInvoiceID in (select CustomerInvoiceID
from Invoice
where CountryCode = 'GR')
Eu recebo muitos dados.
Não consigo entender por que, alguma ideia?
Com a introdução do novo módulo SQL Server PS, a Microsoft tornou o parâmetro -Encrypt obrigatório para o cmdlet Invoke-Sqlcmd.
Invoke-Sqlcmd -ServerInstance $server -query $sql -Encrypt Optional
Em nosso ambiente:
- Temos um módulo PowerShell personalizado contendo inúmeras chamadas Invoke-Sqlcmd.
- Gerenciamos milhares de servidores, cada um com diferentes versões do módulo SQL Server PS.
Dada a variabilidade nas versões do módulo PS do SQL Server em nossos servidores, pretendemos aproveitar a opção de parâmetro padrão no PowerShell. Para conseguir isso, incluímos a seguinte linha no perfil $PROFILE.AllUsersAllHosts :
$PSDefaultParameterValues['Invoke-Sqlcmd:Encrypt'] = 'Optional'
Essa configuração funciona perfeitamente para scripts executados no Visual Studio Code. No entanto, as funções em nosso módulo personalizado que chamam Invoke-Sqlcmd encontram falhas. Para resolver isso, implementamos uma abordagem alternativa criando uma função no módulo com a seguinte linha:
$PSDefaultParameterValues['Invoke-Sqlcmd:Encrypt'] = 'Optional'
Conseqüentemente, antes de utilizar qualquer função do módulo, executamos a função responsável por definir o valor opcional.
Considerando esses desafios, existe alternativa mais eficiente? Além disso, quando um módulo PowerShell é carregado, em qual escopo ele opera? Como podemos estabelecer o valor opcional dentro desse escopo?
Estou tentando aprender como usar migrações do Entity Framework Core, mas recebo o seguinte erro:
Não foi possível criar um 'DbContext' do tipo ''. A exceção 'Nenhum construtor adequado foi encontrado para o tipo de entidade 'Movie'. Os seguintes construtores tinham parâmetros que não podiam ser vinculados a propriedades do tipo entidade:
Não é possível vincular 'pontos negativos', 'pontos positivos', 'comentários' em 'Movie (int pontos negativos, int pontos positivos, comentários da lista, título da string, tipo MediaType)'
Observe que apenas propriedades mapeadas podem ser vinculadas a parâmetros do construtor. As navegações para entidades relacionadas, incluindo referências a tipos de propriedade, não podem ser vinculadas.' foi lançado ao tentar criar uma instância. Para conhecer os diferentes padrões suportados em tempo de design, consulte https://go.microsoft.com/fwlink/?linkid=851728
Pelo que entendi e pesquisei não é possível realizar o Add-Migration
procedimento com classes abstratas, você poderia confirmar ou me dar uma dica?
Testei o procedimento com uma classe simples sem usar Media e não tive problemas.
Esta é a minha DbContext
aula:
public class AppDbContext : DbContext
{
public IConfiguration _config { get; set; }
public AppDbContext(IConfiguration config)
{
_config = config;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_config.GetConnectionString("DatabaseConnection"));
}
public DbSet<Movie> Movie { get; set; }
//public DbSet<Game> Game { get; set; }
//public DbSet<User> User { get; set; }
}
Minha Media
classe:
public abstract class Media
{
public Guid Id { get; set; }
public int? NegativePoints { get; set; }
public int? PositivePoints { get; set; }
public List<Comment>? Comments { get; set; }
public string Title { get; set; }
public MediaType Type { get; set; }
public Media(int negativePoints, int positivePoints, List<Comment> comments, string title, MediaType type)
{
Id = new Guid();
NegativePoints = negativePoints;
PositivePoints = positivePoints;
Comments = comments;
Title = title;
Type = Type;
}
}
Minha Movie
classe:
public class Movie : Media
{
public string? Director { get; set; }
public string? Genre { get; set; }
public DateTime? Release { get; set; }
public string? AgeRating { get; set; }
public string? Synopsis { get; set; }
public List<string>? Actors { get; set; }
public TimeOnly? Duration { get; set; }
public string? Language { get; set; }
public string? ContryOrigin { get; set; }
public string? ProductionStudio { get; set; }
public string? Trailer { get; set; }
public Movie(int negativePoints, int positivePoints, List<Comment> comments, string title, MediaType type) : base(negativePoints, positivePoints, comments, title, type)
{
Type = MediaType.Movie;
Director = null;
Genre = null;
Release = null;
AgeRating = null;
Synopsis = null;
Actors = new List<string>();
Duration = null;
Language = null;
ContryOrigin = null;
ProductionStudio = null;
Trailer = null;
}
}
Se você tiver alguma sugestão adicional, ficarei feliz em ouvi-lo.
Estou usando o .NET 8.0
Estou tentando gerar e duplicar vários UNIQUEIDENTIFIER
valores usando NEWID()
como dados de teste. A seguir, minha tentativa é primeiro gerar valores N1 e, em seguida, usar a CROSS APPLY
para duplicar esses valores N2 vezes cada:
SELECT *
FROM (
SELECT
S1.value,
NEWID() AS Id
FROM GENERATE_SERIES(1, 3) S1
) S1
CROSS APPLY (
SELECT
S2.value,
S1.Id -- Trying to repeat the same ID value multiple times
FROM GENERATE_SERIES(1, 2) S2
) S2
ORDER BY S1.Value, S2.Value
Resultados desejados:
valor | Eu ia | valor | Eu ia |
---|---|---|---|
1 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb | 1 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb |
1 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb | 2 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb |
1 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb | 3 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb |
2 | 4743c229-0c3c-44fd-b9f8-9406b06e350e | 1 | 4743c229-0c3c-44fd-b9f8-9406b06e350e |
2 | 4743c229-0c3c-44fd-b9f8-9406b06e350e | 2 | 4743c229-0c3c-44fd-b9f8-9406b06e350e |
2 | 4743c229-0c3c-44fd-b9f8-9406b06e350e | 3 | 4743c229-0c3c-44fd-b9f8-9406b06e350e |
Resultados reais:
valor | Eu ia | valor | Eu ia |
---|---|---|---|
1 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb | 1 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb |
1 | 8dbf1b38-f6af-4b7e-9b3d-65f3df4bb017 | 2 | 8dbf1b38-f6af-4b7e-9b3d-65f3df4bb017 |
1 | 2eddb5e1-4f3e-4938-ab7b-49740a20a779 | 3 | 2eddb5e1-4f3e-4938-ab7b-49740a20a779 |
2 | 4743c229-0c3c-44fd-b9f8-9406b06e350e | 1 | 4743c229-0c3c-44fd-b9f8-9406b06e350e |
2 | f8a66f07-04da-44ab-af7b-47a747dc6bf6 | 2 | f8a66f07-04da-44ab-af7b-47a747dc6bf6 |
2 | 034876b6-8cf5-4264-810d-de5202554d77 | 3 | 034876b6-8cf5-4264-810d-de5202554d77 |
Entendo que NEWID()
isso gerará valores exclusivos para cada linha onde for usado, mas teria pensado que, quando usados em uma subconsulta, os valores seriam gerados nessa subconsulta em vez de serem gerados no nível mais externo. Não consigo encontrar uma explicação clara desse comportamento na documentação do NEWID ou em outro lugar.
Tentei inserir cálculos intermediários usando CAST()
, TOUPPER()
e REPLACE()
, que achei que poderiam capturar e solidificar os NEWID()
valores. Também tento encerrar a primeira parte em um CTE. Ainda não consigo repetir os valores gerados.
Posso fazer isso em várias etapas usando uma tabela #temp ou uma variável @table, mas queria saber se existe uma maneira de fazer isso em uma única instrução.
Aqui está outro caso semelhante:
-- Another similar case
WITH CTE AS (
SELECT NEWID() AS Id -- Is this one value or many?
)
SELECT *
FROM ( VALUES (1), (2), (3) ) ID(Id)
CROSS JOIN CTE
Seguir:
Eu descobri uma pergunta semelhante no dba stackexchange que me apontou para um relatório e discussão de bug do Microsoft Connect de 15 anos , que terminou com o relatório de bug sendo fechado como não será corrigido, funções conforme projetado. A justificativa é que "o otimizador não garante o tempo ou o número de execuções de funções escalares" e "é muito difícil definir com precisão ... o que significa o comportamento uma vez por linha ".
Essa mesma postagem teve um comentário tardio que encontrou uma solução alternativa usando uma combinação de GROUP BY
e FULL OUTER JOIN
para persuadir o comportamento desejado, mas comentários posteriores sugerem que esse ainda era um comportamento indefinido.
Também encontrei alguma documentação on-line de livros antigos de 2005 que inclui uma prática recomendada: "Limitar o uso de funções não determinísticas às listas de seleção mais externas". Não consegui encontrar o mesmo na documentação atual, mas talvez não estivesse procurando no lugar certo.
Portanto, embora a resposta de ValNik abaixo sugira uma solução alternativa envolvendo GROUP BY
, acho que isso também é construído em terreno instável. (A resposta de ValNik, na verdade, começa com um comentário “não faz sentido”.)
Também descobri que adicionar uma IS NOT NULL
verificação também estimula o resultado desejado ( violino ). Novamente, este é provavelmente um comportamento indefinido que parece funcionar - é melhor evitar.
Resumindo, provavelmente é melhor seguir a antiga prática "Limitar o uso de funções não determinísticas às listas de seleção mais externas", o que significa selecionar uma tabela temporária ou variável de tabela, conforme recomendado por Thom A e documentado como resposta.
Estou usando ASP.NET Core 8, Entity Framework e Linq para conectar-me a um banco de dados SQL Server, mas estou recebendo este erro
System.InvalidOperationException: a propriedade ConnectionString não foi inicializada
ao tentar buscar dados do banco de dados SQL Server. Não estou usando Startup.cs
- em vez disso, estou usando program.cs
.
Aqui está o meu código:
public class MasterDAL : IMasterDAL
{
private readonly MyDbContext _context;
IConfiguration _configuration;
public MasterDAL(MyDbContext context, IConfiguration configuration)
{
_context = context;
_configuration = configuration;
}
public IEnumerable<CategoryViewModel> getCategory()
{
List<CategoryViewModel> categoryModel = new List<CategoryViewModel>();
categoryModel = (from cat in _context.CategoryMasters.AsNoTracking()
select new CategoryViewModel
{
CategoryId = cat.CategoryMasterId,
CategoryName = cat.CategoryName
}).Distinct().ToList();
return categoryModel;
}
}
DbContext
:
public partial class MyDbContext : DbContext
{
private readonly IConfiguration _config;
public MyDbContext (DbContextOptions<MyDbContext> options)
: base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(ConfigHelperDB.GetConnectionString("DefaultConnection"),
options => options.EnableRetryOnFailure());
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<CategoryMaster>(entity =>
{
entity.HasKey(e => e.CategoryMasterId)
.HasName("PK_CategoryMaster_CategoryMasterId");
entity.Property(e => e.CreatedDate)
.HasDefaultValueSql("(getdate())");
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
Program.cs
:
builder.Services.AddDbContextPool<MyDbContext>(
options => options.UseSqlServer(ConfigHelperDB.GetConnectionString("DefaultConnection"),
options => options.EnableRetryOnFailure()));
builder.Services.AddScoped<DbContext, MyDbContext>();
Por favor me ajude a resolver esse erro.
Eu tentei remover
builder.Services.AddScoped<DbContext, ExpenseDbContext>();
também tentei adicionar
builder.Services.AddTransient<DbContext, ExpenseDbContext>();
Atualizamos nosso servidor SQL para a versão mais recente de 2022 para esperar um melhor desempenho, mas ele é o oposto até mesmo para consultas simples. Como a consulta abaixo, que é executada no nível de compatibilidade 100 com apenas 250 leituras lógicas e executada em 10 milissegundos. Se alterarmos o nível de compatibilidade para 160 , suas leituras aumentarão para 12.000 e a duração para 270 ms.
SELECT TOP 1 id, detail
FROM shopdetail WITH (NOLOCK)
WHERE id> 589530 AND detail <>''
ORDER BY id ASC
Quando verificamos o plano de execução, ele foi alterado para varredura de índice a partir de busca de índice.
Alguém pode ajudar como fazer com que o otimizador use planos eficientes além de usar as dicas de opções?
A coluna ID é a chave primária e a coluna de detalhes possui o índice não clusterizado.
ALTER TABLE [dbo].[shopdetail] ADD CONSTRAINT [pk_shopdetailID] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO
Estou tentando descartar uma tabela:
drop table if exists bronze.LawAggregatedPipelineSummary;
go
Mas há uma restrição FK nisso:
Não foi possível eliminar o objeto 'bronze.LawAggregatedPipelineSummary' porque ele é referenciado por uma restrição FOREIGN KEY.
Tentei identificar a restrição, mas não consegui encontrá-la por meio de sp_fkeys
. Cada uma das quatro invocações a seguir sp_fkeys
foi tentada: mas ficou vazia:
exec sp_fkeys 'bronze.LawAggregatedPipelineSummary'
exec sp_fkeys 'LawAggregatedPipelineSummary'
exec sp_fkeys @pktable_name = 'bronze.LawAggregatedPipelineSummary'
exec sp_fkeys @pktable_name = 'LawAggregatedPipelineSummary'
Então eu tenho dois bancos de dados no mesmo servidor
- DB_TEST
- DB_DEVELOP
Quero fazer uma cópia completa do DB_TEST com todos os dados e as estruturas da tabela e tudo mais e alterar o DB_DEVELOP para ficar igual.
Eu sei que fiz algo parecido quando estava criando o DB_DEVELOP , mas não tenho certeza de como fazer isso agora e quero deixar o DB_DEVELOP com o mesmo nome e permissões que ele tem para poder trabalhar na aplicação no modo de desenvolvimento mas usando o banco de dados DB_DEVELOP para não deixar algo no banco de dados DB_TEST que será um banco de dados de produção mais tarde
O que eu tentei
Criei um backup do DB_TEST mas não consigo vê-lo no DB_DEVELOP quando clico em restaurar.
Script de banco de dados como CREATE To
mas quando executo o script no DB_DEVELOP ele não funciona.
O banco de dados de script com esquema e dados não inseriu todos os dados do primeiro banco de dados.
Copie o banco de dados que resulta no seguinte erro:
É importante que o nome e o banco de dados de destino permaneçam os mesmos.
Tentei excluir o banco de dados Develop para criar um novo, conforme descrito em uma resposta a uma pergunta semelhante, obtendo um erro: 3702
Não tenho conhecimento de que algum usuário esteja usando o banco de dados, meu aplicativo não está executando, pelo menos a versão que se conecta a este banco de dados e em meu SSMS não tenho nenhum painel aberto com o referido banco de dados