Можно ли искать содержание Хранимой процедуры SQL Server 2005 года?

Используя эту функцию PHP mysql_escape_string(), вы можете быстро получить хорошую профилактику.

Например:

SELECT * FROM users WHERE name = '".mysql_escape_string($name_from_html_form)."'

mysql_escape_string - Сбрасывает строку для использования в mysql_query

Для большей профилактики вы можете добавить в конце ...

wHERE 1=1   or  LIMIT 1

Наконец вы получаете:

SELECT * FROM users WHERE name = '".mysql_escape_string($name_from_html_form)."' LIMIT 1
25
задан John Saunders 8 December 2009 в 00:25
поделиться

13 ответов

Существует представление Information_Schema.Routines, которое вы можете использовать.

select * 
FROM   INFORMATION_SCHEMA.ROUTINES 
WHERE  OBJECTPROPERTY(OBJECT_ID(SPECIFIC_NAME),'IsMSShipped') =0 
       and OBJECT_DEFINITION(OBJECT_ID(SPECIFIC_NAME)) like '%search term here%' 
       AND ROUTINE_TYPE='PROCEDURE'
15
ответ дан G Mastros 28 November 2019 в 17:57
поделиться

Используйте SQL Server MS Studio Managment;

Находят Таблицу или SP в TreeView, и щелкают правой кнопкой по нему, и выбор "Просматривают Dedpendencies"

Тот способ, которым Вы видите все подчиненные объекты.

-1
ответ дан dmajkic 28 November 2019 в 17:57
поделиться

Я записал модуль Perl, который позволяет мне делать это и т.д. С ним я могу управлять views/sprocs (и код Perl) использующий SQL-операторы. Кодовая база использования '#!/usr/bin/perl

#;

используют строгий; используйте предупреждения;

Codebase::CreateFunctions(change=>\&change);

exit;

изменение sub {мой $string=shift;

my %H=(
        23 => 30,
        25 => 26,
        27 => 30,
        28 => 30,
        29 => 30,
        31 => 24,
        32 => 24
         );
$string =~ s/InstallStatus *(<>|==|>=|<=|>|=|<) *(23|25|27|28|29|31|32)(\W)/"iNstallsTatus $1 $H{$2}$3"/iges;
return $string;
 } # change

КОНЕЦ избранное имя (entries.fullname) || расширение (entries.fullname), поскольку Имя, grep (m/\W (23|25|27|28|29|31|32|InstallStatus|InstallStatusNew|InstallStatusOld) Вт/, objects.definition, 3) как ПЕРЕЧИСЛЯЮЩИЙ от внутреннего объединения записей возражает на записях. OId = объекты. OId, где (путь (entries.fullname) в ('BETA: / ') и entries.kind = 'представление') и (((objects.definition как m/\W (ОТСЛЕЖИВАЮЩИЙ) \W/) и (objects.definition как m/\WInstallStatus (\W |\s)/)) или ((objects.definition как m/\W (TRACKING_LOG) \W/) и (objects.definition как m/\WInstallStatus (New|OLD) (\W |\s)/))) ограничивают 10

select name(entries.fullname)||extension(entries.fullname) as Name, change(objects.definition) as FILE
    from entries
    inner join objects on entries.OId = objects.OId
    where (path(entries.fullname) in ('BETA:/') and entries.kind = 'view')
        and (((objects.definition like m/\W(TRACKING)\W/) and (objects.definition like m/\WInstallStatus(\W|\s)/))
        or ((objects.definition like m/\W(TRACKING_LOG)\W/) and (objects.definition like m/\WInstallStatus(New|OLD)(\W|\s)/)))
        and (change(objects.definition) <> objects.definition)
limit 10

'

0
ответ дан 28 November 2019 в 17:57
поделиться

Совершенно другой путь из вышеупомянутых ответов состоит в том, чтобы записать простую программу это uases Microsoft. SqlServer. Управление. Smo и Microsoft. SqlServer. Управление. Общие пространства имен. Используя их можно выполнить итерации по всем хранимым процедурам и прочитать текст от них. Я записал программе этот способ сравнить процедуры хранилища в двух различных базах данных (dev и этап или этап и производство) и обновить тех, которые отличаются.

Вот пример:

using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

