Проверка SQL-ограничений - PullRequest
       9

Проверка SQL-ограничений

1 голос
/ 09 января 2012

У меня есть вопрос об ограничениях в SQL, а точнее в transact-sql. У меня есть база данных для поездок. Я создал процедуру добавления нового участника поездки. Я использую сервер ms-sql, поэтому при создании таблиц были добавлены ограничения внешнего ключа и первичного ключа. Теперь в моей процедуре добавления нового участника для поездки у меня есть

insert VoyageThemes(VoyageId,ThemeId) values (@voyageId,@themeId)

Теперь в таблице VoyageThemes и VoyageId, и ThemeId являются первичными ключами и внешними ключами, поэтому, когда я пытаюсь добавить новые значения, которые не соответствуют уже существующим значениям в ограничении базы данных, поднимает голову.

У меня вопрос, могу ли я как-нибудь проверить, «ограничено» ли «ограничение», что я не могу добавить значения в таблицу, чтобы я мог остановить процедуру или мне нужно вручную проверить свою базу данных, если существуют VoyageId и ThemeId.

Мне нужно знать, существуют ли эти значения из-за этой строки кода:

update Voyages
set Voyages.Price=Voyages.Price+@costOfTheme*@numOfParticipants

Я обновляю стоимость поездки, поэтому эта строка кода может быть только точной, если есть соответствующие VoyageId и ThemeId

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Я думаю, вы можете использовать попытку / поймать?:

...
BEGIN TRY  
    insert VoyageThemes(VoyageId,ThemeId) values (@voyageId,@themeId)     
    -- If we are here, then the insert succeeded, proceed with the update
    update Voyages
    set Voyages.Price=Voyages.Price+@costOfTheme*@numOfParticipants
    ...
END TRY 
BEGIN CATCH  
    -- insert failed, check error
    SELECT @error_number = ERROR_NUMBER(),
           @error_severity = ERROR_SEVERITY(),
           @error_state = ERROR_STATE()  
    IF @error_number = 547
    -- constraint violation   
        BEGIN     
            PRINT '...'   
        END  
    ELSE 
        -- propagate error 
        BEGIN
            RAISERROR(@error_number, @error_severity, @error_state) WITH LOG   
        END 
END CATCH
1 голос
/ 09 января 2012

Вместо INSERT используйте MERGE, чтобы создать строку, только если она еще не существует, например.

MERGE INTO VoyageThemes
   USING (
          VALUES (@voyageId, @themeId)
         ) AS S (VoyageId, ThemeId)
      ON VoyageThemes.VoyageId = S.VoyageId
         AND VoyageThemes.ThemeId = S.ThemeId
WHEN NOT MATCHED THEN
   INSERT (VoyageId, ThemeId)
      VALUES (VoyageId, ThemeId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...