سلام
من میخوام بعد از اینکه یک فیلد که از نوع int هست مقدار 0 گرفت سطر مربوطه پاک بشه.
چه کار باید بکنم؟
Printable View
سلام
من میخوام بعد از اینکه یک فیلد که از نوع int هست مقدار 0 گرفت سطر مربوطه پاک بشه.
چه کار باید بکنم؟
از تریگر استفاده کنید
با تریگر میتوند این کار کنید.
ولی من هنوظ نتونستم مقدار قبلی متغیر بروز شده را بگیرم.
https://barnamenevis.org/showthread.p...F%D8%B1-UPDATE
CREATE TABLE [dbo].[Student](
[Name] [nvarchar](50) NULL,
[Numre] [int] NULL,
[ID] [bigint] IDENTITY(1,1) NOT NULL)
create TRIGGER [dbo].[Chek0]
ON [dbo].[Student]
AFTER Update
AS
BEGIN
SET NOCOUNT ON;
if (COLUMNS_UPDATED()> 0)
begin
declare @ID bigint;declare @Numre int;
select @ID = ID from INSERTED
set @Numre = (SELECT [Numre] FROM INSERTED)
if @Numre = 0
begin
delete from Student where ID = @ID
END
END
END
با این اتوماتیک پاک میشه
TRIGGER چیه؟
من الان یه تریگر با همین کدها نوشتم با توجه به ستونهای جدولم ولی چرا اعمال نمیشه؟
اینم تریگرمه:
CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name, sysname, Trigger_Name>
ON <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname, Table_Name>
AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE>
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
if (COLUMNS_UPDATED()> 0)
begin
declare @ID bigint;declare @value int;
select @ID = ID from INSERTED
set @value = (SELECT [@value] FROM INSERTED)
if @value = 0
begin
delete from Table_1 where ID = @ID
END
END
GO
جداول inserted و deleted کجا هستند؟ وچه کاربردی دارن؟
inserted و deleted مقدار خروجی رکورد هستند که تغیرات روس اعمال شده.
تست بزن
CREATE TRIGGER [Chek0]
ON Table_1
AFTER Update
AS
BEGIN
SET NOCOUNT ON;
if (COLUMNS_UPDATED()> 0)
begin
declare @ID bigint;declare @value int;
select @ID = ID from INSERTED
set @value = (SELECT [@value] FROM INSERTED)
if @value = 0
begin
delete from Table_1 where ID = @ID
END
END
END
ارور میده و از @value ایراد میگیره
ضمیمه 98590
بعد از اجرا هیچی تو جدول پاک نمیشه.
اینم جدولم:
ضمیمه 98591
بعد از اینکه کد رو مینویسی داخل تریگر باید چه کارهایی بکنی که به جدول اعمال بشه؟ میشه مرحله به مرحله بگید؟
این قسمت تصحیح کنید
set @value = (SELECT [@value] FROM INSERTED)
set @value = (SELECT [value] FROM INSERTED)
@ نیاز نیست در SELECT .
بعد f5 بزنید تا تریگر ساخته شود.
بعد با هر دستکاری مقادیر این تریگر چک میشود روی تغیرات فقط
خیلی ممنون انجام شد.
یه سوال : رکوردی که پاک میشه چجوری با استفاده از تریگر deleted باید بازگردانی بشه؟
سلام.
متاسفانه یکی از اشتباهاتی که عموم افراد مرتکب میشن اینه که فرض می کنن جداول INSERTED و DELETED نمی تونن حاوی بیش از یک Record باشن. این فرض اشتباه هستش و منجر به نوشتن کدهای نادرست میشه. کدی که شما نوشتید نیز کد صحیحی نیست و ایرادهای فراوانی داره. از این گذشته، شما باید در Business Logic خودتون وقتی متوجه شدید که مقدار فیلد صفر شده، دیگه اون فیلد رو Update نکنید، بلکه یک ضرب Delete اش کنید تا بدین ترتیب نیازی به نوشتن Trigger نیز نداشته باشید.
موفق باشید.
سلام اقای موسوی
خب اینو مپسپوریم به تریگر .
اره از نظر شما باید در برنامه شرط بزاریم که true شد اونو رکورد حذف کنه.
در کل منظور شما همین بود دیگه:لبخند:
چجوری بدون استفاده از تریگر این عملیات رو انجام بدیم؟ حالا اگه از تریگر استفاده کنیم چی میشه؟
سلام.
من نگفتم 100% از Trigger استفاده نکنید، برخی اوقات بنا به دلائل مختلف مجبورید اینکارو کنید؛ مساله این هستش که اگر میتونید ازش پرهیز کنید، اینکارو کنید. در مورد شما، بنظر میرسه اینکار بسادگی در Business Logic Layer میسر باشه. به بیان دیگه، وقتی در کدتون متوجه میشید که فیلد مورد نظر از اون رکورد باید به صفر Update بشه، جای اینکه دستور UPDATE رو به SQL Server ارسال کنید، دستور DELETE رو ارسال کنید تا رکورد مورد نظر حذف بشه.
در مورد اون Trigger هم به گمان اصل مساله رو توضیح دادم، مشکل اصلی این هستش که فرض شده جدول DELETED حاوی یک Record هستش (در حالیکه میتونه اینطور نباشه). به گمانم با این توضیح میتونید Trigger نوشته شده رو تغییر بدید و ازش استفاده کنید. اما باز هم اگر موفق نشدید لطفا بگید تا اینکارو براتون انجام بدم.
موفق باشید.
دوست عزیز من
مشگل جدید من اینکه میخوام رکوردی که به اشتباه حذف شده به جدولم برگردونم و نمیدونم کدش چجوری میشه؟ حالا با تریگر یا بدون اون نمیدونم.
ببینید این قطعه کد کمک میکنه؟ اگه شما کدی دارید که با استفاده از پروسیجر یا تریگر این کارو میکنه بگید. جدولم 2 تا ستون id و name داره.
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
declare @ID int;declare @name nvarchar;
set @ID = (SELECT @ID FROM DELETED)
set @name = (SELECT name FROM DELETED)
Insert Into mytable ([Log]) values(@Name +' '+CAST(@ID as nvarchar)+' : [AFTER DELETE]');
خب دستور دلیت که نباید اشتباه بشه:گیج:. کاربر باید بفهم خودش دیگه.
با دستورات بالا یک جدول لاگ دارید که کپی رکورد در جدول لاگ درج میکنه.