• 28-12-2022, 19:25:53
    #1
    Merhaba spoiler içerisindeki gibi bir database var.

    CREATE DATABASE OnlineFilmSatis

    GO

    USE OnlineFilmSatis

    GO
    CREATE TABLE kategori (
    kategori_id int IDENTITY(1,1) PRIMARY KEY ,
    kategori_adi varchar(255) NOT NULL
    )
    CREATE TABLE dil (
    dil_id int IDENTITY(1,1) PRIMARY KEY ,
    dil nvarchar(255) NOT NULL
    )
    CREATE TABLE film (
    film_id int IDENTITY(1,1) PRIMARY KEY ,
    film_adi nvarchar(255) NOT NULL,
    yapim_yili datetime,
    dil_id int,
    sure int,
    rating int,
    film_fiyat int,
    film_stok int
    )
    CREATE TABLE film_kategori (
    film_id int IDENTITY(1,1) PRIMARY KEY ,
    kategori_id int NOT NULL
    )


    CREATE TABLE film_oyuncu (
    oyuncu_id int IDENTITY(1,1) PRIMARY KEY ,
    film_id int NOT NULL
    )
    CREATE TABLE oyuncu (
    oyuncu_id int IDENTITY(1,1) PRIMARY KEY ,
    oyuncu_adi nvarchar(255) NOT NULL,
    oyuncu_soyadi nvarchar(255) NOT NULL
    )
    CREATE TABLE siparis (
    siparis_id int IDENTITY(1,1) PRIMARY KEY ,
    siparis_tarihi datetime NOT NULL,
    musteri_id int,
    film_id int,
    )
    CREATE TABLE musteri (
    musteri_id int IDENTITY(1,1) PRIMARY KEY ,
    musteri_adi nvarchar(255) NOT NULL,
    musteri_soyadi nvarchar(255) NOT NULL,
    musteri_email nvarchar(255) NOT NULL,
    musteri_kayit_tarihi datetime NOT NULL,
    musteri_adres nvarchar(255) NOT NULL
    )
    CREATE TABLE odeme (
    odeme_id int IDENTITY(1,1) PRIMARY KEY ,
    musteri_id int NOT NULL,
    siparis_id int not null,
    tutar decimal not null
    )



    --Keyler

    ALTER TABLE odeme
    ADD CONSTRAINT FK_odeme_musteri
    FOREIGN KEY (musteri_id) REFERENCES musteri(musteri_id);

    ALTER TABLE odeme
    ADD CONSTRAINT FK_odeme_siparis
    FOREIGN KEY (siparis_id) REFERENCES siparis(siparis_id);

    ALTER TABLE siparis
    ADD CONSTRAINT FK_siparis_musteri
    FOREIGN KEY (musteri_id) REFERENCES musteri(musteri_id);

    ALTER TABLE siparis
    ADD CONSTRAINT FK_siparis_film
    FOREIGN KEY (film_id) REFERENCES film(film_id);

    ALTER TABLE film_oyuncu
    ADD CONSTRAINT FK_film_oyuncu_film
    FOREIGN KEY (film_id) REFERENCES film(film_id);

    ALTER TABLE film
    ADD CONSTRAINT FK_film_dil
    FOREIGN KEY (dil_id) REFERENCES dil(dil_id);

    ALTER TABLE film_kategori
    ADD CONSTRAINT FK_film_kategori_kategori
    FOREIGN KEY (kategori_id) REFERENCES kategori(kategori_id);


    Aşağıdaki şekilde de stored procedure var.



    IF OBJECT_ID('dbo.sp_FilmSiparis') IS NOT NULL
    BEGIN
    DROP PROCEDURE sp_FilmSiparis
    END
    GO
    CREATE PROCEDURE dbo.sp_FilmSiparis
    @film_id INT,
    @musteri_id INT,
    @adet INT
    AS
    BEGIN
    SET NOCOUNT ON;

    DECLARE @film_fiyat INT;
    DECLARE @film_stok INT;
    DECLARE @siparis_id INT;
    DECLARE @tutar DECIMAL;

    IF @adet <= 0
    BEGIN
    RAISERROR('Adet 0 veya daha küçük olamaz', 16, 1);
    RETURN;
    END

    BEGIN TRY
    BEGIN TRANSACTION

    SELECT @film_fiyat = film_fiyat, @film_stok = film_stok
    FROM film
    WHERE film_id = @film_id;


    UPDATE film
    SET film_stok = film_stok - @adet
    WHERE film_id = @film_id;

    INSERT INTO siparis (siparis_tarihi, musteri_id)
    VALUES (GETDATE(), @musteri_id);

    SELECT @siparis_id = SCOPE_IDENTITY();

    SET @tutar = @film_fiyat * @adet;

    COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
    IF @@TRANCOUNT > 0
    BEGIN
    ROLLBACK TRANSACTION;
    END

    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT @ErrorMessage = ERROR_MESSAGE(),
    @ErrorSeverity = ERROR_SEVERITY(),
    @ErrorState = ERROR_STATE();
    RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);
    END CATCH
    END



    EXEC dbo.sp_FilmSiparis @film_id=1,
    @musteri_id=1,
    @adet=5


    Aşağıdaki şekilde de trigger yazdım. Sipariş tablosuna insertten sonra çalışsın diye fakat sp yi çalıştırdığım zaman film_id si veri tabanında olsa bile film bulunamadı diyor. Yardımcı olacaklara şimdiden teşekkür ederim.

    IF OBJECT_ID('dbo.tr_siparis_ekleme') IS NOT NULL
    BEGIN
    DROP TRIGGER tr_siparis_ekleme
    END
    GO
    CREATE TRIGGER tr_siparis_ekleme ON [dbo].[siparis]
    AFTER INSERT
    AS
    BEGIN
    SET NOCOUNT ON;

    DECLARE @film_id int, @musteri_id int;
    SELECT @film_id = film_id, @musteri_id = musteri_id FROM inserted;

    IF NOT EXISTS (SELECT * FROM film WHERE film_id = @film_id)
    BEGIN
    ROLLBACK TRANSACTION;
    RAISERROR ('Film bulunamadı', 16, 1);
    RETURN;
    END

    IF NOT EXISTS (SELECT * FROM musteri WHERE musteri_id = @musteri_id)
    BEGIN
    ROLLBACK TRANSACTION;
    RAISERROR ('Müşteri bulunamadı', 16, 1);
    RETURN;
    END

    IF (SELECT film_stok FROM film WHERE film_id = @film_id) <= 0
    BEGIN
    ROLLBACK TRANSACTION;
    RAISERROR ('Stokta film kalmadı', 16, 1);
    RETURN;
    END

    INSERT INTO odeme (musteri_id, siparis_id, tutar)
    SELECT musteri_id, siparis_id, film_fiyat
    FROM inserted i
    JOIN film f ON i.film_id = f.film_id;
    END
  • 28-12-2022, 19:37:07
    #2
    INSERT INTO siparis (siparis_tarihi, musteri_id)
    VALUES (GETDATE(), @musteri_id);

    Sp de film_id insert etmiyorsunuz ki
  • 28-12-2022, 19:48:55
    #3
    VBuMaSTeR adlı üyeden alıntı: mesajı görüntüle
    INSERT INTO siparis (siparis_tarihi, musteri_id)
    VALUES (GETDATE(), @musteri_id);

    Sp de film_id insert etmiyorsunuz ki

    Evet hocam siz söyleyince tekrar baktım öyleymiş Teşekkür ederim hocam.