PDA

View Full Version : دریافت داده در sp



Iran58
پنج شنبه 17 مهر 1393, 16:47 عصر
سلام
من sp زیر را نوشته ام
alter proc insertA
@name nvarchar(50),
@family nvarchar(50),
@age int,
@users nvarchar(50)
as
begin
insert into a
(name,family,age)
values
(@name,@family,@age)
end
که اطلاعات را در جدول مورد نظر وارد می کند تعدادستونهای جدول همین سه ستون می باشد
حال من می خواهم users را هم در برنامه از کاربر دریافت کند
در اصل می خواهم این users را درتریگر مورد نظرم ثبت کنم اما نمی توانم این usersرا فراخوانی کنم
users نام کاربری است که کاربر با آن لاگین شده است
و تریگر زیر را نوشته ام
ALTER TRIGGER [dbo].[TestInsertTablea] ON [dbo].[a]
FOR INSERT
AS
declare @teId int;
declare @teName nvarchar(50);
declare @teFamily nvarchar(50);
declare @teAge int;
declare @teUsers nvarchar(50);
declare @teInsertDateTime datetime;
declare @teMassege nvarchar(50);
select @teId=Id from inserted insertA;
select @teName=name from inserted insertA;
--select @teFamily= from inserted insertA;
select @teAge=age from inserted insertA;
select @teUsers=family from inserted insertA;
select @teInsertDateTime=GETDATE();
select @teMassege=N'ثبت';
insert into [dbo].[Tema]
([Id],[Name],[Famliy],[Age],[Users],[DateInsert],[Message])
values
(@teId,@teName,@teFamily,@teAge,@teUsers,@teInsert DateTime,@teMassege);
go
دراصل نمی خواهم در جدول a نام کاربری طرف را وارد کنم می خواهم با عمل ثبت مستقیما از طریق sp نام کاربری در تریگر مورد نظر ثبت شود
لطف کنید وراهنمای بفرمایید
باتشکر

pezhvakco
پنج شنبه 17 مهر 1393, 18:43 عصر
همچین درست نفهمیدم خواسته شما چی است
ولی همه این کدهایی را که در تریگر نوشته اید می توانید در ادامه همان SP بنویسید .
کنترل و کارایی هم بهتر است

همه دستورات را داخل یک تراکنش (TrancAction) نوشته تا از انجام شدن یا نشدن همه دستورات اطمینان پیدا کنید .

Iran58
جمعه 18 مهر 1393, 10:40 صبح
باسلام
در اصل من می خواهم تریگری بنویسیم که اطلاعات جدول مربوطه را دخیره کنم و علاوه برآن نام کاربری که بروی سطر مورد نظر در حال کار کردن است را هم در تریگر ذخیره کنم
اما این نام کاربری در جدول مورد نظر ثبت نمی شود
در اصل می خواهم یکی از ستونهای تریگر از جدول مورد نظر نباشد واز sp ی باشد که برای ثبت یا ویرایش وحذف استفاده کرده ام
باتشکر

pezhvakco
جمعه 18 مهر 1393, 16:53 عصر
1) شما در SP اولی که نوشته اید، 4 تا ورودی دارید که از بین اون ها Users@ در SP یا Trigger بکار گرفته نشده است ؟

2)
حال من می خواهم users را هم در برنامه از کاربر دریافت کند
در اصل می خواهم این users را درتریگر مورد نظرم ثبت کنم اما نمی توانم این usersرا فراخوانی کنم
users نام کاربری است که کاربر با آن لاگین شده است
=> اگه User همان کاربر وارد شده (لاگین) است، چرا می خواهید ان را از کاربر دریافت کند.
یعنی چی می خواهین User را در تریگر ثبت کنید ولی نمی توانید فراخوانی کنید = تریگر که جایی برای ذخیره اطلاعات نیست و از کجا می خواستید فراخوانی کنید.


3) جدول A شما دارای سه تا ستون است و جدول Tema دارای 7 ستون که 3 تای آن همون ستون های جدول A ؟
=> کارایی این جدول ها

