powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / сложная процедура
36 сообщений из 36, показаны все 2 страниц
сложная процедура
    #38312896
Nawy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такая псевдопроцедура:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE addWeight
	@weight INT,
	@name VARCHAR(40),
        @column VARCHAR(40),
AS
INSERT INTO TWeight(time, file_id)
VALUES (@weight, SELECT TOP 1 @column FROM @name ORDER BY @column DESC;);


Подскажите как результат запроса SELECT TOP 1 @column FROM @name ORDER BY @column DESC; записать в поле file_id таблицы TWeight.
Подскажите как это сделать без программы на ЯП, в чистом T-SQL.
...
Рейтинг: 0 / 0
сложная процедура
    #38312909
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nawy, тема "ТОП 10" вопрос номер 6
...
Рейтинг: 0 / 0
сложная процедура
    #38312913
Фотография Сергей Викт.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NawyВот такая псевдопроцедура:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE addWeight
	@weight INT,
	@name VARCHAR(40),
        @column VARCHAR(40),
AS
INSERT INTO TWeight(time, file_id)
VALUES (@weight, SELECT TOP 1 @column FROM @name ORDER BY @column DESC;);


Подскажите как результат запроса SELECT TOP 1 @column FROM @name ORDER BY @column DESC; записать в поле file_id таблицы TWeight.
Подскажите как это сделать без программы на ЯП, в чистом T-SQL.
Что-то типа такого, наверное
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE PROCEDURE addWeight
	@weight INT,
	@name VARCHAR(40),
        @column VARCHAR(40)
AS
DECLARE @sql varchar(max)
SET @sql=N'
INSERT INTO TWeight(time, file_id)
SELECT '+CONVERT(varchar,@weight)+', (SELECT TOP 1 '+CONVERT(varchar,@column)+' FROM '+CONVERT(varchar,@name)+' ORDER BY '+CONVERT(varchar,@column)+' DESC)';
EXEC(@sql)
...
Рейтинг: 0 / 0
сложная процедура
    #38313046
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Викт.
Код: sql
1.
CONVERT(varchar,@column) CONVERT(varchar,@name)


тут можно не конвертить varchar в varchar :)
...
Рейтинг: 0 / 0
сложная процедура
    #38313053
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир ЗатуливетерСергей Викт.
Код: sql
1.
CONVERT(varchar,@column) CONVERT(varchar,@name)



тут можно не конвертить varchar в varchar :)VARCHAR(40) преобразуется в VARCHAR(30), однако!
Кто его знает! Может, так и надо?
...
Рейтинг: 0 / 0
сложная процедура
    #38313064
Фотография Сергей Викт.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapВладимир Затуливетерпропущено...

тут можно не конвертить varchar в varchar :)VARCHAR(40) преобразуется в VARCHAR(30), однако!
Кто его знает! Может, так и надо?
я перестраховался просто:) Мало ли)
...
Рейтинг: 0 / 0
сложная процедура
    #38313071
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Викт.iapпропущено...
VARCHAR(40) преобразуется в VARCHAR(30), однако!
Кто его знает! Может, так и надо?
я перестраховался просто:) Мало ли)Тогда надо было использовать для названий объектов БД тип sysname.
Который базируется на NVARCHAR(128)
...
Рейтинг: 0 / 0
сложная процедура
    #38313077
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EXEC()-то всё равно @SQL преобразует в NVARCHAR(MAX)
Так что лучше сразу использовать юникод
и перед литеральными строками ставить букву N
...
Рейтинг: 0 / 0
сложная процедура
    #38313082
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Викт.NawyВот такая псевдопроцедура:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE addWeight
	@weight INT,
	@name VARCHAR(40),
        @column VARCHAR(40),
AS
INSERT INTO TWeight(time, file_id)
VALUES (@weight, SELECT TOP 1 @column FROM @name ORDER BY @column DESC;);


Подскажите как результат запроса SELECT TOP 1 @column FROM @name ORDER BY @column DESC; записать в поле file_id таблицы TWeight.
Подскажите как это сделать без программы на ЯП, в чистом T-SQL.
Что-то типа такого, наверное
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE PROCEDURE addWeight
	@weight INT,
	@name VARCHAR(40),
        @column VARCHAR(40)
AS
DECLARE @sql varchar(max)
SET @sql=N'
INSERT INTO TWeight(time, file_id)
SELECT '+CONVERT(varchar,@weight)+', (SELECT TOP 1 '+CONVERT(varchar,@column)+' FROM '+CONVERT(varchar,@name)+' ORDER BY '+CONVERT(varchar,@column)+' DESC)';
EXEC(@sql)

объясните, пожалуйста, что случится при вот таком вызове процедуры?
Код: sql
1.
exec addWeight '0,0 truncate table TWeight--', '', ''
...
Рейтинг: 0 / 0
сложная процедура
    #38313087
Фотография Сергей Викт.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Сергей Викт.пропущено...

Что-то типа такого, наверное
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE PROCEDURE addWeight
	@weight INT,
	@name VARCHAR(40),
        @column VARCHAR(40)
