PDA

View Full Version : سوال: عدم اجازه ذخيره ديتا با استفاده از Trigger



mojtaba_z
چهارشنبه 25 اردیبهشت 1387, 16:19 عصر
سلام
توي سرور Windows 2003 ديتابيس قرار داره و كلاينت ها با نرم افزار مربوطه به اطلاعات دسترسي دارن و اين امكان هيچ گونه تغييري در نرم افزار وجود ندارد.(چون سورس رو نداريم)
مشكل اينجاست كه من ميخوام كاربران توي نرم افزار حتما يك فيلد مشخص رو پر كنند و فيلد خالي نباشه . آيا ميشه يك Trigger نوشت تا در موقع ذخيره كردن ، ببينه اگه فيلد خالي هست يك پيغام مشخص به كاربر بده و اجازه ذخيره به كاربر رو ندهد؟

حمیدرضاصادقیان
چهارشنبه 25 اردیبهشت 1387, 16:53 عصر
سلام.بله .شما میتونی یک تریگر برای For update بنویسی. و در اون چک کنی اگر فیلد مورد نظرت مقدارش خالی بود تمامی عملیات رو rollback کنی.

ASKaffash
چهارشنبه 25 اردیبهشت 1387, 17:17 عصر
با سلام
به اینکار میگن استفاده از Trigger ازنوع Instead Of اگر خواستی بگو کمکت کنم

Arghavan_Reza
چهارشنبه 25 اردیبهشت 1387, 17:34 عصر
با سلام، البته از Check Constraints هم میتوانید استفاده کنید:

([Field1] IS NOT NULL AND [Field1] <> '')
با این تفاوت که پیام آن لاتین است و در App باید کنترل خطا شود؛ ولی در Trigger پیام اختصاصی و فارسی میتوان نوشت. البته تفاوت های دیگری هم دارد...

mojtaba_z
دوشنبه 30 اردیبهشت 1387, 13:07 عصر
ممكنه كدي رو كه براي اينكار لازمه بگيد؟

_alish_
دوشنبه 30 اردیبهشت 1387, 13:36 عصر
بكمك SavePoint


CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
SAVE TRANSACTION MyName
INSERT INTO TestAudit
SELECT * FROM inserted
IF (@@error <> 0)
BEGIN
ROLLBACK TRANSACTION MyName
END


بكمك RollBack


CREATE TRIGGER tr_Employees_U on Employees FOR UPDATE AS
IF UPDATE(lastname)
BEGIN
RAISERROR ('cannot change lastname', 16, 1)
ROLLBACK TRAN
RETURN
END
GO

ASKaffash
دوشنبه 30 اردیبهشت 1387, 13:50 عصر
با سلام
در همین بخش یک جزوه قرار دادم که در فصل سوم آن میتوانی به جزئیات Trigger نوشتن را یادبگیرید

mojtaba_z
دوشنبه 30 اردیبهشت 1387, 17:00 عصر
سلام
از RollBack استفاده كردم . ولي پيغام خطايي كه ميده براي خود SQL هست ولي من ميخوام پيغام تعريف شده من فقط نمايش داده بشه. پيغام زير رو ميده :


Another user has modified the contents of the table or view; the database row you are modifiying no longer exists in the database
Database error: '[Microsoft][ODBC SQL Server Driver][SQL Server]cannot change lastname'

Arghavan_Reza
دوشنبه 30 اردیبهشت 1387, 19:56 عصر
متن تریگر را بنویسید تا کمک کنیم.

mojtaba_z
سه شنبه 31 اردیبهشت 1387, 08:59 صبح
متن تريگر بصورت زير ميباشد:


CREATE TRIGGER DenyUpdate on Table2 FOR UPDATE AS
IF UPDATE(Family)
BEGIN
RAISERROR ('cannot change lastname', 16, 1)
ROLLBACK TRAN
RETURN
END

Arghavan_Reza
سه شنبه 31 اردیبهشت 1387, 09:41 صبح
در چه محیطی Update را انجام میدهی؟ (Enterprise Manager دقیقا همین خطا را میدهد)
ولی اگر مثلا از ADO استفاده کنید متن خطای مورد نظر را دریافت میکنید.

mojtaba_z
سه شنبه 31 اردیبهشت 1387, 10:13 صبح
سلام
از توي دلفي و با ADO به ديتابيس وصل شدم. وقتي خواستم تغييري توي فيلد بدم پيغام زير رو داد:


Project Project1.exe raised exception class EOleException with message 'cannot change lastname'.
Process stoped.Use Step or Run to continue

Arghavan_Reza
سه شنبه 31 اردیبهشت 1387, 12:24 عصر
مشکل شما به بخش "پایگاه داده در دلفی" مربوط می شود ولی با این حال در یک پروژه ساده از چند شیء ساده استفاده کنید به جواب می رسید:
ADOConnection, ADOTable, DataSource, DBGrid
موفق باشید.

_alish_
سه شنبه 31 اردیبهشت 1387, 14:25 عصر
خوب داداش من تو تريگري كه نوشتيد دستور RaisError گذاشتيد خوب معلومه كه بايد Ado Exception رخ بده نمي خواي حذف كن اين خط رو

ASKaffash
سه شنبه 31 اردیبهشت 1387, 18:05 عصر
با سلام
باز هم پیشنهاد میکنم از Trigger از نوع Instead of استفاده کنی چون این نوع Trigger جانشین دستور شما میشود ودرصورتیکه بخواهید عمل UpDate صورت گیرد خودتان دستور UpDate را درون Trigger فعال میکنید در غیر اینصورت هیچ رکوردی بدون اجازه شما تغییر نمیکند فقط باید مراقب Recursive شدن باشی
امتحان کن!

mojtaba_z
چهارشنبه 01 خرداد 1387, 08:41 صبح
ممكنه كدي كه براي Instead of پيشنهاد كرديد بنويسيد؟

ASKaffash
چهارشنبه 01 خرداد 1387, 08:58 صبح
با سلام دوست من
اینهم یک نمونه کد که از ورود شماره کارمندی کمتر از 1000 به هرشکلی واز هر محیطی جلوگیری میکنه
کدت شبیه این بنویس مشکل داشتی بذار روی سایت برات اصلاح کنم:
Create Trigger PrsValid On Person


Instead Of Insert , UpDate AS


IF (Select Count (*) From Inserted Where PrsID < 1000 ) = 0


Insert Into Person Select * From Inserted

Arghavan_Reza
چهارشنبه 01 خرداد 1387, 13:52 عصر
راه حلی که به شما دادم (پست 13) تست شده و براحتی جواب میده، شما هم امتحان کنید.