Nazwa tabeli jako parametr do procedury dla SQL2005 Server - jakprzekazac?
pebryl - 11-05-2007 12:32
Nazwa tabeli jako parametr do procedury dla SQL2005 Server - jakprzekazac?
Witam W jaki sposob mozna do procedury do SQL2005 serwera przekazac parametr ktory bedzie nazwa tabeli i potem wykorzysta ja w selekcie ?
Proba
Create Procedure sprawdz @tabela varchar(100) Select * from @tabela - nie dziala Select * from "@tabela" - nie dziala Select * from ",@tabela," - nie dziala Select * from "'@tabela'" j.w
Jak to zrobic ?
Robert Winkler - 11-05-2007 12:32
> Witam > W jaki sposob mozna do procedury do SQL2005 serwera przekazac parametr ktory bedzie nazwa tabeli i potem wykorzysta ja w selekcie > ? > > Proba > > > Create Procedure sprawdz @tabela varchar(100) > Select * from @tabela - nie dziala > Select * from "@tabela" - nie dziala > Select * from ",@tabela," - nie dziala > Select * from "'@tabela'" j.w > > Jak to zrobic ?
ALTER PROCEDURE [dbo].[sprawdz] @tabela varchar(100) AS BEGIN SET NOCOUNT ON; DECLARE @STMT NVARCHAR(MAX) SET @STMT = 'SELECT * FROM [' + @tabela + ']' EXEC sp_executesql @STMT END
Wywołać mozesz to na przykład w taki sposób: exec sprawdz 'TabelaTestowa'
Ale naprawde ciekawe efekty pojawią się dopiero gdy dociekliwy użytkownik wywoło tą procedure na przyklad w następujący sposób:
exec sprawdz 'TabelaTestowa]; DROP TABLE [RozliczenieFinansowe];--'
Po wykonaiu takiego zapytania gwarantuje ci mnóstwo rozrywki ;-)))
-- ____________ Robert Winkler
Marcin A. Guzowski - 11-05-2007 12:32
Robert Winkler wrote: > ALTER PROCEDURE [dbo].[sprawdz] @tabela varchar(100) AS > BEGIN > SET NOCOUNT ON; > DECLARE @STMT NVARCHAR(MAX) > SET @STMT = 'SELECT * FROM [' + @tabela + ']' > EXEC sp_executesql @STMT > END > > Wywołać mozesz to na przykład w taki sposób: > exec sprawdz 'TabelaTestowa' > > Ale naprawde ciekawe efekty pojawią się dopiero > gdy dociekliwy użytkownik wywoło tą procedure > na przyklad w następujący sposób: > > exec sprawdz 'TabelaTestowa]; DROP TABLE [RozliczenieFinansowe];--' > > Po wykonaiu takiego zapytania gwarantuje ci mnóstwo rozrywki ;-)))
SQL injection rzeczywiście może być poważnym problemem, ale jeżeli już działać z dynamiczny SQLem, to jedna z linijek procedury powinna wyglądać tak:
SET @STMT = 'SELECT * FROM ' + QUOTENAME(@tabela)
-- Pozdrawiam, Marcin Guzowski http://guzowski.info
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
=?iso-8859-2?q?Co_oznacza_b=B3=B1d_Warning:_mysql=5Fconnect() _[function.mysql-connect]:_Can't_connect_to_local_MySQL_server_through_sock et_'/var/run/mysqld/mysqld.sock'_(2)_in?=
jak to =?ISO-8859-2?Q?zrobi=E6=2E=2E=2E=3F_TSQL_sql_server?==?ISO-8859-2?Q?_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Tworzenie tabeli z =?ISO-8859-2?Q?nazw=B1_ustalan=B1_przez_?==?ISO-8859-2?Q?usera?=
=?ISO-8859-2?Q?Zawarto=B6=E6_tabeli_na_podstawie_warto=B6?==? ISO-8859-2?Q?ci_w_innej?=
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
MySQL - jak =?ISO-8859-2?Q?wyeksportowa=E6_zawarto=B6=E6_wie?==?ISO-8859-2?Q?lkiej_tabeli?=
[MySQL] Skopiowanie =?ISO-8859-2?Q?warto=B6ci_z_jednego_po?==?ISO-8859-2?Q?la_do_drugiego_w_jednej_tabeli=2C_r=F3=BFne_?= =?ISO-8859-2?Q?wiersze=2E?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
zanotowane.pldoc.pisz.plpdf.pisz.platanvarne633.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|