4)
در اصل می خواهم یکی از ستونهای تریگر از جدول مورد نظر نباشد واز sp ی باشد که برای ثبت یا ویرایش وحذف استفاده کرده ام
مفهوم این نوشته رو نمی فهمم .

این کد را نگاه کنید :

Alter Procedure dbo.insertA

(@name nvarchar(50)
,@family nvarchar(50)
,@age int
,@users nvarchar(50)
)
AS
Begin

Declare @NewID Int;
Begin Tran
insert into dbo.a
(name,family,age)
values
(@name,@family,@age);

Set @NewID = Scope_Identity();
IF (@@ERROR <> 0)
Begin
RollBack
Return 1
End;

/*
با توجه به
select @teUsers=family from inserted insertA
=> Users = Family
*/
insert into [dbo].[Tema]
([Id] ,[Name] ,[Famliy] ,[Age] ,[Users] ,[DateInsert] ,[Message])
values
(@NewID ,@Name ,@Family ,@Age ,@family, getdate() ,'ثبت');

IF (@@ERROR <> 0)
Begin
RollBack
Return 1
End;
Commit Tran

End

Iran58
شنبه 19 مهر 1393, 07:27 صبح
1) شما در SP اولی که نوشته اید، 4 تا ورودی دارید که از بین اون ها Users@ در SP یا Trigger بکار گرفته نشده است ؟

2)
=> اگه User همان کاربر وارد شده (لاگین) است، چرا می خواهید ان را از کاربر دریافت کند.
یعنی چی می خواهین User را در تریگر ثبت کنید ولی نمی توانید فراخوانی کنید = تریگر که جایی برای ذخیره اطلاعات نیست و از کجا می خواستید فراخوانی کنید.


3) جدول A شما دارای سه تا ستون است و جدول Tema دارای 7 ستون که 3 تای آن همون ستون های جدول A ؟
=> کارایی این جدول ها

4)
مفهوم این نوشته رو نمی فهمم .

این کد را نگاه کنید :

Alter Procedure dbo.insertA

(@name nvarchar(50)
,@family nvarchar(50)
,@age int
,@users nvarchar(50)
)
AS
Begin

Declare @NewID Int;
Begin Tran
insert into dbo.a
(name,family,age)
values
(@name,@family,@age);

Set @NewID = Scope_Identity();
IF (@@ERROR <> 0)
Begin
RollBack
Return 1
End;

/*
با توجه به
select @teUsers=family from inserted insertA
=> Users = Family
*/
insert into [dbo].[Tema]
([Id] ,[Name] ,[Famliy] ,[Age] ,[Users] ,[DateInsert] ,[Message])
values
(@NewID ,@Name ,@Family ,@Age ,@family, getdate() ,'ثبت');

IF (@@ERROR <> 0)
Begin
RollBack
Return 1
End;
Commit Tran

End



باسلام
بسیار ممنون
دراصل من تریگری می خواهم که ستونی که ایجاد شده است را بدانم کدام کاربر ثبت کرده است اما نام این کاربر در جدول که اطلاعات در آن ثبت می شد ,ثبت نمیشد برای همین چنین تریگری می خواستم
شمااگر راه بهتر می دانید بیان کنید
در انتها با سپاس گزارم از راهنمای شما

مهرداد صفا
شنبه 19 مهر 1393, 09:26 صبح
سلام.
در هنگام insert کردن مقدار نام کاربری را با یک فرمت خاص به یکی از مقادیر اضافه کنید. مثلا به این صورت:

insert A values (@name +'<userName> myUserName</UserName>',@family,@age);

و در یک تریگر after insert مقادیر جدید رو آپدیت کرده و مقدار نام کاربری رو استخراج کنید.
از جداول موقت هم می تونید استفاده کنید.

Iran58
شنبه 19 مهر 1393, 09:44 صبح
سلام.
در هنگام insert کردن مقدار نام کاربری را با یک فرمت خاص به یکی از مقادیر اضافه کنید. مثلا به این صورت:

insert A values (@name +'<userName> myUserName</UserName>',@family,@age);

