AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-92420

AABCDS's questions

Martin Hope
AABCDS
Asked: 2025-01-16 23:36:43 +0800 CST

Qual é uma boa maneira de lidar com um erro ao analisar um comando T-SQL que não existe em uma versão mais antiga do SQL Server?

  • 10

Estou tentando conceder a permissão [CONNECT ANY DATABASE] a uma conta SQL específica em várias instâncias. No entanto, um servidor está executando o SQL Server 2012 e essa permissão não foi introduzida até 2014.

Tenho procurado maneiras adicionais de lidar com esse erro específico graciosamente para que o restante do script que concede permissões adicionais seja executado. Atualmente, o script lança um erro de finalização do analisador?.

Aqui está a seção do código com o problema:

IF NOT EXISTS 
(
    SELECT *
    FROM sys.server_permissions AS perm 
        INNER JOIN sys.server_principals AS prin 
            ON perm.grantee_principal_id = prin.principal_id
    WHERE perm.permission_name = 'CONNECT ANY DATABASE' 
    AND prin.name = '<ServerPrincipal>'
)
BEGIN
    GRANT CONNECT ANY DATABASE TO [<ServerPrincipal>];
END;

O erro é: " Sintaxe incorreta perto de 'CONNECT'. "

Tentei o seguinte, mas não funcionou.

  1. Usando um bloco TRY-CATCH
  2. Adicionando lógica adicional à condição IF

AND ( SERVERPROPERTY('servername') <> '<2012ServerName>' )

Finalmente encontrei uma solução viável, mas queria aprender sobre outras maneiras pelas quais as pessoas resolveram um problema semelhante.

IF NOT EXISTS 
(
    SELECT *
    FROM sys.server_permissions AS perm 
        INNER JOIN sys.server_principals AS prin 
            ON perm.grantee_principal_id = prin.principal_id
    WHERE perm.permission_name = 'CONNECT ANY DATABASE' 
    AND prin.name = '<ServerPrincipal>'
)
AND ( SERVERPROPERTY('servername') <> '<2012ServerName>' )
BEGIN
    DECLARE @String NVARCHAR(150)
    SET @String = 'GRANT CONNECT ANY DATABASE TO [<ServerPrincipal>];';
    EXEC sp_executesql @Command = @String;
END
sql-server
  • 1 respostas
  • 379 Views
Martin Hope
AABCDS
Asked: 2018-09-18 09:27:12 +0800 CST

A tarefa de fluxo de dados do SSIS viola a restrição exclusiva, mas a inserção do servidor vinculado é bem-sucedida

  • 1

Por fim, o que estou tentando fazer é criar um pacote SSIS no ambiente de controle de qualidade para outra equipe que trunca as tabelas de destino e as inserções das tabelas de origem. No entanto, em uma tabela, ITEMMASTestou recebendo um erro devido a uma violação de restrição exclusiva ao tentar copiar os dados usando uma tarefa de fluxo de dados.

O que é estranho é que o SELECT...INSERTuso de um servidor vinculado é bem-sucedido! No entanto, não posso usar servidores vinculados porque essa outra equipe quer especificar o ambiente para a origem, então tenho que parametrizar as cadeias de conexão.

Aqui está a definição da restrição exclusiva:

ALTER TABLE [dbo].[ITEMMAST]
  ADD CONSTRAINT [ITESET1]
  PRIMARY KEY CLUSTERED 
  (
      [ITEM_GROUP] ASC,
      [ITEM] 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 = 90)
  ON [PRIMARY];

Eu tentei descartar a restrição de chave primária, copiar os dados e, em seguida, recriar a restrição de chave primária, mas isso também produz um erro.

Msg 1505, Level 16, State 1, Line 46 A instrução CREATE UNIQUE INDEX foi encerrada porque uma chave duplicada foi encontrada para o nome do objeto 'dbo.ITEMAST' e o nome do índice 'ITESET1'. O valor da chave duplicada é (SALO , ). Msg 1750, Level 16, State 0, Line 46 Não foi possível criar restrição. Veja os erros anteriores. A instrução foi encerrada.

