سلام
من میخوام بعد از اینکه یک فیلد که از نوع int هست مقدار 0 گرفت سطر مربوطه پاک بشه.
چه کار باید بکنم؟
سلام
من میخوام بعد از اینکه یک فیلد که از نوع 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 کجا هستند؟ وچه کاربردی دارن؟
آخرین ویرایش به وسیله reza69 : جمعه 29 دی 1391 در 08:59 صبح
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
این قسمت تصحیح کنید
set @value = (SELECT [@value] FROM INSERTED)
set @value = (SELECT [value] FROM INSERTED)
@ نیاز نیست در SELECT .
بعد f5 بزنید تا تریگر ساخته شود.
بعد با هر دستکاری مقادیر این تریگر چک میشود روی تغیرات فقط
خیلی ممنون انجام شد.
یه سوال : رکوردی که پاک میشه چجوری با استفاده از تریگر deleted باید بازگردانی بشه؟
سلام.
متاسفانه یکی از اشتباهاتی که عموم افراد مرتکب میشن اینه که فرض می کنن جداول INSERTED و DELETED نمی تونن حاوی بیش از یک Record باشن. این فرض اشتباه هستش و منجر به نوشتن کدهای نادرست میشه. کدی که شما نوشتید نیز کد صحیحی نیست و ایرادهای فراوانی داره. از این گذشته، شما باید در Business Logic خودتون وقتی متوجه شدید که مقدار فیلد صفر شده، دیگه اون فیلد رو Update نکنید، بلکه یک ضرب Delete اش کنید تا بدین ترتیب نیازی به نوشتن Trigger نیز نداشته باشید.
موفق باشید.
سلام اقای موسوی
خب اینو مپسپوریم به تریگر .
اره از نظر شما باید در برنامه شرط بزاریم که true شد اونو رکورد حذف کنه.
در کل منظور شما همین بود دیگه
آخرین ویرایش به وسیله محمد سلیم آبادی : شنبه 30 دی 1391 در 18:50 عصر
وبلاگ من (Advanced SQL Querying)
چجوری بدون استفاده از تریگر این عملیات رو انجام بدیم؟ حالا اگه از تریگر استفاده کنیم چی میشه؟
سلام.
من نگفتم 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]');
خب دستور دلیت که نباید اشتباه بشه. کاربر باید بفهم خودش دیگه.
با دستورات بالا یک جدول لاگ دارید که کپی رکورد در جدول لاگ درج میکنه.