namespace SqlObjectChecker
{
    internal class ProcedureUpdater
    {
        internal string UpdateProcedure(string spName, string devConnString, string prodConnString, bool updateDev)
        {
            string returnMessage = "";

            ServerConnection devConnection = new ServerConnection();
            devConnection.ConnectionString = devConnString;
            ServerConnection prodConnection = new ServerConnection();
            prodConnection.ConnectionString = prodConnString;

            try
            {
                devConnection.Connect();
                prodConnection.Connect();

                Server devServer = new Server(devConnection);
                Server prodServer = new Server(prodConnection);

                Database devDatabase = devServer.Databases["Dbname"];
                Database prodDatabase = prodServer.Databases["Dbname"];

                StoredProcedure devStoredProcedure = devDatabase.StoredProcedures[spName];
                if (devStoredProcedure != null)
                {
                    StoredProcedure prodStoredProcedure = prodDatabase.StoredProcedures[spName];
                    if (prodStoredProcedure != null)
                    {
                        if (updateDev)
                        {
                            devStoredProcedure.TextHeader = prodStoredProcedure.TextHeader;
                            devStoredProcedure.TextBody = prodStoredProcedure.TextBody;
                            devStoredProcedure.Alter();
                            returnMessage = "Dev updated";
                        }
                        else
                        {
                            prodStoredProcedure.TextHeader = devStoredProcedure.TextHeader;
                            prodStoredProcedure.TextBody = devStoredProcedure.TextBody;
                            prodStoredProcedure.Alter();
                            returnMessage = "Prod updated.";
                        }
                    }
                    else
                    {
                        returnMessage = "Prod Stored Procedure Name Found.";
                    }
                }
                else
                {
                    returnMessage = "Dev Stored Procedure Name Found.";
                }

                devConnection.Disconnect();
                prodConnection.Disconnect();
            }
            catch (Exception exception)
            {
                returnMessage = exception.Message;
            }

            return returnMessage;
        }
    }
}
0
ответ дан Joel Coehoorn 28 November 2019 в 17:57
поделиться

Я использую следующую хранимую процедуру, с которой я столкнулся некоторое время назад:

 CREATE PROC dbo.sp_search_code  