AS
DECLARE @sql varchar(max)
SET @sql=N'
INSERT INTO TWeight(time, file_id)
SELECT '+CONVERT(varchar,@weight)+', (SELECT TOP 1 '+CONVERT(varchar,@column)+' FROM '+CONVERT(varchar,@name)+' ORDER BY '+CONVERT(varchar,@column)+' DESC)';
EXEC(@sql)

объясните, пожалуйста, что случится при вот таком вызове процедуры?
Код: sql
1.
exec addWeight '0,0 truncate table TWeight--', '', ''


понятия не имею) я привёл пример. Вопросы к ТС)
...
Рейтинг: 0 / 0
сложная процедура
    #38313089
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эээ... не совсем удачный пример, потому как первый параметр int...
Но суть вопроса понятна?
...
Рейтинг: 0 / 0
сложная процедура
    #38313090
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Викт.Cygapb-007пропущено...
объясните, пожалуйста, что случится при вот таком вызове процедуры?
Код: sql
1.
exec addWeight '0,0 truncate table TWeight--', '', ''


понятия не имею) я привёл пример. Вопросы к ТС)

sql injection
иногда неплохо бы не просто приводить примеры.
...
Рейтинг: 0 / 0
сложная процедура
    #38313094
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locky,

не будет там ее,первый паметр интовый
...
Рейтинг: 0 / 0
сложная процедура
    #38313098
Фотография Сергей Викт.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Эээ... не совсем удачный пример, потому как первый параметр int...
Но суть вопроса понятна?
Код: sql
1.
exec addWeight '0,0 truncate table TWeight--', '', ''



Не очень....
ServerMsg 8114, Level 16, State 5, Procedure addWeight, Line 0
Error converting data type varchar to int.
...
Рейтинг: 0 / 0
сложная процедура
    #38313102
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxxlocky,

не будет там ее,первый паметр интовый
Код: sql
1.
exec addWeight 0, '', ' 0); truncate table TWeight--'
...
Рейтинг: 0 / 0
сложная процедура
    #38313104
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Викт.,

кста ,шлепнеться еще до того :))
Код: sql
1.
2.
3.
4.
SET @sql=N'
INSERT INTO TWeight(time, file_id) -- 2 поля
SELECT '+CONVERT(varchar,@weight)+', --1 значение
EXEC(@sql)
...
Рейтинг: 0 / 0
сложная процедура
    #38313105
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Викт.Cygapb-007Эээ... не совсем удачный пример, потому как первый параметр int...
Но суть вопроса понятна?
Код: sql
1.
exec addWeight '0,0 truncate table TWeight--', '', ''



Не очень....
ServerMsg 8114, Level 16, State 5, Procedure addWeight, Line 0
Error converting data type varchar to int.
Оки, попытка number two
Код: sql
1.
exec addWeight 0,'','0) truncate table TWeight--'
...
Рейтинг: 0 / 0
сложная процедура
    #38313108
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тьфу..
Код: sql
1.
exec addWeight 0,'','0) truncate table TWeight--'
...
Рейтинг: 0 / 0
сложная процедура
    #38313110
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

а так заработает )
...
Рейтинг: 0 / 0
сложная процедура
    #38313113
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Викт., сорри значения не досчитал... рабочая процедура
...
Рейтинг: 0 / 0
сложная процедура
    #38313115
Фотография Сергей Викт.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaxxСергей Викт., сорри значения не досчитал... рабочая процедура
да я без претензий на суперпрофи) Базовый пример. Ни о какой защищенности говорить и не собирался) Налетели как коршуны ;)

Код: sql
1.
exec addWeight 0,'','0) truncate table TWeight--'


и таки да, не спорю:)
...
Рейтинг: 0 / 0
сложная процедура
    #38313118
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Викт.,

да лано вам,вечер уже
...
Рейтинг: 0 / 0
сложная процедура
    #38313123
Фотография Сергей Викт.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaxxСергей Викт.,

да лано вам,вечер уже
) всё ок) я только за дополнительный ликбез) Теперь сижу думаю, как это можно пофиксить.)))
Т.к. по итогу выполняется:

Код: sql
1.
2.
3.
4.
  INSERT INTO TWeight(time, file_id)  
  SELECT 0, (SELECT TOP 1 0) 
  delete TWeight
-- FROM  ORDER BY 0) delete TWeight-- DESC)


Вполне себе неплохо))
...
Рейтинг: 0 / 0
сложная процедура
    #38313129
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Викт., уже упоминалось в первом же ответе: тема "ТОП 10" вопрос номер 6
...
Рейтинг: 0 / 0
сложная процедура
    #38313130
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007

[/src]объясните, пожалуйста, что случится при вот таком вызове процедуры?
Код: sql
1.
exec addWeight '0,0 truncate table TWeight--', '', ''

[/quot]
Где будет? У нормального архитектора будет permission denied ;-)
...
Рейтинг: 0 / 0
сложная процедура
    #38313132
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кста рабочий вариант от Cygapb-007 ,таки
...
Рейтинг: 0 / 0
сложная процедура
    #38313142
Фотография Сергей Викт.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileCygapb-007