و در یک تریگر after insert مقادیر جدید رو آپدیت کرده و مقدار نام کاربری رو استخراج کنید.
از جداول موقت هم می تونید استفاده کنید.
سلام
من کد زیر را نوشته ام
alter Procedure dbo.insertb
(@name nvarchar(50)
,@family nvarchar(50)
,@age int
,@users nvarchar(50)
)
AS
Begin
Declare @Id Int;
Begin Tran
insert into dbo.a
(name,family,age)
values
(@name,@family,@age+'<userName>@users</UserName>')
print @users
end

insertb 'aaa','bbb',10,'asas'
اما ارور زیر را می دهد
Msg 245, Level 16, State 1, Procedure insertb, Line 28
Conversion failed when converting the varchar value '<userName>@users</UserName>' to data type int.
چگونه با کد را تغییر بدهم

Iran58
شنبه 19 مهر 1393, 10:24 صبح
و در یک تریگر after insert مقادیر جدید رو آپدیت کرده و مقدار نام کاربری رو استخراج کنید.
از جداول موقت هم می تونید استفاده کنید.
چگونه می توانم انجام بدهم

حمیدرضاصادقیان
شنبه 19 مهر 1393, 10:34 صبح
سلام.
درواقع شما دارید به یک Trigger یک پارامتر پاس میدین که این امر امکان پذیر نیست.
برای اینکار شما یا باید از این مقدار Users استفاده کنید یا اینکه در داخل یک Transaction مثل پستی که دوستمون گفتند استفاده کنید که مطمئن بشید انجام میشه.
یا باید از روشهای دیگه مثل پست 6 استفاده کنید که یک مقداری کار رو سخت میکنه.
به نظرم مناسبترین راه استفاده از کل دستورات شما داخل یک Procedure هست.
میتونید کدی که داخل تریگر نوشتید رو داخل یک Procedure دیگه بنویسید و در Procedure اصلی در داخل یک بلاک Transaction بعد از دستور Insert اون Procedure رو اجرا کنید و مقادیر مورد نظر رو بهش ارسال کنید.
مثل پست 4 ، فقط به جای اینکه همه کد ها داخل یک SP باشند در دو تا هستند که مدیریت کدهاتون نیز آسونتر بشه و قانون Single Responsibility Principal رو رعایت کرده باشید.

Iran58
شنبه 19 مهر 1393, 10:39 صبح
سلام.
درواقع شما دارید به یک Trigger یک پارامتر پاس میدین که این امر امکان پذیر نیست.
برای اینکار شما یا باید از این مقدار Users استفاده کنید یا اینکه در داخل یک Transaction مثل پستی که دوستمون گفتند استفاده کنید که مطمئن بشید انجام میشه.
یا باید از روشهای دیگه مثل پست 6 استفاده کنید که یک مقداری کار رو سخت میکنه.
به نظرم مناسبترین راه استفاده از کل دستورات شما داخل یک Procedure هست.
میتونید کدی که داخل تریگر نوشتید رو داخل یک Procedure دیگه بنویسید و در Procedure اصلی در داخل یک بلاک Transaction بعد از دستور Insert اون Procedure رو اجرا کنید و مقادیر مورد نظر رو بهش ارسال کنید.
مثل پست 4 ، فقط به جای اینکه همه کد ها داخل یک SP باشند در دو تا هستند که مدیریت کدهاتون نیز آسونتر بشه و قانون Single Responsibility Principal رو رعایت کرده باشید.

باسلام
وتشکر آیا با پست 4 می توان برای حذف و ویرایش هم استفاده کرد؟

pezhvakco
شنبه 19 مهر 1393, 10:40 صبح
اما ارور زیر را می دهد
Msg 245, Level 16, State 1, Procedure insertb, Line 28
Conversion failed when converting the varchar value '<userName>@users</UserName>' to data type int.
چگونه با کد را تغییر بدهم

کد خطا مربوط به اضافه کردن مقدار برای ستون Age است.
چون مقدار Age@ را با مقدار رشته ای جمع کرده اید و می خواهید در ستون Age که احتمالا ساختار عددی دارد اضافه کنید، خطا می دهد .