Welcome to Sign in | Help
in Search

Novice sql

Last post 05-19-2008, 5:34 PM by tebbaerty. 26 replies.
Page 1 of 2 (27 items)   1 2 Next >
Sort Posts: Previous Next
  •  05-13-2008, 3:52 PM 4877

    Novice sql

        Salut de curand am instalat sql si incerc sa il invat.
    am reusit sa fac un trigger

    CREATE TRIGGER trbu_City ON City
    FOR UPDATE
    AS
    IF UPDATE (CityName)
        INSERT INTO Phone values (11,'Fax',1888)

    dar cum fac un trigger sa sterg din tabela Phone in cazul in care un oras este sters ?

    unde valorile din values repezinta (foreing key la city , tip telefon , prefix)
    cum as putea sa fac un trigger pentru delete ?


    multumesc anticipat


  •  05-13-2008, 4:12 PM 4879 in reply to 4877

    Re: Novice sql

    pai, plecand de la ideea ca esti sigur ca vrei sa stergi telefoanele din orasul sters cel mai simplu ar fi sa faci o legatura intre cele doua tabele si sa o setezi sa stearga in cascada iar atunci ai scapat de aceasta grija (banuiesc ca lucrezi pe Sql Server 2005) -  asta se rezolva foarte usor din diagrama bazei de date (anunta-ma daca vrei mai multe detalii in directia asta).

    deci inainte sa incerci sa faci triggere care sa faca tot felul de operatii citeste mai intai despre ce poti realiza cu ajutorul relatiilor intre tabele pt ca in mod cert vor fi utile.
  •  05-13-2008, 4:14 PM 4880 in reply to 4877

    Re: Novice sql

    Se poate rezolva şi fără declanşatoare începând cu 2000:
    CREATE TABLE Localitate
    (
      CodLocalitate INT PRIMARY KEY,
      Denumire VARCHAR(25) NOT NULL
    )
    GO

    CREATE TABLE Telefon
    (
      NrTelefon VARCHAR(25) PRIMARY KEY NOT NULL,
      CodLocalitate INT NOT NULL
        REFERENCES Localitate(CodLocalitate)
        ON DELETE CASCADE --stergere in cascada
    )
    GO

    INSERT INTO Localitate VALUES (1,'Bucuresti')
    INSERT INTO Localitate VALUES (2,'Ploiesti')
    GO
    INSERT INTO Telefon VALUES ('3123219',1)
    INSERT INTO Telefon VALUES ('4569567',1)
    INSERT INTO Telefon VALUES ('8796674',1)
    INSERT INTO Telefon VALUES ('111111',2)
    INSERT INTO Telefon VALUES ('222222',2)
    GO

    --5 inregistrari
    SELECT * FROM Telefon
    GO

    DELETE FROM Localitate WHERE Denumire = 'Ploiesti'
    GO

    --3 inregistrari
    SELECT * FROM Telefon
    GO

  •  05-14-2008, 10:32 AM 4897 in reply to 4880

    Re: Novice sql

    aaaaaaaaaa stiam ca exista on delete cascade dar nu stiam cum se foloseste
    Multumesc mult.


    dar nu inteleg o chestie . tu ai specificat on delete cascade la codlocalitate din telefon lucru care inseamna ca acest camp se sterge implicit ,fiind FK , la stergerea elementului de care se leaga din tabela parent ?

    si altceva care nu are legatura cu asta
    create table Phone
    (
    PhoneId int identity (1,1),
    Number int,
    Tip varchar (8)constraint chk_Phone_tip check (tip in ('Telefon','Fax')),
    CompanyId int constraint FK_Phone_CompanyId foreign key (CompanyId) references Company on delete cascade
    )

    de ce la tine sunt facute mai usor FK decat la mn ?  mi se pare diferenta de cod mult prea mare intre noi 2 :)
  •  05-14-2008, 1:20 PM 4899 in reply to 4897

    Re: Novice sql

    CodLocalitate în tabela Localitate are rolul de cheie primară.
    CodLocalitate în tabela Telefon are rolul de cheie externă care face referinţă la cheia primară Localitate.CodLocalitate (vezi ... REFERENCES Localitate(CodLocalitate) ). Opţiunea CASCADE DELETE se aplică la cheia externă Telefon.CodLocalitate (care face referinţă la cheia primara Localitate.CodLocalitate). Semnificaţia opţiunii CASCADE DELETE este următoarea: atunci când se şterge o anumită valoare din cheia primară Localitate.CodLocalitate, SQL Server va şterge "automat" valorile corepunzătoare din cheia externă Telefon.CodLocalitate .
  •  05-14-2008, 1:28 PM 4900 in reply to 4897

    Re: Novice sql

    tebbaerty:
    ...
    de ce la tine sunt facute mai usor FK decat la mn ?  mi se pare diferenta de cod mult prea mare intre noi 2 :)

    Este vorba de o simplă diferenţă de sintaxă. Rezultatul este asemănător.

    Cheile externe sunt restricţii (en. CONSTRAINT). În cazul sintaxei utilizate de mine:
    CodLocalitate REFERENCES Localitate(CodLocalitate)
    SQL Server va atribui automat un nume  acestei restricţii, în timp ce în cazul tău, denumirea restricţiei (CONSTRAINT) va fi cea specificată de tine:
    constraint FK_Phone_CompanyId !
  •  05-14-2008, 4:32 PM 4909 in reply to 4900

    Multumesc

    Am inteles.

    Multumesc pentru sprijinul oferit.
    Ma voi intoarce cu mai multe intrebari avand in vedere ca sunt inca la inpceput :(.


    Sper sa nu provoc un deranj prea mare !!!
  •  05-14-2008, 8:04 PM 4915 in reply to 4909

    acum imi trebuie sa stiu cum se facea acel trigger.

    presupunand ca vreau sa sterg o companie dinntr-o tabela si vreau sa o adaug in alta tabela History banuiesc ca se face cu un trigger.
    daca exista si alte soltutii as fi incantat sa le ascult dar prioritatea mea este sa stiu cum se face acel trigger pentru stergere. si daca tot suntem aici :D poate primesc un exemplu de trigger pentru insert.

    multumesc anticipat. :)
  •  05-14-2008, 8:40 PM 4916 in reply to 4915

    Re: ?

    asta ar fi codul trigger-ului pt delete:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    USE [Eug_tests]
    GO
    /****** Object: Trigger [dbo].[DeleteCompany] Script Date: 05/14/2008 20:29:43 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:    <Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:  <Description,,>
    -- =============================================
    CREATE TRIGGER [dbo].[DeleteCompany]
    ON [dbo].[Companii] for Delete

    AS
    BEGIN
      -- SET NOCOUNT ON added to prevent extra result sets from
      -- interfering with SELECT statements.
      SET NOCOUNT ON;
    INSERT INTO Istorie_Op_Companii
    (id_companie, alte_date_companie, operatie)
    SELECT Id, alte_date, 'stergere' AS Expr1
    FROM Deleted
    -- Insert statements for trigger here

    END

    asta ar fi pt insert:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    USE [Eug_tests]
    GO
    /****** Object: Trigger [dbo].[InsertCompany] Script Date: 05/14/2008 20:34:52 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:    <Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:  <Description,,>
    -- =============================================
    CREATE TRIGGER [dbo].[InsertCompany]
    ON [dbo].[Companii] for Insert

    AS
    BEGIN
      -- SET NOCOUNT ON added to prevent extra result sets from
      -- interfering with SELECT statements.
      SET NOCOUNT ON;
    INSERT INTO Istorie_Op_Companii
    (id_companie, alte_date_companie, operatie)
    SELECT Id, alte_date, 'inserare' AS Expr1
    FROM Inserted
    -- Insert statements for trigger here

    END



    tabelele folosite:
    1. Companii

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    USE [Eug_tests]
    GO
    /****** Object: Table [dbo].[Companii] Script Date: 05/14/2008 20:30:54 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Companii](
      [Id] [int] IDENTITY(1,1) NOT NULL,
      [alte_date] [nvarchar](50) NULL,
    CONSTRAINT [PK_Companii] PRIMARY KEY CLUSTERED
    (
      [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]


    2. Istorie_Op_Companii

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    USE [Eug_tests]
    GO
    /****** Object: Table [dbo].[Istorie_Op_Companii] Script Date: 05/14/2008 20:31:29 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Istorie_Op_Companii](
      [Id_istoric] [int] IDENTITY(1,1) NOT NULL,
      [operatie] [nvarchar](50) NULL,
      [id_companie] [int] NULL,
      [alte_date_companie] [nvarchar](50) NULL
    ) ON [PRIMARY]

    sper ca e de folos :)
  •  05-14-2008, 9:26 PM 4917 in reply to 4916

    Re: ?

    Declanşator pentru ştergere în cascadă (echivalent cu ON DELETE CASCADE):
    CREATE TABLE Localitate
    (
    CodLocalitate INT PRIMARY KEY,
    Denumire VARCHAR(25) NOT NULL
    )
    GO

    CREATE TABLE Telefon
    (
    NrTelefon VARCHAR(25) PRIMARY KEY NOT NULL,
    CodLocalitate INT NOT NULL
    REFERENCES Localitate(CodLocalitate)
    --ON DELETE CASCADE --fara stergere in cascada
    )
    GO

    INSERT INTO Localitate VALUES (1,'Bucuresti')
    INSERT INTO Localitate VALUES (2,'Ploiesti')
    GO
    INSERT INTO Telefon VALUES ('3123219',1)
    INSERT INTO Telefon VALUES ('4569567',1)
    INSERT INTO Telefon VALUES ('8796674',1)
    INSERT INTO Telefon VALUES ('111111',2)
    INSERT INTO Telefon VALUES ('222222',2)
    GO

    CREATE TRIGGER StergereLocalitate
    ON Localitate
    INSTEAD OF DELETE
    AS
      DELETE Telefon
      FROM Telefon INNER JOIN DELETED ON Telefon.CodLocalitate = DELETED.CodLocalitate

      DELETE FROM Localitate
      FROM Localitate INNER JOIN DELETED ON Localitate.CodLocalitate = DELETED.CodLocalitate
    GO

    --5 inregistrari
    SELECT * FROM Telefon
    GO

    DELETE FROM Localitate WHERE Denumire = 'Ploiesti'
    GO

    --3 inregistrari
    SELECT * FROM Telefon
    GO

  •  05-15-2008, 10:16 AM 4926 in reply to 4916

    Re: ?

    CREATE TRIGGER [dbo].[DeleteCompany]
    ON [dbo].[Companii] for Delete

    AS
    BEGIN
      -- SET NOCOUNT ON added to prevent extra result sets from
      -- interfering with SELECT statements.
      SET NOCOUNT ON;
    INSERT INTO Istorie_Op_Companii
    (id_companie, alte_date_companie, operatie)
    SELECT Id, alte_date, 'stergere' AS Expr1
    FROM Deleted
    -- Insert statements for trigger here

    END



    care e faza cu cu

    SELECT
    Id, alte_date, 'stergere' AS Expr1
    FROM Deleted

    mai exact acel
    AS Expr1 ... si din cate inteleg tabela Deleted este o tabela temporara creata cand este apelat Delete nu ?

  •  05-15-2008, 10:25 AM 4927 in reply to 4917

    Re: ?

    B_gd_n[ ]Sahlean:
    Declanşator pentru ştergere în cascadă (echivalent cu ON DELETE CASCADE):
    CREATE TRIGGER StergereLocalitate
    ON Localitate
    INSTEAD OF DELETE
    AS
      DELETE Telefon
      FROM Telefon INNER JOIN DELETED ON Telefon.CodLocalitate = DELETED.CodLocalitate

      DELETE FROM Localitate
      FROM Localitate INNER JOIN DELETED ON Localitate.CodLocalitate = DELETED.CodLocalitate
    Go



    si aici de ce ai pus
    DELETE FROM Localitate
      FROM Localitate INNER JOIN DELETED
    adica de ce apare acel FROM localitate de 2 ori ... din cate stiu un join se facea astel

    select informatie1 , informatie2
    from Tabela1 ta inner join Tabela2 tab on  ta.informatie1=tab.informatie1


    si aici ca si mai sus sa inteleg ca tu ai suprascris DELETE cu INSTEAD OF  sa stearga si din tabela telefon atunci cand este apelat sa stearga din tabela localitate nu ?

    iar tabela DELETED este o copie a tabelei localitate dupa cum vad eu lucrurile nu ?
    am cautat de DELETED si INSERTED si am vazut tutoriale in care ziceau ca daca dau select * from deleted arata ceva dar la mine da eroare ca nu exista . Atunci am crezut ca nu se poate asa ceva in ms sql 2005 si ce am gasit nu era bun. dar vad ca si tu l-ai folosit si spre surprinderea mea merge :D

    multumesc pentru sprijin amadurora :).

     
  •  05-15-2008, 10:38 AM 4928 in reply to 4926

    Re: ?

    tebbaerty:


    care e faza cu cu

    SELECT
    Id, alte_date, 'stergere' AS Expr1
    FROM Deleted

    mai exact acel
    AS Expr1 ... si din cate inteleg tabela Deleted este o tabela temporara creata cand este apelat Delete nu ?



    in ceea ce priveste tabelele Deleted si Inserted nu stiu foarte multe despre ele (nu am studiat foarte amanuntit situatia ci doar cat aveam nevoie ca sa imi rezolv problemele) stiu doar ca atunci cand se sterg datele pot fi accesate temporar in acele tabele (iar la apelul trigerre-lor inca se gasesc acolo datele)
    in ceea ce priveste partea cu Expr1 e din cauza ca am facut query-ul in designer iar el pune automat acel alias


  •  05-15-2008, 11:25 AM 4930 in reply to 4928

    Re: ?

    dap am inteles :) multumesc mult. acum sa vad ce zice bogdan despre ce l-am intrebat :D

  •  05-15-2008, 11:31 AM 4933 in reply to 4930

    Re: ?

    cu multa placere, mi-a prins bine exercitiul Wink
Page 1 of 2 (27 items)   1 2 Next >
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems