কীভাবে এসকিউএল সার্ভারের পদ্ধতি / ট্রিগারগুলির মধ্যে একটি পাঠ্য সন্ধান করবেন?


173

আমার একটি লিঙ্কডেসভার রয়েছে যা পরিবর্তন হবে। কিছু প্রক্রিয়া কল ভালো লিঙ্ক সার্ভার: [10.10.100.50].dbo.SPROCEDURE_EXAMPLE। আমরা ট্রিগাররাও এই ধরণের কাজ করে চলেছি। [10.10.100.50]এটিকে পরিবর্তন করতে আমাদের যে সমস্ত স্থান ব্যবহার করা হবে সেগুলি আমাদের খুঁজে বের করতে হবে।

এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও এক্সপ্রেসে আমি ভিজ্যুয়াল স্টুডিওতে "পুরো ডাটাবেসটিতে সন্ধান করুন" এর মতো কোনও বৈশিষ্ট্য পাইনি। একটি বিশেষ সিস্টেম-নির্বাচন আমাকে কী প্রয়োজন তা খুঁজে পেতে আমাকে সহায়তা করতে পারে?

উত্তর:


310

আমি আমার সিস্টেমে টেক্সট সন্ধান করতে ব্যবহার করি এমন একটি পদ্ধতির অংশ এখানে ...

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

1
অতিরিক্তভাবে আপনি এটির জন্য আপনার ফলাফলের সাথে যোগ করতে পারেন যাতে আপনার সন্ধানের মান রয়েছে। , সাবস্ট্রিং (এম.ডিফাইনিশন, চরিনডেক্স (@ সন্ধান, এম.ডিফাইনিশন), 100)
ক্রিস রদ্রিগেজ

2
@ ক্রিসরোড্রিগেজ, ভাল ধারণা, তবে মনে রাখবেন যে প্রতিটি প্রক্রিয়া / ট্রিগার / ফাংশন
কেএম এর

সীমাবদ্ধতার জন্য বৈধ নয় ( type = 'C')?
কিকিনেট

18

আপনি এটি পছন্দ করতে পারেন

SELECT DISTINCT OBJECT_NAME(id) FROM syscomments WHERE [text] LIKE '%User%'

এটি স্টোরেজ পদ্ধতির অভ্যন্তরে 'ব্যবহারকারী' এর মতো পাঠ্যযুক্ত স্বতন্ত্র সঞ্চিত পদ্ধতির নাম তালিকাভুক্ত করবে। অধিক তথ্য


8
কেবল সচেতন থাকুন যে syscommentsটেবিলটি 8000-চরিত্রের অংশগুলিতে মানগুলি সঞ্চয় করে, তাই আপনি যদি এই সীমাটিগুলির মধ্যে একটিতে বিভক্ত হয়ে অনুসন্ধান করছেন এমন পাঠ্যটি যদি আপনার পক্ষে দুর্ভাগ্য হয় তবে আপনি এই পদ্ধতির সাথে এটি খুঁজে পাবেন না।
এরিক

17

[শেষ উত্তর তবে আশাবাদী কার্যকর]

সিস্টেম সারণীগুলি ব্যবহার করা সর্বদা 100% সঠিক ফলাফল দেয় না কারণ কিছু সঞ্চিত পদ্ধতি এবং / অথবা ভিউ এনক্রিপ্ট হওয়ার সম্ভাবনা থাকতে পারে যে ক্ষেত্রে আপনার প্রয়োজনীয় ডেটা পাওয়ার জন্য আপনাকে ড্যাক সংযোগ ব্যবহার করতে হবে।

আমি তৃতীয় পক্ষের সরঞ্জাম যেমন অ্যাপেক্সএসকিউএল অনুসন্ধান ব্যবহার করার পরামর্শ দেব যা সহজে এনক্রিপ্ট হওয়া বস্তুগুলির সাথে ডিল করতে পারে।

সিসকম্টস সিস্টেম টেবিলটি এনক্রিপ্ট হওয়া ক্ষেত্রে টেক্সট কলামের নাল মান দেবে।


11
-- 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');


দর্শনের জন্য কার্যকর , সঞ্চিত পদ্ধতি, ব্যবহারকারীর সংজ্ঞায়িত টেবিল ? এবং ট্রিগার, ফাংশন, সীমাবদ্ধতা, বিধি, ডিফল্ট ?
কিকিনেট

5

এটি আপনার পক্ষে কাজ করবে:

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

সীমাবদ্ধতার জন্য বৈধ নয় ( type = 'C')?
কিকিনেট

4