объясните, пожалуйста, что случится при вот таком вызове процедуры?
Код: sql
1.
exec addWeight '0,0 truncate table TWeight--', '', ''


Где будет? У нормального архитектора будет permission denied ;-)
Понятное дело, что если у обычного юзера, юзающего процедуру есть права на truncate table, то тут уже вопросы к архитектору..
...
Рейтинг: 0 / 0
сложная процедура
    #38313149
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну хорошо, напишем так (37 знаков)
Код: sql
1.
'0)update employes set oklad=1000000--'
...
Рейтинг: 0 / 0
сложная процедура
    #38313151
Фотография Сергей Викт.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007ну хорошо, напишем так (37 знаков)
Код: sql
1.
'0)update employes set oklad=1000000--'


вот это уже ближе к истине) Я согласен)))
...
Рейтинг: 0 / 0
сложная процедура
    #38313166
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да с чего вы вообще взяли что есть принципиальная овзможность вызывать такого рода процки простым пользователям?

Вы же не будете вставлять защиту от инжекшена на каждый дин. эскуль с параметрами, если его запускаете только вы, ваш босс и скомпиленное клиентское приложение али джоб, а у рядового злоумышленника возможности запусить код руками в принципе нет...

Или будете?
...
Рейтинг: 0 / 0
сложная процедура
    #38313171
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileВы же не будете вставлять защиту от инжекшена на каждый дин. эскуль с параметрами, если его запускаете только вы, ваш босс и скомпиленное клиентское приложение али джоб, а у рядового злоумышленника возможности запусить код руками в принципе нет...
Сегодня только вы, завтра только ваш босс, послезавтра прикрутили на сайт. Хреновая аргументация, чтобы не оборачивать имена объектов в quotename, и не использовать sp_executesql для передачи параметров.
...
Рейтинг: 0 / 0
сложная процедура
    #38313186
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileДа с чего вы вообще взяли что есть принципиальная овзможность вызывать такого рода процки простым пользователям?

Вы же не будете вставлять защиту от инжекшена на каждый дин. эскуль с параметрами, если его запускаете только вы, ваш босс и скомпиленное клиентское приложение али джоб, а у рядового злоумышленника возможности запусить код руками в принципе нет...

Или будете?Холивар...
Я просто к тому, что особой разницы между 'code '+@param+' code' и использованием параметров - на стадии разработки нет:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE PROCEDURE addWeight
   @weight INT,
   @name VARCHAR(40),
   @column VARCHAR(40)
AS
declare @sql varchar(max)='
   INSERT INTO TWeight(time, file_id)
   VALUES (@weight, (SELECT TOP 1 @column FROM @name ORDER BY @column DESC));'
exec sp_executesql 
   @sql, N'
   @weight INT,
   @name VARCHAR(40),
   @column VARCHAR(40)',
   @weight, @name, @column
...
Рейтинг: 0 / 0
сложная процедура
    #38313187
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нормальная аргументация, потому, что на сайт будут крутить имея в виду именно то, что крутится на сайте. Ниразу не видел чтобы на сайт прикручивали нутрянку, всегда делаются "интерфейсы" которые посылают на сервак "просьбы" что-то там посчтитать и вернуть.
...
Рейтинг: 0 / 0
сложная процедура
    #38313191
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileНормальная аргументация, потому, что на сайт будут крутить имея в виду именно то, что крутится на сайте. Ниразу не видел чтобы на сайт прикручивали нутрянку, всегда делаются "интерфейсы" которые посылают на сервак "просьбы" что-то там посчтитать и вернуть.Любой символьный параметр, который будет передан в команду exec напрямую - хоть через 1 интерфейс, хоть через тыщу - будет приводить к injection, и все только потому, что автор сего кода когда-то посчитал, что его код никто использовать не будет.
...
Рейтинг: 0 / 0
сложная процедура
    #38313215
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сразу масса догадок и предположений появляется:
1. У юзера не будет прав
2. запускать будет только ограниченный круг лиц
3. это не прикрутят на сайт/в продакшн


как показывает практика, в тех случаях когда код пишут исходя из этих допущений - всё происходит с точностью до наоборот
...
Рейтинг: 0 / 0
сложная процедура
    #38313216
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм... а не работает мой пример...
не получается имя таблицы передать через параметр как varchar, требуется @tablename TABLE...
а просто exec() - без проблем...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
--CREATE PROCEDURE addWeight
declare
   @weight INT,
   @name VARCHAR(40),
   @column VARCHAR(40)
--AS
select @weight=0, @name='myTable', @column='myColumn'

declare @sql nvarchar(max)=N'select * from (VALUES (@weight, (SELECT TOP 1 @column FROM @name ORDER BY @column DESC)))v(a,b);'
declare @run nvarchar(max)=replace(replace(replace(@sql,'@weight', @weight),'@column',@column),'@name',@name)

exec(@run)
-- OK

exec sp_executesql 
   @sql, N'
   @weight INT,
   @name VARCHAR(40),
   @column VARCHAR(40)',
   @weight=@weight, @name=@name, @column=@column
-- Error 1087: Must declare the table variable "@name".

...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / сложная процедура
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]