Используя эту функцию 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
Существует представление 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'
Используйте SQL Server MS Studio Managment;
Находят Таблицу или SP в TreeView, и щелкают правой кнопкой по нему, и выбор "Просматривают Dedpendencies"
Тот способ, которым Вы видите все подчиненные объекты.
Я записал модуль 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
'
Совершенно другой путь из вышеупомянутых ответов состоит в том, чтобы записать простую программу это 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;
}
}
}
Я использую следующую хранимую процедуру, с которой я столкнулся некоторое время назад:
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
select o.name
from syscomments c
inner join sysobjects o on c.id = o.id
where text like '%tableName%'
Если вам нужен дружественный интерфейс, я могу порекомендовать недорогой набор инструментов администрирования SQL от Idera. В дополнение к другим инструментам у него есть хорошая утилита поиска SQL, которая находит строки в sprocs (или где-либо еще) и помогает вам перемещаться по ним.
Используйте таблицу 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.
SELECT DISTINCT OBJECT_NAME(id) AS ObjectName, [Text] AS CodeSnippet
FROM syscomments (nolock)
WHERE [TEXT] LIKE '%Whatever You Want To Search For%'
Да.
вы можете выбрать * из sys.syscomments
, если у вас есть VS для Database Pro. Вы можете создать проект базы данных, импортировать схему из базы данных и выполнить поиск в проекте.
select top 10 * from syscomments
можно также найти sp_grep, который является популярным, хотя не - включал, процедура, которая делает это.
Массовый экспорт в текстовые файлы и индексация их с помощью Google Desktop.
Не используйте 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%'
(Как написано, это также возвратит триггеры, представления и скалярные функции. Исключите их по типу, если хотите)