আছে অনেক আপনার সঞ্চিত পদ্ধতি ফাংশন টেক্সট পরিবর্তন চেয়ে ভাল সমাধান, এবং প্রতিটি সময় সংযুক্ত সার্ভার পরিবর্তন দেখেন। এখানে কিছু বিকল্প রয়েছে:

  1. লিঙ্কযুক্ত সার্ভার আপডেট করুন। তার আইপি এড্রেস নামে একটি লিঙ্ক সার্ভার ব্যবহার করার পরিবর্তে, যেমন রিসোর্সের নাম দিয়ে একটি নতুন লিঙ্ক সার্ভার তৈরি Financeবা DataLinkProdবা কিছু যেমন। তারপরে যখন আপনাকে কোন সার্ভারে পৌঁছেছে তা পরিবর্তন করতে হবে, নতুন সার্ভারের দিকে নির্দেশ করার জন্য লিঙ্কযুক্ত সার্ভারটি আপডেট করুন (বা এটিকে ছেড়ে দিন এবং পুনরায় তৈরি করুন)।

  2. দুর্ভাগ্যক্রমে আপনি লিঙ্কযুক্ত সার্ভার বা স্কিমার প্রতিশব্দ তৈরি করতে পারবেন না, আপনি সংযুক্ত সার্ভারগুলিতে অবস্থিত অবজেক্টগুলির প্রতিশব্দ তৈরি করতে পারেন। উদাহরণস্বরূপ, আপনার পদ্ধতিটি [10.10.100.50].dbo.SPROCEDURE_EXAMPLEaliised দ্বারা পারে। হয়তো একজন স্কিমা তৈরি datalinkprodতারপর, CREATE SYNONYM datalinkprod.dbo_SPROCEDURE_EXAMPLE FOR [10.10.100.50].dbo.SPROCEDURE_EXAMPLE;। তারপরে, একটি সঞ্চিত প্রক্রিয়া লিখুন যা কোনও লিঙ্কযুক্ত সার্ভারের নাম স্বীকার করে, যা দূরবর্তী ডাটাবেস থেকে সমস্ত সম্ভাব্য বস্তুগুলিকে অনুসন্ধান করে এবং (পুনরায়) তাদের জন্য প্রতিশব্দ তৈরি করে। আপনার সমস্ত এসপি এবং ফাংশনগুলি একবার শুরু হয়ে যাওয়া প্রতিশব্দ নামগুলি ব্যবহার করার জন্য এবং একবারের পরে আবার লিখিত datalinkprodহয়ে যায়, একটি লিঙ্কযুক্ত সার্ভার থেকে অন্যটিতে পরিবর্তিত করতে আপনি কেবল করেন EXEC dbo.SwitchLinkedServer '[10.10.100.51]';এবং একটি সেকেন্ডের একটি ভগ্নাংশে আপনি আলাদা লিঙ্কযুক্ত সার্ভার ব্যবহার করছেন।

আরও বিকল্প হতে পারে। আমি মানব-লিখিত স্ক্রিপ্টগুলি পরিবর্তনের পরিবর্তে প্রাক-প্রসেসিং, কনফিগারেশন বা ইন্ডায়ারেশনের সর্বোত্তম কৌশলগুলি ব্যবহার করার পরামর্শ দিচ্ছি। স্বয়ংক্রিয়ভাবে মেশিন দ্বারা নির্মিত স্ক্রিপ্টগুলি আপডেট করা ভাল, এটি প্রিপ্রোসেসিং। ম্যানুয়ালি জিনিসগুলি করা ভয়াবহ।


আমি আপনার পরামর্শের সাথে একমত তবে ওপি যা বর্ণনা করেছে তার মতো পরিস্থিতিতে, আপনাকে এখনও সার্ভারের আইপি সমেত সমস্ত সঞ্চিত পদ্ধতি খুঁজে বের করতে হবে। এমনকি যদি আপনাকে এটি একবারে করতে হয় তবে এটি নিজে হাতে করা অনেক কাজ হতে পারে ।
পল গ্রোকে

@ পলগ্রোক হ্যাঁ, এই "প্রচুর" কাজটি প্রবেশের ব্যবস্থাটিতে দুর্বল প্রযুক্তিগত পছন্দগুলির কারণে প্রযুক্তিগত causedণ। এটি থেকে পুনরুদ্ধার করতে সময় লাগে the জমা হওয়া debtণ পরিশোধ করে। তবে আমার পরামর্শ হল কীভাবে প্রযুক্তিগত সম্পদ তৈরি করা যায় - আরও বেশি সময় ব্যয় করা দ্রুত, আরও চটজলদি এবং পরে আরও নির্ভরযোগ্য। এর চারপাশে কিছু ধারণার জন্য বিগ বল অফ মুড নিবন্ধটি পড়ুন ।
এরিক

আমার অর্থ হ'ল: অন্যরা এখানে পোস্ট করেছেন এমন একটি নির্বাচনী বক্তব্য ব্যবহার করে সেই "payingণ পরিশোধ" কাজটি হ্রাস করে কী ভুল?
পল গ্রোকে

@ পলগ্রোকে লিঙ্কযুক্ত সার্ভারটি উল্লেখ করতে পারে এমন অবজেক্টগুলি সন্ধান করার দ্রুত উপায়ের সাথে কোনও ভুল নেই। তবে আপনি কি জানেন যে "একজন মানুষকে একটি মাছ দিন" তার চেয়ে "একজন মানুষকে মাছ শেখানো" সম্পর্কে পুরানো প্রবাদটি আছে? হ্যাঁ। Thing জিনিস।
এরিক

@ এরিক থিং হ'ল - আপনি তাকে মাছ ধরতে শেখাচ্ছেন না, কেবল এই বলে যে তিনি যদি মাছ ধরেন তবে তিনি খাবার পেতে পারেন। আপনার উত্তরটি দুর্দান্ত পরামর্শ, তবে ওপিকে এটি বাস্তবায়নে সহায়তা করে না। এই রেফারেন্সগুলি সন্ধানের একটি উপায় যুক্ত করা যাতে আপনি সেগুলি আরও ভাল ডিজাইনের সাথে প্রতিস্থাপন করতে পারেন তবে এই উত্তরটি আরও ভাল করা যায়।
টি। সার


2

এটি আমি এসকিউএল ২০০৮ এ চেষ্টা করেছি, যা একসাথে সমস্ত ডিবি থেকে অনুসন্ধান করতে পারে।

Create table #temp1 
(ServerName varchar(64), dbname varchar(64)
,spName varchar(128),ObjectType varchar(32), SearchString varchar(64))

Declare @dbid smallint, @dbname varchar(64), @longstr varchar(5000)
Declare @searhString VARCHAR(250)

set  @searhString='firstweek'

declare db_cursor cursor for 
select dbid, [name] 
from master..sysdatabases
where [name] not in ('master', 'model', 'msdb', 'tempdb', 'northwind', 'pubs')



open db_cursor
fetch next from db_cursor into @dbid, @dbname

while (@@fetch_status = 0)
begin
    PRINT 'DB='+@dbname
    set @longstr = 'Use ' + @dbname + char(13) +        
        'insert into #temp1 ' + char(13) +  
        'SELECT @@ServerName,  ''' + @dbname + ''', Name 
        , case  when [Type]= ''P'' Then ''Procedure''
                when[Type]= ''V'' Then ''View''
                when [Type]=  ''TF'' Then ''Table-Valued Function'' 
                when [Type]=  ''FN'' Then ''Function'' 
                when [Type]=  ''TR'' Then ''Trigger'' 
                else [Type]/*''Others''*/
                end 
        , '''+ @searhString +''' FROM  [SYS].[SYSCOMMEnTS]
        JOIN  [SYS].objects ON ID = object_id
        WHERE TEXT LIKE ''%' + @searhString + '%'''

 exec (@longstr)
 fetch next from db_cursor into @dbid, @dbname
end

close db_cursor
deallocate db_cursor
select * from #temp1
Drop table #temp1

0

আমি এটি কাজের জন্য ব্যবহার করি। @ টেক্সট ক্ষেত্রে যদিও [] গুলি ছেড়ে দিন, সমস্ত কিছু ফিরিয়ে দিতে চায় বলে মনে হচ্ছে ...

কোন অ্যাকাউন্ট সেট করুন

নিবন্ধটি প্রকাশ করুন পাঠ্য গবেষণার (250)
@ এসকিউএল ভর্চার (250) ডিক্লার করুন

@ পাঠ্য নির্বাচন করুন '10 .10.100.50 '

টেবিল তৈরি করুন # ফলাফল (ডিবি ভর্চার ()৪), অবজেক্ট নাম ভর্চার (১০০), এক্টটাইপ ভর্চার (১০), সংজ্ঞা পাঠ্য)

'অনুসন্ধানের স্ট্রিং' হিসাবে @ পাঠ্য নির্বাচন করুন
মাস্টার থেকে সিলেক্ট নামের জন্য # ডেটাবেসগুলি কর্সারকে সরিয়ে দিন..সিসডাটাবেস যেখানে dbid> 4
    @C_dbname বারচর ()৪)   
    # ডেটাবেস খুলুন
    @C_dbname- তে # ডেটাবেসগুলি ফেচ করুন   
    শুক্রবার @@ ফ্যাচপাসাপটাস -১
    BEGIN
        @ এসকিউএল = 'ফলাফলের মধ্যে অন্তর্ভুক্ত করুন' নির্বাচন করুন
        @ এসকিউএল = @ এসকিউএল + 'নির্বাচন' '' + @ সি_ডবনেম + '' 'এএস ডিবি, ও.নেম, ও.সেক্সটাইপ, এম.ডিফাইনিশন' নির্বাচন করুন   
        @ এসকিউএল = @ এসকিউএল + 'FROM'+@c_dbname+'.sys.sql_modules এম' নির্বাচন করুন   
        @ এসকিউএল = @ এসকিউএল + 'অন্তর্ভুক্ত যোগদান' + @ সি_ডবনেম + 'নির্বাচন করুন .. ম্যাসোবজেক্ট_আইডি = ও.আইডি' তে সিসোবজেক্টগুলি   
        @ এসকিউএল = @ এসকিউএল + 'যেখানে [সংজ্ঞা]' পছন্দ করুন ''% '+ @ পাঠ্য +'% '' 'নির্বাচন করুন   
        পাগলের সংখ্যা বাড়ছে (@SQL)
        @C_dbname- তে # ডেটাবেসগুলি ফেচ করুন
    শেষ
    # ডেটাবেস বন্ধ করুন
