PDA

View Full Version : تفاوت اجرای پروسیجور از درون sql management studio و از طریق اپلیکشن ؟



dorparasti
جمعه 16 دی 1390, 13:37 عصر
من یک پروسیجور به صورت زیر می سازم که یک پارامتر از نوع int می گیره و رکورد متناظر اونرو برمیگردونه .




Create PROCEDURE [dbo].[TableGetByID]

@ID int=0
AS
BEGIN
SET NOCOUNT ON;

; SELECT * from TableName where ID=@ID;
END


و در اپلیکشن اینطور مقدار دهی می کنم :



new SqlParameter("@ID", SqlDbType.Int,4, ParameterDirection.Input,false,0,0,"", DataRowVersion.Proposed, ID)



خوب همیشه اینطور کد می نوشتم و مطمئن بودم که چون از پارامتر استفاده می کنم و نوع داده هم به درستی تعیین شده مشکلی از نظر sql injection ندارم . اما امروز اومدم از توی خود sql managment پروسیجور رو execute کردم و برای پارامتر @ID مقدار زیر را دادم با این فرض که خطا می گیره


USE [DataBase]
GO

DECLARE @return_value int

EXEC @return_value = [dbo].[TableGetByID]
@ID=1;delete from tablename where 0=0;

SELECT 'Return Value' = @return_value

GO



اما در کمال تعجب کد اجرا شد و علاوه بر برگردوندن یک رکورد همه رکوردها از جدول حذف شد ! کد اجرا شده بود .

اصلاً بد حالم بد شد .
حالا دارم فک می کنم شاید چون مستقیم از توی sql managment بوده اینکارو کرده ولی ...

این حدسم درسته ؟ یا واقعاً باید همه کدهای همه پروژه ها رو اصلاح کنم

mohdeL
جمعه 16 دی 1390, 16:20 عصر
شما این کد زیر

EXEC @return_value = [dbo].[TableGetByID]
@ID=1;delete from tablename where 0=0;

به

EXEC @return_value = [dbo].[TableGetByID] 1;
delete from tablename where id=0;

تبدیل نمایید

حمیدرضاصادقیان
جمعه 16 دی 1390, 22:02 عصر
سلام.
دوست عزیز این کار شما اشتباه هست. به این خاطر که در Management Studio شما دارید دوتا دستور مختلف رو اجرا میکنید و هرچند تا دستور دیگه هم مینوشتید و ; رو آخر هرکدوم میذاشتید دستور اجرا میشد.
; به معنی کلمه Go هست یعنی دستور اولی تموم شده و باید دستورات بعدی اجرا بشه.
ولی وقتی از داخل برنامه دارید صدا میزنید فقط یک مقدار 1 رو دارید ارسال میکنید . پس تست شما اشتباه بوده و جای نگرانی نمی باشد.