Проверка некоторых столбцов для указанных значений c перед вставкой / обновлением с использованием триггера - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть база данных FOO с несколькими столбцами, среди которых у меня есть один столбец "Url". Мне нужно написать триггер перед вставкой / обновлением, который проверит столбцы Url, соответствует ли более новое значение каким-либо существующим значениям, то есть «привет», за исключением некоторого предопределенного значения. Это означает, что, если "привет" вставлен или обновлен несколько раз, никакой ошибки не произойдет, иначе он проверит на двойственность. И если он находит какое-либо прерывание обновления вставки. Это также вернет некоторый код, так что мой скрипт, вызывающий вставку / обновление, будет знать, что произошла ошибка. Я знаю, что могут быть другие обходные пути, но мне нужно, чтобы это было так. Я довольно новичок в SQL.

Foo {
    Url
}

Вот алгоритм

Before update insert
if new value of Url is not "hello1" o "hello 2" 
    check if new value of Url already exists in Foo.Url if so abort otherwise allow update/insert
     return something if aborted/success

Ответы [ 4 ]

1 голос
/ 18 февраля 2020

попробуйте что-то вроде этого .. вам нужно будет проиндексировать вашу таблицу ..

    IF EXISTS(SELECT URL FROM  Foo.Url)
      BEGIN 
       SELECT 'URL Exists Already'
      END
   ELSE 
     BEGIN 

      INSERT/UPDATE

     END 
0 голосов
/ 18 февраля 2020

Если вы используете SQL Server 2008 или более новую версию, вы также можете использовать MERGE, синтаксис выглядит следующим образом:

MERGE [TableName] AS TARGET 
USING ( SELECT @UrlName ) AS SOURCE (UrlName) ON SOURCE.UrlName = TARGET.UrlName
WHEN MATCHED THEN
UPDATE SET ...
WHEN NOT MATCHED THEN INSERT ()
VALUES ();
0 голосов
/ 18 февраля 2020

Полагаю, вы ищете ограничение UNIQUE и ограничение CHECK как

CREATE TABLE Foo(
  Url VARCHAR(250) NOT NULL,
  CONSTRAINT UQ_Url UNIQUE(Url),
  CONSTRAINT CHK_Url CHECK (Url NOT IN ('hello1', 'hello2'))
);

Посмотрите, как это работает онлайн .

0 голосов
/ 18 февраля 2020

Уникальное ограничение не будет делать то, что вы хотите, но вы можете создать вместо триггера с контентом что-то вроде:

Create TRIGGER [dbo].[Trig_Insert_XXX]
ON [dbo].[XXX]
INSTEAD OF INSERT
AS
BEGIN
  SET NOCOUNT ON;
  INSERT INTO xxx ([url], field1, field2, fieldN)
  SELECT [url], field1, field2, fieldN
  FROM inserted i
  WHERE i.url = 'hello' OR NOT EXISTS (SELECT * FROM xxx t2 WHERE t2.url = i.url);
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...