변경 될 연결된 서버가 있습니다. 일부 절차는 다음과 같이 연결된 서버를 호출합니다 [10.10.100.50].dbo.SPROCEDURE_EXAMPLE
. 우리는 이런 종류의 일을하는 방아쇠도 있습니다. 사용하는 모든 장소를 찾아야합니다[10.10.100.50]
그것을 바꾸는 하는 합니다.
SQL Server Management Studio Express에서는 Visual Studio에서 “전체 데이터베이스에서 찾기”와 같은 기능을 찾지 못했습니다. 특별한 sys-select가 필요한 것을 찾는 데 도움이 될 수 있습니까?
답변
다음은 시스템에서 텍스트를 찾기 위해 사용하는 절차의 일부입니다 ….
DECLARE @Search varchar(255)
SET @Search='[10.10.100.50]'
SELECT DISTINCT
o.name 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
답변
당신은 그것을 찾을 수 있습니다
SELECT DISTINCT OBJECT_NAME(id) FROM syscomments WHERE [text] LIKE '%User%'
저장 프로 시저 안에 ‘User’와 같은 텍스트가 포함 된 별개의 저장 프로 시저 이름이 나열됩니다. 더 많은 정보
답변
[늦은 대답이지만 희망적으로 유용합니다]
시스템 테이블을 사용한다고해서 항상 100 % 정확한 결과를 얻을 수있는 것은 아니기 때문에 일부 저장 프로 시저 및 / 또는 뷰가 암호화 될 수 있으므로 필요한 데이터를 얻기 위해 DAC 연결을 사용해야 할 수도 있습니다.
암호화 된 객체를 쉽게 처리 할 수있는 ApexSQL 검색 과 같은 타사 도구를 사용하는 것이 좋습니다 .
Syscomments 시스템 테이블은 개체가 암호화 된 경우 텍스트 열에 null 값을 제공합니다.
답변
-- Declare the text we want to search for
DECLARE @Text nvarchar(4000);
SET @Text = 'employee';
-- Get the schema name, table name, and table type for:
-- Table names
SELECT
TABLE_SCHEMA AS 'Object Schema'
,TABLE_NAME AS 'Object Name'
,TABLE_TYPE AS 'Object Type'
,'Table Name' AS 'TEXT Location'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '%'+@Text+'%'
UNION
--Column names
SELECT
TABLE_SCHEMA AS 'Object Schema'
,COLUMN_NAME AS 'Object Name'
,'COLUMN' AS 'Object Type'
,'Column Name' AS 'TEXT Location'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%'+@Text+'%'
UNION
-- Function or procedure bodies
SELECT
SPECIFIC_SCHEMA AS 'Object Schema'
,ROUTINE_NAME AS 'Object Name'
,ROUTINE_TYPE AS 'Object Type'
,ROUTINE_DEFINITION AS 'TEXT Location'
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%'+@Text+'%'
AND (ROUTINE_TYPE = 'function' OR ROUTINE_TYPE = 'procedure');
답변
이것은 당신을 위해 작동합니다 :
use [ANALYTICS] ---> put your DB name here
GO
SELECT sm.object_id, OBJECT_NAME(sm.object_id) AS object_name, o.type, o.type_desc, sm.definition
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
where sm.definition like '%SEARCH_WORD_HERE%' collate SQL_Latin1_General_CP1_CI_AS
ORDER BY o.type;
GO
답변
있습니다 많은 당신의 저장 프로 시저, 함수의 텍스트를 수정하는 것보다 더 나은 솔루션, 그리고 때마다 연결된 서버의 변화를 볼. 몇 가지 옵션이 있습니다.
-
연결된 서버를 업데이트하십시오. 대신 IP 주소로 이름이 연결된 서버를 사용하여 같은 리소스의 이름으로 새 연결된 서버를 만들
Finance
거나DataLinkProd
또는 일부 등. 그런 다음 도달 한 서버를 변경해야 할 경우 새 서버를 가리 키도록 링크 된 서버를 업데이트하십시오 (또는 삭제 한 후 다시 작성하십시오). -
불행하게도 링크 된 서버 또는 스키마에 대한 동의어를 작성할 수 없지만 링크 된 서버에있는 오브젝트에 대한 동의어를 작성할 수 있습니다. 예를 들어, 프로시 저는
[10.10.100.50].dbo.SPROCEDURE_EXAMPLE
별명으로 할 수 있습니다. 아마도 스키마를 생성datalinkprod
한 후,CREATE SYNONYM datalinkprod.dbo_SPROCEDURE_EXAMPLE FOR [10.10.100.50].dbo.SPROCEDURE_EXAMPLE;
. 그런 다음 연결된 서버 이름을 허용하는 저장 프로 시저를 작성합니다.이 프로시 저는 원격 데이터베이스에서 모든 잠재적 개체를 쿼리하고 동의어를 다시 만듭니다. 모든 SP와 함수는으로 시작하는 동의어 이름을 사용하기 위해 한 번만 다시 작성되며datalinkprod
, 그 이후로 한 링크 된 서버에서 다른 서버로 변경하고 다른 링크 된 서버를EXEC dbo.SwitchLinkedServer '[10.10.100.51]';
사용하는 경우도 있습니다.
더 많은 옵션이있을 수 있습니다. 사람이 작성한 스크립트를 변경하는 것보다 우수한 전처리, 구성 또는 간접 기술을 사용하는 것이 좋습니다. 머신 생성 스크립트를 자동으로 업데이트하는 것이 좋습니다. 이것은 전처리입니다. 수동으로 작업하는 것은 끔찍합니다.
답변
select text
from syscomments
where text like '%your text here%'