(  
@SearchStr  varchar(100),  
@RowsReturned int = NULL OUT  
)  
AS  
/*************************************************************************************************  
  Copyright © 1997 - 2002 Narayana Vyas Kondreddi. All rights reserved.  

Purpose: To search the stored proceudre, UDF, trigger code for a given keyword.  

Written by: Narayana Vyas Kondreddi  
  http://vyaskn.tripod.com  

Tested on:  SQL Server 7.0, SQL Server 2000  

Date created: January-22-2002 21:37 GMT  

Date modified: February-17-2002 19:31 GMT  

Email:   vyaskn@hotmail.com  

Examples:  

To search your database code for the keyword 'unauthorized':  
EXEC sp_search_code 'unauthorized'  

To search your database code for the keyword 'FlowerOrders' and also find out the number of hits:  
DECLARE @Hits int  
EXEC sp_search_code 'FlowerOrders', @Hits OUT  
SELECT 'Found ' + LTRIM(STR(@Hits)) + ' object(s) containing this keyword' AS Result  
*************************************************************************************************/  
BEGIN  
 SET NOCOUNT ON  

 SELECT DISTINCT USER_NAME(o.uid) + '.' + OBJECT_NAME(c.id) AS 'Object name',  
  CASE   
    WHEN OBJECTPROPERTY(c.id, 'IsReplProc') = 1   
    THEN 'Replication stored procedure'  
    WHEN OBJECTPROPERTY(c.id, 'IsExtendedProc') = 1   
    THEN 'Extended stored procedure'      
   WHEN OBJECTPROPERTY(c.id, 'IsProcedure') = 1   
    THEN 'Stored Procedure'   
   WHEN OBJECTPROPERTY(c.id, 'IsTrigger') = 1   
    THEN 'Trigger'   
   WHEN OBJECTPROPERTY(c.id, 'IsTableFunction') = 1   
    THEN 'Table-valued function'   
   WHEN OBJECTPROPERTY(c.id, 'IsScalarFunction') = 1   
    THEN 'Scalar-valued function'  
    WHEN OBJECTPROPERTY(c.id, 'IsInlineFunction') = 1   
    THEN 'Inline function'   
  END AS 'Object type',  
  'EXEC sp_helptext ''' + USER_NAME(o.uid) + '.' + OBJECT_NAME(c.id) + '''' AS 'Run this command to see the object text'  
 FROM syscomments c  
  INNER JOIN  
  sysobjects o  
  ON c.id = o.id  
 WHERE c.text LIKE '%' + @SearchStr + '%' AND  
  encrypted = 0    AND  
  (  
  OBJECTPROPERTY(c.id, 'IsReplProc') = 1  OR  
  OBJECTPROPERTY(c.id, 'IsExtendedProc') = 1 OR  
  OBJECTPROPERTY(c.id, 'IsProcedure') = 1  OR  
  OBJECTPROPERTY(c.id, 'IsTrigger') = 1  OR  
  OBJECTPROPERTY(c.id, 'IsTableFunction') = 1 OR  
  OBJECTPROPERTY(c.id, 'IsScalarFunction') = 1 OR  
  OBJECTPROPERTY(c.id, 'IsInlineFunction') = 1   
  )  

 ORDER BY 'Object type', 'Object name'  

 SET @RowsReturned = @@ROWCOUNT  
END  
0
ответ дан Josh Weatherly 28 November 2019 в 17:57
поделиться
select o.name 
from syscomments c
    inner join sysobjects o on c.id = o.id
where text like '%tableName%'
0
ответ дан Austin Salonen 28 November 2019 в 17:57
поделиться

Если вам нужен дружественный интерфейс, я могу порекомендовать недорогой набор инструментов администрирования SQL от Idera. В дополнение к другим инструментам у него есть хорошая утилита поиска SQL, которая находит строки в sprocs (или где-либо еще) и помогает вам перемещаться по ним.

0
ответ дан Mark Brittingham 28 November 2019 в 17:57
поделиться

Используйте таблицу INFORMATION_SCHEMA.ROUTINES.

В той таблице, поле ROUTINE_DEFINITION содержит текст Ваших хранимых процедур.

SELECT
  R.SPECIFIC_NAME
 ,R.ROUTINE_DEFINITION
FROM
  MyDatabase.INFORMATION_SCHEMA.ROUTINES R
WHERE UPPER(R.ROUTINE_DEFINITION) LIKE '%' + UPPER('DELETE') + '%'

, Конечно, можно параметризовать место, где я трудно кодированный слово "УДАЛЯЮ". Протестированный в SQL Server 2005.

0
ответ дан JosephStyons 28 November 2019 в 17:57
поделиться
SELECT DISTINCT OBJECT_NAME(id) AS ObjectName, [Text] AS CodeSnippet 
FROM syscomments (nolock) 
WHERE [TEXT] LIKE '%Whatever You Want To Search For%'
2
ответ дан Kevin Fairchild 28 November 2019 в 17:57
поделиться

Да.

  1. вы можете выбрать * из sys.syscomments

  2. , если у вас есть VS для Database Pro. Вы можете создать проект базы данных, импортировать схему из базы данных и выполнить поиск в проекте.

2
ответ дан Ken Yao 28 November 2019 в 17:57
поделиться
select top 10 * from syscomments

можно также найти sp_grep, который является популярным, хотя не - включал, процедура, которая делает это.

2
ответ дан Tom Ritter 28 November 2019 в 17:57
поделиться

Массовый экспорт в текстовые файлы и индексация их с помощью Google Desktop.

3
ответ дан Owen 28 November 2019 в 17:57
поделиться

Не используйте INFORMATION_SCHEMA.ROUTINES. Он обрезает 4000 символов. Вместо этого получите его из sys.sql_modules.

SELECT o.type_desc AS ROUTINE_TYPE
        ,o.[name] AS ROUTINE_NAME
        ,m.definition AS ROUTINE_DEFINITION
FROM sys.sql_modules AS m
INNER JOIN sys.objects AS o
    ON m.object_id = o.object_id
WHERE m.definition LIKE '%search term here%'

(Как написано, это также возвратит триггеры, представления и скалярные функции. Исключите их по типу, если хотите)

24
ответ дан BradC 28 November 2019 в 17:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: