نمایش نتایج 1 تا 3 از 3

نام تاپیک: مشکل با تریگر آپدیت

  1. #1
    کاربر دائمی
    تاریخ عضویت
    آبان 1385
    محل زندگی
    مشهد
    سن
    38
    پست
    449

    Tick مشکل با تریگر آپدیت

    سلام دوستان من یک مشکل کوچیک با تریگرهای نوع Update دارم
    من 2 تا جدول دارم یکی جدول OrderDetail و دیگری جدول Product جدول OrderDetail مقادیر را به ازای فاکتور فروش در خودش ذخیره میکنه و هر بار که سفارش جدیدی به این جدول اضافه ، حذف یا ویرایش بشه موجودی کالا (Stock) تو جدول مربوط به کالا ها (Product) بروز رسانی میشه تا اینجاش مشکلی ندارم و همونطور که میخوام کار میکنه .
    مشکل من اینجاست که میخوام فیلد موجودی (Stock) از جدول کالاها(Product) بطور مستقیم قابل ویرایش نباشه و فقط توسط اون تریگرهایی که تو جدول سفارشات (OrderDetail) وجود داره قابل ویرایش باشه واسه این کار کد زیر رو نوشتم :

    -- ================================================
    -- Template generated from Template Explorer using:
    -- Create Trigger (New Menu).SQL
    --
    -- Use the Specify Values for Template Parameters
    -- command (Ctrl-Shift-M) to fill in the parameter
    -- values below.
    --
    -- See additional Create Trigger templates for more
    -- examples of different Trigger statements.
    --
    -- This block of comments will not be included in
    -- the definition of the function.
    -- ================================================
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author: Name
    -- Create date:
    -- Description:
    -- =============================================
    CREATE TRIGGER dbo.NotAllowModifyStock
    ON dbo.Product
    AFTER UPDATE
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    if update(stock) rollback
    -- Insert statements for trigger here

    END
    GO



    و هین شد مشکل من !!
    یعنی میخوام یه استثنا واسه کد بالا در نظر بگیرم که اگه این تغییر از طرف تریگرهای جدول OrderDetail بود ، کار ویرایش موجودی فعلی کالا انجام بشه .

    دیتابیسم رو ضمیمه کردم این هم اسکریپت ایجاد کردن دیتابیس :

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Product]') AND type in (N'U'))
    BEGIN
    CREATE TABLE [dbo].[Product](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [stock] [float] NOT NULL,
    CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED
    (
    [ID] ASC
    )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    END
    GO

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    IF NOT EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[NotAllowModifyStock]'))
    EXEC dbo.sp_executesql @statement = N'-- =============================================
    -- Author: Name
    -- Create date:
    -- Description:
    -- =============================================
    CREATE TRIGGER [dbo].[NotAllowModifyStock]
    ON [dbo].[Product]
    AFTER UPDATE
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    if update(stock) rollback
    -- Insert statements for trigger here

    END
    '
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OrderDetail]') AND type in (N'U'))
    BEGIN
    CREATE TABLE [dbo].[OrderDetail](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [OrderID] [int] NOT NULL,
    [Quantity] [float] NOT NULL,
    [ProductID] [int] NOT NULL,
    CONSTRAINT [PK_OrderDetail] PRIMARY KEY CLUSTERED
    (
    [ID] ASC
    )WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    END
    GO

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    IF NOT EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[OrderDecreaseFromProductsStocDelete]'))
    EXEC dbo.sp_executesql @statement = N'
    -- =============================================
    -- Author: Hosein
    -- Create date:
    -- Description:
    -- =============================================
    CREATE TRIGGER [dbo].[OrderDecreaseFromProductsStocDelete]
    ON [dbo].[OrderDetail]
    AFTER delete
    AS
    BEGIN

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for trigger here

    declare @temp float
    set @temp =(select stock from deleted inner join product on product.id=deleted.productid)
    set @temp = @temp + (select quantity from deleted)
    update product set stock=@temp where id=(Select Productid from deleted)

    END

    '
    GO

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    IF NOT EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[OrderDecreaseFromProductsStock]'))
    EXEC dbo.sp_executesql @statement = N'-- =============================================
    -- Author: Name
    -- Create date:
    -- Description:
    -- =============================================
    CREATE TRIGGER [dbo].[OrderDecreaseFromProductsStock]
    ON [dbo].[OrderDetail]
    AFTER insert
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.

    SET NOCOUNT ON;

    -- Insert statements for trigger here
    declare @tempStock float
    set @tempStock = (select stock from product inner join inserted on product.id=inserted.ProductID)
    set @tempStock = @tempStock - (select Quantity from inserted)
    update product set stock=@tempStock where id=(select productID from inserted)


    END


    '
    GO

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    IF NOT EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[OrderDecreaseFromProductsStockUpdate]'))
    EXEC dbo.sp_executesql @statement = N'-- =============================================
    -- Author: Hosein
    -- Create date:
    -- Description:
    -- =============================================
    CREATE TRIGGER [dbo].[OrderDecreaseFromProductsStockUpdate]
    ON [dbo].[OrderDetail]
    AFTER UPDATE
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.

    SET NOCOUNT ON;

    -- Insert statements for trigger here

    declare @temp float

    set @temp= (select quantity from deleted)
    set @temp= @temp - (select quantity from inserted)
    set @temp= (select stock from product where id=(select productid from deleted)) - @temp

    update product set stock=@temp where id=(select productid from deleted)

    END


    '
    GO
    IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_OrderDetail_Product]') AND parent_object_id = OBJECT_ID(N'[dbo].[OrderDetail]'))
    ALTER TABLE [dbo].[OrderDetail] WITH CHECK ADD CONSTRAINT [FK_OrderDetail_Product] FOREIGN KEY([ProductID])
    REFERENCES [dbo].[Product] ([ID])
    GO
    ALTER TABLE [dbo].[OrderDetail] CHECK CONSTRAINT [FK_OrderDetail_Product]

    فایل های ضمیمه فایل های ضمیمه

  2. #2
    کاربر دائمی آواتار Elham_gh
    تاریخ عضویت
    بهمن 1384
    محل زندگی
    Tehran
    سن
    48
    پست
    718
    از متغیر سیستمی TRANCOUNT @@ کمک بگیرید.اگر 1 باشد یعنی مستقیما در داخل خود جدول تغییرات اعمال شده

  3. #3
    کاربر دائمی
    تاریخ عضویت
    آبان 1385
    محل زندگی
    مشهد
    سن
    38
    پست
    449
    نقل قول نوشته شده توسط Elham_gh مشاهده تاپیک
    از متغیر سیستمی TRANCOUNT @@ کمک بگیرید.اگر 1 باشد یعنی مستقیما در داخل خود جدول تغییرات اعمال شده
    خیلی خیلی ممنون دوست عزیز

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •