【发布时间】:2021-11-08 23:16:09
【问题描述】:
我试图在视图中插入一些数据,但是,我收到的错误基本上告诉我,由于常量或派生字段,我不能这样做。但无论如何,我做了一些研究,发现我必须使用 INSTEAD OF 才能将数据插入到视图中。
所以我的问题是编写此触发器的正确方法是什么?这就是我所拥有的:
ALTER TRIGGER [dbo].[AddEmployeeTrigger] on [dbo].[VW_REX_EMPLOYEES]
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO [dbo].[VW_REX_EMPLOYEES]
([Company]
,[EmployeeID]
,[Emp_Status]
,[Emp_LastName1]
,[Emp_LastName2]
,[Emp_FirstNames]
,[Emp_FullName]
,[Puesto]
,[Emp_Email]
,[Emp_SegSoc]
,[Emp_BornDate]
,[Emp_Hire_Date]
,[Emp_Entry_Date]
,[Emp_Type]
,[Emp_Gender]
,[Lab_Type]
,[Emp_Department]
,[VS]
,[Sup_ID]
,[Sup_Name]
,[Mgr_ID]
,[Mgr_Name]
,[Cost_Center]
,[CC_Description]
,[Emp_Shift_ID]
,[Mon_Shift]
,[Tue_Shift]
,[Wed_Shift]
,[Thu_Shift]
,[Fri_Shift]
,[Sat_Shift]
,[Sun_Shift]
,[TU_TIP_1]
,[TU_TIP_2]
,[TU_TIP_3]
,[TU_TIP_4]
,[TU_TIP_5]
,[TU_TIP_6]
,[TU_TIP_7]
,[PERSONAL_EMAIL]
,[SANMINA_EMAIL])
SELECT
[Company]
,[EmployeeID]
,[Emp_Status]
,[Emp_LastName1]
,[Emp_LastName2]
,[Emp_FirstNames]
,[Emp_FullName]
,[Puesto]
,[Emp_Email]
,[Emp_SegSoc]
,[Emp_BornDate]
,[Emp_Hire_Date]
,[Emp_Entry_Date]
,[Emp_Type]
,[Emp_Gender]
,[Lab_Type]
,[Emp_Department]
,[VS]
,[Sup_ID]
,[Sup_Name]
,[Mgr_ID]
,[Mgr_Name]
,[Cost_Center]
,[CC_Description]
,[Emp_Shift_ID]
,[Mon_Shift]
,[Tue_Shift]
,[Wed_Shift]
,[Thu_Shift]
,[Fri_Shift]
,[Sat_Shift]
,[Sun_Shift]
,[TU_TIP_1]
,[TU_TIP_2]
,[TU_TIP_3]
,[TU_TIP_4]
,[TU_TIP_5]
,[TU_TIP_6]
,[TU_TIP_7]
,[PERSONAL_EMAIL]
,[SANMINA_EMAIL]
FROM INSERTED;
END;
另外一个问题是,添加这个触发器之后,可以使用简单的insert into来添加数据吗?
更新: 这是视图定义:
SELECT Company, EmployeeID, Emp_Status, Emp_LastName1, Emp_LastName2, Emp_FirstNames, Emp_FullName, Puesto, Emp_Email, Emp_SegSoc, Emp_BornDate, Emp_Hire_Date, Emp_Entry_Date, Emp_Type, Emp_Gender, Lab_Type, Emp_Department, VS, Sup_ID, Sup_Name, Mgr_ID, Mgr_Name, Cost_Center, CC_Description, Emp_Shift_ID, Mon_Shift, Tue_Shift, Wed_Shift, Thu_Shift, Fri_Shift, Sat_Shift, Sun_Shift, TU_TIP_1, TU_TIP_2, TU_TIP_3,TU_TIP_4, TU_TIP_5, TU_TIP_6, TU_TIP_7, PERSONAL_EMAIL, SANMINA_EMAIL
FROM (SELECT Company, EmployeeID, Emp_Status, Emp_LastName1, Emp_LastName2, Emp_FirstNames, dbo.InitCap(Emp_FullName) AS Emp_FullName, Puesto, Emp_Email, Emp_SegSoc, Emp_BornDate, Emp_Hire_Date,Emp_Entry_Date, Emp_Type, Emp_Gender, Lab_Type, Emp_Department, VS, Sup_ID, Sup_Name, Mgr_ID, Mgr_Name, Cost_Center, CC_Description, Emp_Shift_ID, Mon_Shift, Tue_Shift, Wed_Shift, Thu_Shift,Fri_Shift, Sat_Shift, Sun_Shift, TU_TIP_1, TU_TIP_2, TU_TIP_3, TU_TIP_4, TU_TIP_5, TU_TIP_6, TU_TIP_7, PERSONAL_EMAIL,
CASE WHEN SANMINA_EMAIL = 'xxxxxx.xxxx@sanmina.com' THEN 'xxxxxx.xxxx@sanmina.com' WHEN SANMINA_EMAIL IS NOT NULL AND SANMINA_EMAIL != '' AND SANMINA_EMAIL LIKE '%@sanmina.com%' THEN SANMINA_EMAIL WHEN Emp_Email IS NOT NULL AND Emp_Email != '' AND Emp_Email LIKE '%@sanmina.com%' THEN Emp_Email WHEN PERSONAL_EMAIL IS NOT NULL AND PERSONAL_EMAIL != '' AND PERSONAL_EMAIL LIKE '%@sanmina.com%' THEN PERSONAL_EMAIL ELSE NULL END AS SANMINA_EMAIL
FROM XXX1AMTRESSXX.TRESS_SANM.dbo.Rex_Employees AS Rex_Employees_1
WHERE (Emp_Status = 'S')
UNION ALL
SELECT Company, EmployeeID, Emp_Status, Emp_LastName1, Emp_LastName2, Emp_FirstNames, dbo.InitCap(Emp_FullName) AS Emp_FullName, Puesto, Emp_Email, Emp_SegSoc, Emp_BornDate, Emp_Hire_Date, Emp_Entry_Date, Emp_Type, Emp_Gender, Lab_Type, Emp_Department, VS, Sup_ID, Sup_Name, Mgr_ID, Mgr_Name, Cost_Center, CC_Description, Emp_Shift_ID, Mon_Shift, Tue_Shift, Wed_Shift, Thu_Shift, Fri_Shift, Sat_Shift, Sun_Shift, TU_TIP_1, TU_TIP_2, TU_TIP_3, TU_TIP_4, TU_TIP_5, TU_TIP_6, TU_TIP_7, PERSONAL_EMAIL, SANMINA_EMAIL
FROM SolutionsWebApp.dbo.Tbl_Non_TRESS_EMPLOYEES) AS derivedtbl_1
WHERE (EmployeeID <> 005000170)
【问题讨论】:
-
将视图定义添加到您的问题中。如果视图从单个表中选择并且您从列列表中省略了问题常量,这应该可以工作(尽管我建议将
SET NOCOUNT ON;添加到触发器中)。 -
通常,当您在视图上使用而不是触发器时,触发器会处理插入以将数据放入相应的表中,而不仅仅是重复
INSERT,老实说,这毫无意义。 -
@DanGuzman 我在帖子中添加了视图定义。
标签: sql-server view triggers insert