创建触发器仅更新插入到表特定值

时间:2013-10-03 11:08:36

标签: sql-server

我需要创建触发器以防止插入和更新21岁以上和67岁以上的员工 代码的下一步是什么?

CREATE TRIGGER allowInsertUpdateemployee ON dbo.employee
    AFTER UPDATE, INSERT 

AS
BEGIN
DECLARE @v_ageLow INT = 21,
        @v_ageHigh  INT = 67,
        @v_dateLow date,
        @v_dateHigh date

SET @v_dateLow = DATEADD(YEAR, -1 * @v_ageLow, GETDATE())
SET @v_dateHigh = DATEADD(YEAR, -1 * @v_ageHigh, GETDATE())



END     

4 个答案:

答案 0 :(得分:2)

由于上限和下限是固定的,因此检查约束可能是比触发更合适的解决方案

ALTER TABLE employee ADD CONSTRAINT ck_employee_age CHECK 
(DateOfBirth BETWEEN DATEADD(YEAR,-67,GETDATE()) AND DATEADD(YEAR,-21,GETDATE()))

答案 1 :(得分:1)

  1. 使用“INSTEAD OF INSERT,UPDATE”触发器;
  2. 使用INSERTED表检查新的传入值,如果需要,则检查raiserror;
  3. 使用DELETED表检测更新是否正在处理(this可以 帮助);
  4. 然后手动插入或更新(如果需要)。

    INSERT INTO         dbo.employee     选择         *     从         插入我

答案 2 :(得分:0)

我希望这会做到 这不会获取准确的年龄,但是如果您的方法可以获得准确的日期,则可以使用您的代码。

您还可以使用以下代码来获取年龄:

SELECT DATEDIFF(Day,'2011-11-03' , GETDATE()) /365
  

SELECT DATEDIFF(Day,@ Age,GETDATE())   / 365

 CREATE TRIGGER allowInsertUpdateemployee ON dbo.employee
      INSTEAD OF Insert 

    AS
    BEGIN
    DECLARE @v_ageLow INT,
            @v_ageHigh  INT,
            @v_date date,
          --@v_dateHigh date

    SET @v_ageLow  = SELECT DATEDIFF(Year,@v_date  , GETDATE())
    SET @v_ageHigh = SELECT DATEDIFF(Year,@v_date  , GETDATE())
    BEGIN
            if(@v_ageLow <21  AND @v_ageHigh >67)
            BEGIN
                RAISERROR('Cannot Insert or Update where User is not in age limit);
                ROLLBACK;
            END

            ELSE

                 BEGIN 

             // else write your insert update query
                Insert into values ()
                PRINT 'Unable to Insert-- Instead Of Trigger.'
            END    

    END  

答案 3 :(得分:0)

您必须将OR放入where子句中。员工不能低于21岁且超过67岁。

Create TRIGGER tr_Too_young_or_too_old 
ON TableName
AFTER INSERT
AS
if exists ( select *, DATEDIFF(yy, birthdate, GETDATE()) as age 
            from TableName
where DATEDIFF(yy, birthdate, GETDATE()) < 21 or DATEDIFF(yy, birthdate, GETDATE()) > 67 )
begin
    rollback
    RAISERROR ('Cannot Insert or Update where User is not in age limit', 16, 1);
end