PDA

View Full Version : نحوه نعریف متغییر سراسری برای استفاده در تریگر



Sal_64
دوشنبه 14 بهمن 1387, 10:55 صبح
سلام




چطور امکان داره متغییری تعریف کرد که بعد از اولین مقدار دهی در یک sp در تمام تریگرها به مقدار اون دسترسی داشت و تا زمانی که برنامه با sql در ارتباط است اون مقدار قابل استفاده باشد؟؟



اگه نمونه کدی هم قرار بدید ممنون میشم :قلب:

با تشکر

AminSobati
دوشنبه 14 بهمن 1387, 18:48 عصر
سلام دوست عزیزم،
این امکان وجود نداره، اگر اصل مشکل رو توضیح بفرمایید راه حلش پیدا میشه انشاءالله!

Sal_64
دوشنبه 14 بهمن 1387, 19:17 عصر
سلام


سلام دوست عزیزم،
سلام بر امین خان ثباتی

توضیحات بیشتر

قصد دارم نام کاربری که اقدام به انجام اعمال insert و ... می کند رو در تیبلی ثبت کنم

چطور میتونم به نام کاربری اون که در ابتدای ورود به برنامه(تحت ویندوز) چک می شود دسترسی داشته باشم و اینکار رو انجام بدم

در واقع قصد دارم ، مشخص کنم هر کاربر چه عملی رو انجام داده

با تشکر

AminSobati
دوشنبه 14 بهمن 1387, 19:47 عصر
سلام!
زمانی که کاربر لاگین میکنه، SPID اون فرد رو به همراه نام کاربریش در یک جدول ثبت کنید. SPID@@ همیشه قابل دسترسه و از طریق اون میتونین در جدول، نام کاربری رو بدست بیارین. وقتی کاربر Logout کرد، SPID رو از جدول حذف کنید. اگر Logout به شکل غیر عادی انجام بشه و برنامه موفق به حذف SPID از جدول نشد، اون رکورد بصورت زائد باقی میمونه. لذا باید هر کاربری که وارد سیستم میشه، جدول رو چک کنه و اگر همون SPID از قبل وجود داشت، حذف کنه و مجددا با نام کاربری خودش Insert کنه

ali_kolahdoozan
سه شنبه 15 بهمن 1387, 08:20 صبح
در هنگام login در برنامه userid فرد رو در یک متغیر سراسری در خود application نگهداری کنید و هر کجا نیاز به ثبت log هست از طریق sp های خود این id رو در هر کجا خواستید ذخیره کنید . حتی میتوانید در لایه دیتا کاری کنید که این پارامتر خود به خود ارسال بشه . دیگر نیازی به trigger هم نیست .

Sal_64
سه شنبه 15 بهمن 1387, 12:28 عصر
سلام



زمانی که کاربر لاگین میکنه، SPID اون فرد رو به همراه نام کاربریش در یک جدول ثبت کنید.تشکر ، امتحان می کنم




در هنگام login در برنامه userid فرد رو در یک متغیر سراسری در خود application نگهداری کنید و هر کجا نیاز به ثبت log هست از طریق sp های خود این id رو در هر کجا خواستید ذخیره کنید . حتی میتوانید در لایه دیتا کاری کنید که این پارامتر خود به خود ارسال بشه . دیگر نیازی به trigger هم نیست . [/]تشکر

هدف از استفاده تریگر ، شبیه سازی حذف منطقی اطلاعات هست (را بهتری وجود داره ؟)
دقیقتر اینکه : هر رکوردی که حذف شد با نام کاربر حذف کننده اون در تیبل دیگه ای ذخیره شه و برای اینکار مناسبترین گزینه باید تریگر باشه درسته ؟

حالا سوال اینکه آیا این امکان وجود داره که نام کاربر رو به عنوان پارامتر به تریگر فرستاد؟


با تشکر

Sal_64
سه شنبه 15 بهمن 1387, 13:48 عصر
سلام


