我需要创建触发器以防止插入和更新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
答案 0 :(得分:2)
由于上限和下限是固定的,因此检查约束可能是比触发更合适的解决方案
ALTER TABLE employee ADD CONSTRAINT ck_employee_age CHECK
(DateOfBirth BETWEEN DATEADD(YEAR,-67,GETDATE()) AND DATEADD(YEAR,-21,GETDATE()))
答案 1 :(得分:1)
然后手动插入或更新(如果需要)。
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