No SQL Server, existe alguma maneira de verificar se a alteração do esquema terá impacto no Procs armazenado?
-
22-09-2019 - |
Pergunta
No SQL Server, existe alguma maneira de verificar se as alterações no esquema afetarão os procedimentos armazenados (e/ou visualizações)?
Por exemplo, uma alteração do nome da coluna em uma tabela, pode quebrar alguns procedimentos armazenados; Como verificar os Procs armazenados impactados?
Solução
No SSMS (SQL Server Management Studio), clique com o botão direito do mouse no objeto que você está alterando e clique em Exibir dependências. Eu não acho que isso encontrará referências de outro banco de dados.
Você também pode procurar referências em procedimentos armazenados se eles não forem criptografados. Você teria que fazer isso em cada banco de dados que você suspeita que possa fazer referência ao objeto que está alterando.
Selecione Objects.name, sql_modules.Definition de sys.sql_modules sql_modules Junte -se a objetos sys.objects em sql_modules.object_id = objetos.object_id onde definição como '%algum nome da coluna%';
Não encontrei nada que seja 100,0000% preciso 100.000000% do tempo.
Outras dicas
tente usar:
EXEC sp_depends 'YourTableName'
e/ou
DECLARE @Search nvarchar(500)
SET @Search='YourTableName' --or anything else
SELECT DISTINCT
LEFT(o.name, 100) AS Object_Name,o.type_desc
FROM sys.sql_modules m
INNER JOIN sys.objects o ON m.object_id=o.object_id
WHERE m.definition Like '%'+@Search+'%'
ORDER BY 2,1
Seus arquivos CSS provavelmente foram malrados, então eu carregaria esses arquivos CSS para o novo servidor (assumindo que é um novo servidor)
Seus arquivos CSS podem ser localizados a partir de:
C: \ Arquivos de Programas \ Arquivos Comuns \ Microsoft Shared \ Web Server Extensões \ 14 \ Template \ Layouts \ 1033 \ Styles
Além disso,
- .
- é o seu farm de recuperação do WSS a mesma versão que o original?
- Como você recuperou (que método) seus bancos de dados do SharePoint / WSS?
A melhor maneira de pensar para fazer isso é abstrair seus procedimentos armazenados de suas tabelas reais usando visualizações e criar essas visualizações com uma cláusula "com esquemas", que deve impedir mudanças que quebrem suas opiniões ...
Ferramentas comerciais como Refactor SQL do Red Gate posso fazer isso.
Eu acho que a versão recente de Estúdio visual Inclua também esse tipo de recurso, mas eu não tentei.
Que eu saiba, não há recursos internos do Microsoft SQL Server per-se o que fará isso. Correção: Acabei de ler sobre sp_dende Na resposta de KM a este post ... observe que o uso de SP_Dendens está preso; é substituído por sys.dm_sql_referencing_entities e sys.dm_sql_referenced_entities
Além disso, se os procedimentos armazenados subjacentes usarem sql dinâmico, a tarefa de detectar dependências se torna mais difícil e propensa a "erros".
Se você deseja alterar o nome de um objeto ou coluna, então o Renomear inteligente Recurso do Red Gate's Software SQL Prompt 5 gerará um script que executa a renomeação e atualiza referências ao nome antigo em outros objetos.
Se você está apenas interessado no que depende do nome de uma coluna, o SQL Prompt 5 também tem um Dependências da coluna Função, onde pairando sobre o nome da coluna em um script aparece uma janela que contém uma lista de objetos que se referem à coluna.
Você pode baixar uma avaliação de 14 dias gratuitamente, para ver se um desses recursos funciona para você.
Paul Stephenson
Gerente de projeto prompt do SQL
Software Red Gate
Dê uma olhada nessas respostas:
Metadados refrescantes nas funções do usuário t-sql
Relacionamentos do SQL Server enterrados em procedimentos armazenados em vez de esquema
No SQL Server, como posso encontrar em todos os lugares que uma coluna é referenciada?
Como encontro todos os procedimentos armazenados que inseram, atualizam ou excluem registros?
Além do SQL dinâmico, usando o esquema sempre que possível e sp_refreshsqlmodule e sql_dependências para todo o resto são muito precisos.
Se você usar o SQL Server
Você pode usar esta consulta após sua alteração e encontrar procedimento ou visualização armazenada ou ...
que após sua mudança pode receber erro
USE <Your_DataBase_Name>;
SET NOCOUNT ON;
DECLARE @name NVARCHAR(MAX)
DECLARE @sql NVARCHAR(MAX)
DECLARE @type CHAR(2)
DECLARE @type_desc NVARCHAR(60)
DECLARE @params NVARCHAR(MAX)
DECLARE @tblInvalid TABLE
(
[type_desc] NVARCHAR(60) ,
[name] NVARCHAR(MAX) ,
[error_number] INT ,
[error_message] NVARCHAR(MAX) ,
[type] CHAR(2)
);
DECLARE testSPs CURSOR FAST_FORWARD
FOR
SELECT [name] = OBJECT_NAME(SM.[object_id]) ,
[type] = SO.[type] ,
SO.[type_desc] ,
[params] = ( SELECT (
SELECT CONVERT(XML, ( SELECT STUFF(( SELECT
', ' + [name]
+ '=NULL' AS [text()]
FROM
sys.parameters
WHERE
[object_id] = SM.[object_id]
FOR
XML
PATH('')
), 1, 1, '')
))
FOR XML RAW ,
TYPE
).value('/row[1]', 'varchar(max)')
)
FROM sys.sql_modules SM
JOIN sys.objects SO ON SO.[object_id] = SM.[object_id]
WHERE SO.[is_ms_shipped] = 0
AND SO.[type] = 'P'
OPEN testSPs
FETCH NEXT FROM testSPs INTO @name, @type, @type_desc, @params
WHILE ( @@FETCH_STATUS = 0 )
BEGIN
BEGIN TRY
SET @sql = 'SET FMTONLY ON; exec ' + @name + ' ' + @params
+ '; SET FMTONLY OFF;'
--PRINT @sql;
EXEC (@sql);
END TRY
BEGIN CATCH
PRINT @type_desc + ', ' + @name + ', Error: '
+ CAST(ERROR_NUMBER() AS VARCHAR) + ', ' + ERROR_MESSAGE();
INSERT INTO @tblInvalid
SELECT @type_desc ,
@name ,
ERROR_NUMBER() ,
ERROR_MESSAGE() ,
@type;
END CATCH
FETCH NEXT FROM testSPs INTO @name, @type, @type_desc, @params
END
CLOSE testSPs
DEALLOCATE testSPs
SELECT [type_desc] ,
[name] ,
[error_number] ,
[error_message]
FROM @tblInvalid
ORDER BY CHARINDEX([type], ' U V PK UQ F TR FN TF P SQ ') ,
[name];