تشکر ، امتحان می کنم
declare @temp2 varchar(500)
set @temp2='select u from [temp_u] where spid ='''+ @@spid +''''
exec(@temp2)
خطا

Conversion failed when converting the varchar value 'select u from [temp_u] where spid ='' to data type smallint.زمانی که قصد دارم وجود spid رو چک کنم از دستور فوق استفاده کردم که این خطا رو میده
جه باید کرد؟؟

با تشکر

mannai29
سه شنبه 15 بهمن 1387, 14:44 عصر
سلام !
@@spid رو باید به رشته تبدیل کنید تا به بتوانید به یک رشته دیگر بچسبانید.

((cast(@@spid as varchar(X

Sal_64
سه شنبه 15 بهمن 1387, 16:32 عصر
سلام

تشکر

قصد دارم از نتیجه exec(temp2 ) در دستور بعد استفاده کنم

مثلا برا ی کد زیر


set @temp2='select u from [temp_u] where spid =N'''+ cast(@@spid as varchar(20)) +''''
exec(@temp2)

if(@temp2 != '')
begin
----
----
endکد فوق رو چطور باید تصحیح کرد؟

با تشکر

AminSobati
سه شنبه 15 بهمن 1387, 17:24 عصر
چرا رفتین سراغ Dynamic TSQL؟

Sal_64
سه شنبه 15 بهمن 1387, 21:17 عصر
سلام


چرا رفتین سراغ Dynamic TSQL؟ قصد بر این که بررسی بشه که آیا این spid در تیبل موقت ،ذخیره( نام کاربری و spid) و جود داره یا خیر

و سوال دیگه در مورد spid آیا این عدد برا ی هر ماشین متصل به sql متفاوته ؟

و آیا در یک ماشین هر تعداد کاربر که به یک sql(چه روی شبکه و چه روی سیستم) متصل بشن spid مشابه دارن؟

با تشکر

linux
چهارشنبه 16 بهمن 1387, 08:20 صبح
سلام

قصد بر این که بررسی بشه که آیا این spid در تیبل موقت ،ذخیره( نام کاربری و spid) و جود داره یا خیر

و سوال دیگه در مورد spid آیا این عدد برا ی هر ماشین متصل به sql متفاوته ؟

و آیا در یک ماشین هر تعداد کاربر که به یک sql(چه روی شبکه و چه روی سیستم) متصل بشن spid مشابه دارن؟

با تشکر
spid برای هر کانکشن یک عدد جدید می سازه

AminSobati
چهارشنبه 16 بهمن 1387, 11:24 صبح
سلام

قصد بر این که بررسی بشه که آیا این spid در تیبل موقت ،ذخیره( نام کاربری و spid) و جود داره یا خیر

و سوال دیگه در مورد spid آیا این عدد برا ی هر ماشین متصل به sql متفاوته ؟

و آیا در یک ماشین هر تعداد کاربر که به یک sql(چه روی شبکه و چه روی سیستم) متصل بشن spid مشابه دارن؟

با تشکر

منظورتون از جدول موقت جداولی هست که با # شروع میشن؟ اگر بله، جدول شما نباید به این شکل ساخته باشه و یک جدول عادی مورد نیازه. در ضمن باز هم لزومی به استفاه از Dynamic TSQL وجود نداره. شما دارین از یک جدول معمولی Select میزنین:

select * from MyUsers where spid=@@spid

اگر 10 تا Connection از یک ماشین به SQL Server داشته باشین، هر کدوم یک SPID مجزا میگیره، ولی در SQL Server میتونین با تابع HOST_NAME تشخیصش بدین

Sal_64
پنج شنبه 17 بهمن 1387, 00:28 صبح
سلام

یک جدول عادی مورد نیازه.جدول عادی

جناب ثباتی

در واقع هدف اینه که در sp زیر ابتدا صحت نام و رمز عبور کاربر چک شود

و بعد از اون در تیبل temp_u چک شود که آیا spid این کاربر تکراری هست یا خیر

و در آخر رمز عبور کاربر به برنامه بر گردونده شه



اگه احتیاج به توضیحات بیشتر هست ،بفرمایید



لطف می کنید در تکمیل این sp همکاری کنید :قلب:



ALTER PROCEDURE [dbo].[check_pass]

(
@user_name varchar(500),
@temp varchar(500),
@temp2 varchar(500)
)

AS
set @temp=' select pass from [user] where user_name=N'''@user_name''''
exec(@temp)

if (@temp !='' )
begin
set @temp2='select user from [temp_u] where spid =N'''+cast( @@spid,varchar(10)) +''''
exec(@temp2)

if(@temp2 !='')
update temp_u set user=@user_name where spid=@@spid
else
insert into temp_u (spid,user) values (@@spid,@user_name)
end

select @temp
RETURNبا تشکر

AminSobati
جمعه 18 بهمن 1387, 12:00 عصر
دوست عزیز شما از تابع exists میتونین کمک بگیرین. ضمنا وقتی یک مقدار قرار نیست به خارج از sp برگردونده بشه، نباید پارامترش کرد. به جاش از Declare بعنوان متغیر استفاده کنین



ALTER PROCEDURE [dbo].[check_pass]

(
@user_name varchar(500),
@user_pass varchar(500)
)

AS
if exists (select * from [user] where user_name=@user_name and user_pass=@user_pass)
begin
-- your code here...
end

Sal_64
جمعه 18 بهمن 1387, 20:04 عصر
سلام



جناب ثباتی تشکر

مسئله حل شد

اما سوال دیگه ای از دوستان داشتم



اگر 10 تا Connection از یک ماشین به SQL Server داشته باشین، هر کدوم یک SPID مجزا میگیره

ببینید

من از یک سیستم با اختلاف زمانی چند ثانیه با 3 نام کاربری (از طریق برنامه) وارد و خارج شدم

اما هر3 نام کاربری رو با یک spid ذخیره کرد spid=54

و چند دقیقه بعد دوباره اینکار رو انجام دادم برای هر سه نام کاربری spid=57 شد


اگه جایی رو بد برداشت کردم بیشتر توضیح می دید??

با تشکر

AminSobati
جمعه 18 بهمن 1387, 23:25 عصر
ارتباطی بین نام کاربری و SPID نداره. دفعه اول وارد میشین، مثلا 54 رو میده. وقتی خارج میشین، 54 آزاد شده و دوباره که وارد میشین حتی اگر نام کاربری فرق کنه، باز هم ممکنه همون 54 رو بده. اما اگر در دفعه اول ورود 54 رو داد، این کاربر Disconnect نکنه و کاربر دیگه ای وارد بشه (حتی از همون دستگاه) ایندفعه 55 رو به دومی میده