Como ocultar / desativar tabelas sem soltá-las para verificar a redundância?

12

Eu tenho que manter e estender um sistema legado antigo que contém métodos de serviço da web e tabelas de banco de dados que não são mais usadas. Como não tenho certeza de que as tabelas sejam realmente redundantes, tenho medo de descartá-las.

Existe alguma outra maneira de obter o mesmo efeito (as tabelas não podem mais ser usadas) sem descartá-las? Minha idéia foi transferi-los para um esquema diferente (por exemplo, Deleted) do padrão atual dbo,.

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted')
BEGIN
   EXEC('CREATE SCHEMA Deleted')
END

ALTER SCHEMA Deleted TRANSFER dbo.TableName;

Existe alguma outra opção ou existem desvantagens na abordagem de esquema?

Tim Schmelter
fonte

Respostas:

7

Existe alguma outra maneira de conseguir o mesmo (as tabelas não podem mais ser usadas) sem descartá-las?

Uma alteração de esquema é uma operação muito rápida - apenas a alteração de metadados é necessária. A idéia original que tive foi do blog de Aaron Bertrand - Schema Switch-A-Roo .

Você pode seguir os passos da minha resposta aqui

Obviamente existem outros métodos como sp_rename N'old table ', N'new table' ou apenas negam permissões para a tabela.

Kin Shah
fonte
Eu não tinha certeza de qual resposta eu deveria aceitar, porque todas são úteis. Eu não conhecia o artigo de Aaron, então aceitei, pois ele contém mais informações (mesmo que apenas vinculadas).
Tim Schmelter
@ TimSchmelter Ainda bem que você achou útil. Não faz sentido repetir aqui o que o artigo ou minha resposta (vinculado). É por isso que eu o referenciei.
Kin Shah
12

Algumas outras opções são apenas renomear as tabelas ou, se elas tiverem índices agrupados, você poderá desativar o índice agrupado.

Chad Mattox
fonte
Obrigado. Eu não sabia que desabilitar um índice clusterizado torna a tabela inutilizável. Quais são os prós e os contras dessas abordagens (+ esquema)?
Tim Schmelter
5
O @TimSchmelter para desabilitar o IC é que, para habilitá-lo novamente, você precisa reconstruir o índice. Uma outra opção é negar permissões na tabela para a função pública, embora o proprietário do banco de dados ou os administradores do sistema ainda as vejam e também possivelmente através do encadeamento de propriedade.
Martin Smith
Antes de soltar uma tabela ou soltar uma coluna de uma tabela, eu geralmente a renomeio adicionando "_deprecated" ou algo parecido ao final do nome. Então, se não houver erros, não deve haver nada fazendo referência a ele.
21716 Jay
As alterações nas permissões são arriscadas. Se a conta de serviço que estiver executando um aplicativo for o dbo, ou pior, o sysadmin, ignorará completamente qualquer tipo de DENY. Espero que não, mas acontece.
Kenneth Fisher
6

Remova as permissões na tabela das funções / grupos / contas / contas que [podem] estar usando.

Se algo explodir, coloque-o de volta [rapidamente].

Dica: Usar um script para fazer essas alterações seria uma idéia muito, muito boa.

Phill W.
fonte
Como testaria em um banco de dados de não produção. ;) Felizmente, isso era óbvio para o OP.
Jpmc26
@ jpmc26. primeiro testarei em um banco de dados de não produção. Mas o problema é que eu quero saber se funções ou objetos de banco de dados são usados ​​de fora (não apenas pelos métodos de serviço da web, mas também diretamente no banco de dados ou nas ferramentas administrativas de outros locais da empresa).
Tim Schmelter
Hum. Se você está procurando acesso direto ao banco de dados por DBAs, parece que o log está em ordem. Pode não ser muito provável que você veja o mesmo uso no trabalho manual e não profissional. Não tenho muita certeza de quão fácil seria registrar essas operações, mas se você tiver um produto de login, poderá analisá-lo para procurar usos.
Jpmc26 18/05
@ jpmc26: tudo bem se esses administradores caírem de cara no chão, eles o denunciarão. Não está bem com os clientes, mas isso pode ser verificado no sistema de teste antes do lançamento.
Tim Schmelter
3

A remoção de permissões geralmente não vai funcionar porque você não pode CERTINIR que alguém não tem permissões. Possivelmente através de um grupo, função ou mesmo porque são administradores de sistemas (embora esperemos que não).

Para tabelas, você pode desativá-las. E esse é um processo rápido. No entanto, para ativá-los, é necessário reconstruí-los e criar uma tabela grande que pode demorar um pouco.

Sua melhor aposta será mover o objeto para um novo esquema (como você sugeriu) ou renomeá-lo. Ambas as operações são rápidas e fáceis de fazer e desfazer. As permissões também permanecerão em vigor nas duas direções.

Uma etapa adicional que você pode executar é adicionar uma "nota TBD" nas propriedades estendidas do objeto. Você pode anotar quando fez a alteração e / ou qualquer anotação que possa ter sobre o motivo pelo qual considera seguro se livrar.

Tudo o que disse foi executado por alguns dias uma sessão de eventos estendida (ou rastreamento de criador de perfil) para garantir que todos os objetos estejam sendo usados. Você pode limitar fortemente a sessão apenas ao nome do objeto e quando foi tocada para reduzir a sobrecarga. Além disso, certifique-se de executar esta sessão por alguns dias em ambos os lados do final do mês e possivelmente até no final do trimestre para garantir que você tenha tudo.

Kenneth Fisher
fonte
3

Remova as permissões como Phil W. sugere.

Remova também as permissões de todos os procedimentos armazenados que usam as tabelas. No SQL Server, (não conheço outras pessoas), as permissões são encadeadas de um objeto de chamada (por exemplo, o procedimento armazenado) para o objeto chamado (por exemplo, uma tabela).

Peter Bill
fonte
A tarefa era permitir que todas as ferramentas, funções, objetos, consultas (mesmo em bancos de dados remotos) falhassem ao tentar acessar essas tabelas. Se eu tiver que modificar um procedimento armazenado, já tenho que saber que ele o usa. Ou existe alguma maneira simples de determinar se uma tabela é usada por um procedimento armazenado?
Tim Schmelter
Não sugeri modificar o procedimento armazenado, apenas removendo sua permissão EXECUTE. Como você diz, é fácil restaurar a permissão, se necessário. Você pode ver quais tabelas são usadas por um procedimento armazenado: No SQL Server Management Studio, Pesquisador de Objetos, selecione seu banco de dados -> Programabilidade -> Procedimentos Armazenados. Clique com o botão direito do mouse em um nome de sproc e escolha Exibir Dependências. Selecione Objetos dos quais [nome do sproc] depende.
Peter Bill