手动检查SQL表中的值更改

时间:2019-05-17 07:09:43

标签: sql sql-server

该问题的一个示例: 我的SQL数据库中有3列。

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

有100行不同的ID,年龄和名称。但是,由于许多人更新数据库,因此年龄和名称不断变化。

但是,年龄和姓名存在一些界限:

  • 年龄必须是整数,并且必须大于0。
  • 名称必须是字母,而不是数字。

问题是一个脚本,用于检查值的更改是否在边界之内。例如,如果age = -1或Name = 1,则这些值超出范围。

现在,有一个脚本可以将*插入newtable中,其中age <0且isnumeric(age)= 0或isnumeric(name)= 0;

已编译的新表包含的数据行的值超出边界。

我想知道是否有更有效的方法在SQL中进行这种检查。另外,我正在使用microsoft sql server,所以我想知道使用其他语言(例如C#python来解决此问题是否更有效。

2 个答案:

答案 0 :(得分:2)

您可以应用检查约束。用表名替换“ myTable”。 “ AgeCheck”和“ NameCheck”是约束的名称。 AGE是AGE列的名称。

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

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

有关Create Check Constraints的更多信息

答案 1 :(得分:0)

如果要自动将无效数据插入到新表中,可以创建AFTER INSERT触发器。我已提供片段供您参考。您可以使用用于名称检查的其他逻辑来扩展它。

通常,不鼓励使用触发器,因为它们会使事务变长。如果要避免触发,则可以有一个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