Проверка изменений значений в таблицах для SQL вручную - PullRequest
0 голосов
/ 17 мая 2019

Пример проблемы: в моей базе данных SQL есть 3 столбца.

+-------------+------------------+-------------------+
| id(integer) | age(varchar(20)) | name(varchar(20)) |
+-------------+------------------+-------------------+

Существует 100 строк с разными идентификаторами, возрастами и именами.Однако, поскольку многие люди обновляют базу данных, возраст и имя постоянно меняются.

Однако существуют некоторые границы для возраста и имени:

  • Возраст должен быть целым числом и быть больше 0.
  • Имя должно бытьбуквы, а не цифры.

Проблема в том, что скрипт проверяет, находится ли изменение значений в границах.Например, если age = -1 или Name = 1, эти значения выходят за границы.

В настоящее время существует скрипт, который вставляет * в newtable, где age <0 и isnumeric (age) =0 или цифра (имя) = 0;</p>

В скомпилированной новой таблице есть строки данных, значения которых выходят за границы.

Мне было интересно, есть ли более эффективный метод для такой проверки в SQL.Кроме того, я использую microsoft sql server, поэтому мне было интересно, будет ли эффективнее использовать другие языки, такие как C# или python, для решения этой проблемы.

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

Вы можете применить проверочное ограничение. Замените «myTable» на имя вашей таблицы. «AgeCheck» и «NameCheck» являются именами ограничений. И ВОЗРАСТ - это название вашей ВОЗРАСТНОЙ колонки.

 ALTER TABLE myTable 
    ADD CONSTRAINT AgeCheck CHECK(AGE > 0 ) 

    ALTER TABLE myTable 
    ADD CONSTRAINT NameCheck  CHECK ([Name] NOT LIKE '%[^A-Z]%')

Подробнее о Создание проверочных ограничений

0 голосов
/ 17 мая 2019

Если вы хотите автоматически вставить неверные данные в новую таблицу, вы можете создать AFTER INSERT Trigger. Я дал фрагмент для вашей справки. Вы можете расширить то же самое с дополнительной логикой для проверки имени.

Как правило, триггеры не рекомендуется, так как они делают транзакцию более длинной. Если вы хотите избежать триггера, у вас может быть задание sql agent для регулярного аудита.

CREATE TRIGGER AfterINSERTTrigger on [Employee]
FOR INSERT 
AS
BEGIN 

    DECLARE @Age TINYINT, @Id INT, Name VARCHAR(20); 

    SELECT @Id = ins.Id FROM INSERTED ins;
    SELECT @Age = ins.Age FROM INSERTED ins;
    SELECT @Name = ins.Name FROM INSERTED ins;

    IF (@Age = 0)
    BEGIN
    INSERT INTO [EmployeeAudit]( 
           [ID]
          ,[Name]
          ,[Age])
    VALUES (@ID,
        @Name,
        @Age);
    END

END
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...