# ডেটাবেসগুলি বাতিল করুন

ডিবি, xtype, অবজেক্টের নাম অনুসারে # ফলাফলগুলি থেকে * নির্বাচন করুন
টেবিল ড্রপ করুন # ফলাফলগুলি

0

আমি এগুলি অতীতে ব্যবহার করেছি:

এই নির্দিষ্ট ক্ষেত্রে, যেখানে আপনার সঞ্চিত প্রক্রিয়া জুড়ে একটি নির্দিষ্ট স্ট্রিং প্রতিস্থাপন করতে হবে, প্রথম লিঙ্কটি সম্ভবত আরও প্রাসঙ্গিক।

সামান্য অফ-টপিক, দ্রুত অনুসন্ধান অ্যাড-ইন এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওর সাহায্যে অবজেক্টের নাম অনুসন্ধানের জন্যও দরকারী। কিছু উন্নতি সহ একটি সংশোধিত সংস্করণ উপলব্ধ রয়েছে এবং আরও কয়েকটি নতুন সংস্করণ কোডেপ্লেক্সে কিছু অন্যান্য দরকারী অ্যাড-ইনগুলির সাথে উপলব্ধ।


0

নির্বাচিত বিবৃতি সহ যে কোনও অনুসন্ধানের ফলে কেবলমাত্র আপনার নাম আসে, যেখানে অনুসন্ধান কীওয়ার্ড থাকে। সবচেয়ে সহজ এবং দক্ষ উপায় হ'ল পদ্ধতি / ফাংশনের স্ক্রিপ্ট পাওয়া এবং তারপরে উত্পন্ন পাঠ্য ফাইলটি অনুসন্ধান করা, আমিও এই কৌশলটি অনুসরণ করি :) সুতরাং আপনি সঠিক পয়েন্টপয়েন্ট।


0
SELECT ROUTINE_TYPE, ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%Your Text%' 

0

জেনেরিক সম্পূর্ণ বাইরের ক্রস রেফের জন্য সবেমাত্র এটি লিখেছিলেন

create table #XRefDBs(xtype varchar(2),SourceDB varchar(100), Object varchar(100), RefDB varchar(100))

declare @sourcedbname varchar(100),
        @searchfordbname varchar(100),
        @sql nvarchar(4000)
declare curs cursor for
    select name 
    from sysdatabases
    where dbid>4
open curs
fetch next from curs into @sourcedbname
while @@fetch_status=0
    begin
    print @sourcedbname
    declare curs2 cursor for 
        select name 
        from sysdatabases
        where dbid>4
        and name <> @sourcedbname
    open curs2
    fetch next from curs2 into @searchfordbname
    while @@fetch_status=0
        begin
        print @searchfordbname
        set @sql = 
        'INSERT INTO #XRefDBs (xtype,SourceDB,Object, RefDB)
        select DISTINCT o.xtype,'''+@sourcedbname+''', o.name,'''+@searchfordbname+'''
        from '+@sourcedbname+'.dbo.syscomments c
        join '+@sourcedbname+'.dbo.sysobjects o on c.id=o.id
        where o.xtype in (''V'',''P'',''FN'',''TR'')
        and (text like ''%'+@searchfordbname+'.%''
          or text like ''%'+@searchfordbname+'].%'')'
        print @sql
        exec sp_executesql @sql
        fetch next from curs2 into @searchfordbname
        end
    close curs2
    deallocate curs2
    fetch next from curs into @sourcedbname
    end
close curs
deallocate curs

select * from #XRefDBs

-1

আপনি নিম্নলিখিত এসকিউএল ব্যবহার করে সমস্ত ডাটাবেস অবজেক্টের সংজ্ঞা অনুসারে অনুসন্ধান করতে পারেন:

SELECT 
    o.name, 
    o.id, 
    c.text,
    o.type
FROM 
    sysobjects o 
RIGHT JOIN syscomments c 
    ON o.id = c.id 
WHERE 
    c.text like '%text_to_find%'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.