none
Помогите составить триггер RRS feed

  • Вопрос

  • Есть 2 таблицы в SQL Server 2000.
    Название: Таблицы.jpg Просмотров: 9  Размер: 24.5 Кб
    Я выложил скриншот из ERwin 4.0.
    В таблицу Seat добавляется 2 внешних ключа: ID_Hall и ID_Sector из таблицы Sector.
    Нужно добавить триггер, чтобы при добавлении новой записи в таблицу Seat поле Number_Row могло принимать значения начиная от Initial_Row и до Finite_Row из таблицы Sector (включительно).
    • Перемещено Siddharth Chavan 2 октября 2010 г. 0:23 MSDN Forums Consolidation (От:SQL Server для разработчиков)
    11 января 2010 г. 15:04

Ответы

  • Вот вроде получилось что хотел:
    create trigger name_trigger on Seat after insert
    as if not exists (select top 1 1 from inserted i
    inner join sector s on s.ID_Sector=i.ID_Sector and i.Number_Row between s.Initial_Row and s.Finite_Row
    )
    rollback;
    go
    Number_Row (Seat)-это номер ряда. Да здесь не учитывается количество мест в ряду, но так и было нужно.
    • Помечено в качестве ответа I.Vorontsov 13 января 2010 г. 6:38
    12 января 2010 г. 22:37

Все ответы

  • скриншот  не виден !
    11 января 2010 г. 16:04
  • CREATE TABLE Seat (
           ID_Seat              int NOT NULL,
           ID_Sector            int NOT NULL,
           ID_Hall              int NOT NULL,
           Number_Row           int NULL,
           Number_Seat          int NULL
    )
    go
    
    ALTER TABLE Seat
           ADD PRIMARY KEY NONCLUSTERED (ID_Seat, ID_Sector, ID_Hall)
    go
    
    ALTER TABLE Seat
           ADD FOREIGN KEY (ID_Hall, ID_Sector)
                                 REFERENCES Sector
    
    
    CREATE TABLE Sector (
           ID_Hall              int NOT NULL,
           ID_Sector            int NOT NULL,
           Name                 char(30) NULL,
           Description          char(40) NULL,
           Initial_Row          int NULL,
           Finite_Row           int NULL
    )

    11 января 2010 г. 16:23
  • Теперь въехать не могу в предложение ".... при добавлении новой записи в таблицу Seat поле Number_Row могло принимать значения начиная от Initial_Row и до Finite_Row из таблицы Sector (включительно)." Можно пример?

    11 января 2010 г. 18:13
  • Например, в таблицах имеются следующие записи:
    TABLE Sector
    ID_Hall  ID_Sector  Name        Description   Initial_Row    Finite_Row
        1             1        Партер             *                 1                  5

    TABLE Seat
    ID_Hall     ID_Sector   ID_Seat  Number_Row     Number_Seat
        1               1              1                1                        1           это допустимая запись
        1               1              2                5                        12         это тоже (т.к. Initial_Row (from Sector) <= Number_Row (from Seat)   <= Finite_Row (from Sector))
        1               1              3                6                         2          а эта не допустимая т.к. Number_Row (from Seat) > Finite_Row

    Если на словах то, таблица Sector - это сектора в зале театра, а таблица Seat - места в зале. При добавлении нового места выбирается сектор зала к которому это место относится (например, партер). Потом указывается номер ряда для этого места. Ряд не должен выходить за рамки уже выбранного сектора.
    11 января 2010 г. 18:58
  • Ok, я кажется почти понял - поле Number_Row (таблицы Seat)  я так понимаю должно генирится последовательно от  Initial_Row до Finite_Row таблицы (таблицы Sector)?

    И еще Number_Row (таблицы Seat)   -  это номер ряда?

    Кстати не совсем понятно как определять номер (Number_Row таблицы Seat)  ряда для следующей записи... т.е. у тебя в условии указан только диапазон от  Initial_Row до Finite_Row, а сколько может быть мест в ряде для сектора не известно....

    И еще укажи какой SQL сервер ты используешь.... если 2005-2008 то эта задача легко решается при помощи CLR(C#/.net), но в принципе можно сделать и на T-SQL. Думаю смогу привести пример, когда ответишь на последние вопросы…

    12 января 2010 г. 15:12
  • Вот вроде получилось что хотел:
    create trigger name_trigger on Seat after insert
    as if not exists (select top 1 1 from inserted i
    inner join sector s on s.ID_Sector=i.ID_Sector and i.Number_Row between s.Initial_Row and s.Finite_Row
    )
    rollback;
    go
    Number_Row (Seat)-это номер ряда. Да здесь не учитывается количество мест в ряду, но так и было нужно.
    • Помечено в качестве ответа I.Vorontsov 13 января 2010 г. 6:38
    12 января 2010 г. 22:37