Um desenvolvedor me deu a seguinte consulta para executar, o que me ajudou a identificar os culpados, uma linha com 32 espaços na ITEMcoluna e outra linha com o caractere ASCII de 0, um caractere nulo, na ITEMcoluna.

SELECT TOP 10 
patindex('%[^ !-~]%' COLLATE Latin1_General_BIN,ITEM) as [Position],
 substring(ITEM,patindex('%[^ !-~]%' COLLATE Latin1_General_BIN,ITEM),1) as [InvalidCharacter],
 ascii(substring(ITEM,patindex('%[^ !-~]%' COLLATE Latin1_General_BIN,ITEM),1)) as [ASCIICode]
,*
 FROM Lawson.dbo.ITEMMAST
WHERE ITEM_GROUP = 'SALO'

insira a descrição da imagem aqui

Aqui estão mais informações sobre o ambiente de controle de qualidade. Essas configurações correspondem ao nosso ambiente PROD, portanto, não consigo modificar o controle de qualidade para que isso funcione. Eu pensei em alterar a definição de restrição exclusiva e alterar o agrupamento do banco de dados de destino.

Agrupamento do banco de dados de origem: Latin1_General_BIN
agrupamento para a ITEMcoluna na tabela de origem:Latin1_General_BIN

Agrupamento de banco de dados de destino: SQL_Latin1_General_CP1_CI_AS
agrupamento para a ITEMcoluna na tabela de destino:Latin1_General_BIN

Verifiquei se a página de código do Latin1_General_BINagrupamento é 1252, que corresponde à página de código do SQL_Latin1_General_CP1_CI_ASagrupamento.

Alguém tem alguma sugestão de outras coisas que eu possa tentar? Sou novo no SSIS, então pode haver uma configuração que não configurei corretamente.

[ATUALIZAÇÃO #1]

Captura de tela mostrando o resultado da consulta a seguir da tabela de origem.

SELECT TOP 2
 CONVERT(VARBINARY(500), [ITEM])
,ITEM COLLATE SQL_Latin1_General_CP1_CI_AS AS [ITEM_Collated]
,*
FROM PROD.dbo.ITEMMAST
WHERE ITEM_GROUP = 'SALO'

insira a descrição da imagem aqui

sql-server ssis
  • 1 respostas
  • 609 Views
Martin Hope
AABCDS
Asked: 2017-09-07 10:30:18 +0800 CST

SSIS - Tarefa de fluxo de dados iterativo com diferenças de esquema

  • 0

Sou novo no SSIS e estou tentando alterar um processo atual que move dados de um servidor para outro usando um servidor vinculado para usar um pacote SSIS.

Atualmente, estou obtendo uma lista das 160 tabelas e definindo a saída para uma variável Object. Então estou usando um Contêiner de Loop Foreach para percorrer cada uma das 160 tabelas junto com uma Tarefa de Fluxo de Dados para mover os dados da origem para o destino.

A parte que estou tendo problemas é que algumas das 160 tabelas têm diferenças de esquema, ou seja, a tabela de destino não tem todas as colunas contidas na tabela de origem.

Para cada tabela, posso obter uma lista das colunas da tabela de destino e atribuir a saída a uma variável Object, mas estou preso nesse ponto e não tenho certeza de prosseguir conceitualmente.

Até agora, eliminei a opção de converter a variável Object em uma string usando uma expressão. Eu li que as expressões não podem manipular variáveis ​​de objeto.

Eu estava pensando em usar outro Foreach Loop Container para iterar pelos nomes das colunas em um esforço para construir uma string separada por vírgulas que eu poderia usar em uma expressão para se transformar em uma instrução SELECT, mas estou tendo dificuldades para construir a expressão para concatenar o nomes de coluna para a mesma variável de string.

Alguém tem sugestões conceituais sobre como posso resolver o problema de diferenças de esquema?

Estou desenvolvendo o pacote SSIS dentro do Visual Studio 2013 para uso em um servidor executando o SQL Server 2014 Standard Edition de 64 bits.

ssis schema
  • 1 respostas
  • 454 Views
Martin Hope
AABCDS
Asked: 2017-03-03 12:25:32 +0800 CST

Atualizando o valor da próxima execução do trabalho do agente

  • 1

De vez em quando, a equipe de BI da minha empresa solicita que a execução de um trabalho seja ignorada. O que tenho feito no passado é entrar no cronograma de trabalho e alterar manualmente a data de início do cronograma para amanhã. Em seguida, clico em OK no agendamento do trabalho para salvar a edição do agendamento e depois em OK na janela de propriedades do trabalho.

Vejo então que o valor da próxima execução muda de hoje ao meio-dia para amanhã ao meio-dia, que é o comportamento desejado. Em vez de fazê-lo manualmente, gostaria de realizar a mesma tarefa usando um script. Tentei atualizar a coluna active_start_date para o agendamento em [msdb].[dbo].[sysschedules], mas o trabalho acabou sendo executado ao meio-dia e teve que ser interrompido manualmente.

Alguém sabe como pular efetivamente a próxima execução de um trabalho usando um script?

Ambiente: SQL Server 2012 SP1

sql-server-agent jobs
  • 1 respostas
  • 787 Views
Martin Hope
AABCDS
Asked: 2017-01-10 13:37:25 +0800 CST

Maneira mais rápida de mover dados do banco de dados atual para várias tabelas para o novo banco de dados?

  • 4

Esta é minha primeira pergunta e postagem, então deixe-me saber se posso melhorar. Vou errar por fornecer muita informação.

Sou um DBA relativamente novo em minha empresa, há menos de dois anos com a equipe de DBA e recebi a tarefa de criar uma maneira de mover dados de um banco de dados existente para uma entidade específica para um novo banco de dados que ainda não existe . O banco de dados está em uma instância executando o SQL Server 2012 SP1 Standard edition.

Atualmente, temos um cmdlet personalizado do PowerShell chamado purge-entitydata. Este cmdlet executará uma exclusão em todas as 160 tabelas de usuário no banco de dados atual com base no valor da entidade.

Exemplo

purge-entitydata -entity <Entity>

No entanto, antes de excluir todos os dados da entidade no banco de dados atual, precisamos mover apenas os dados dessa entidade para um novo banco de dados temporário chamado [Entity_Backup] no caso de um processo downstream falhar.

Aqui estão algumas advertências:

  1. As 160 tabelas de usuários podem mudar várias vezes ao ano. Alguns podem ser excluídos ou novos podem ser adicionados. Eu estava pensando em seguir a rota do SSIS, mas não queria ter que atualizar o pacote com uma nova tarefa de fluxo de dados toda vez que uma nova tabela fosse adicionada ou removida.

  2. Apenas os dados e as próprias tabelas precisam ser movidos. Não precisarei mover exibições, procedimentos armazenados ou índices do banco de dados atual para o banco de dados temporário.

  3. O banco de dados atual e as tabelas de usuários contêm dados de mais de mil entidades. Eu só preciso mover os dados de uma entidade para o banco de dados temporário.

  4. Se o processo downstream for bem-sucedido, o banco de dados temporário será descartado.

  5. O banco de dados é grande, mais de 200 GB. Além disso, este servidor é o publicador de uma assinatura de replicação pull merge e também é o publicador de duas assinaturas de replicação de transação. Estou pensando que fazer um backup retardaria muito a replicação.

Eu estava pensando em usar sp_msforeachtable 'SELECT * INTO [Entity_Backup].? A PARTIR DE ? WHERE Entity = $Entity' e Invoke-Sqlcmd, mas estou preocupado que isso demore muito, pois não é executado em paralelo. Uma entidade tem aproximadamente três a cinco milhões de linhas.

Qual seria a maneira mais eficiente/rápida de mover dados das 160 tabelas de usuário para um novo banco de dados que pode ser feito de dentro do cmdlet do PowerShell? Alguém tem alguma sugestão que possa ser mais rápida que ms_foreachtable?

sql-server migration
  • 1 respostas
  • 1491 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve