【问题标题】:CREATE TRIGGER TO INSERT, UPDATE AND DELETE USING VIEW - SQL SERVER使用视图创建触发器以插入、更新和删除 - SQL SERVER
【发布时间】:2017-12-15 14:14:06
【问题描述】:

我是 SQL SERVER 的新手,不太了解触发器和程序。我有这样的看法:

 CREATE VIEW vwHorasTrabFunc AS
  SELECT DISTINCT
    FUNC.nome AS NomeFunc,
    sobrenome AS SobrenomeFunc,
    Salario AS salarioFunc,
    FUNC_PROJETO.cpf AS cpfFuncionario,
    FUNC_PROJETO.pno AS projetoFuncionario,
    FUNC_PROJETO.hours AS hrsTrabalhadasFuncionario
FROM funcionario AS FUNC INNER JOIN
func_proj AS FUNC_PROJETO ON FUNC.cpf = FUNC_PROJETO.cpf

我想在“经理”在表中插入新员工后更新员工工资。我怎样才能做到这一点?我需要一个程序来做到这一点吗?我需要使用触发器插入、更新和删除,我真的不知道如何启动它。我搜索了很多网站寻求帮助,但我做不到。我真的需要你的帮助。谢谢。

update1:​​我使用 postgres 进行了触发器,但我不知道如何将其“迁移”到 sql server。在 postgres 中做起来更“容易”,因为我的教授教我们如何在 postgres 中使用它。有人可以帮助我如何迁移,例如:

CREATE OR REPLACE FUNCTION insertDep()
    RETURNS TRIGGER AS $insertDep$
BEGIN
    IF EXISTS (select * from funcionario where cpf = NEW.func_cpf AND nome = NEW.func_nome) then
        insert into dependente values(NEW.func_cpf, NEW.dep_nome, NEW.dep_gen, NEW.dep_data_nasc, NEW.relacionamento);
    ELSE
        Raise Exception 'O funcionario não está cadastrado no banco.';
    END IF;
    RETURN NULL;
END;

还有这个:

   CREATE OR REPLACE FUNCTION insert_hpproj()
  RETURNS trigger AS
$BODY$
BEGIN
         -- Raise Exception '%',CPFNS;
    IF NOT EXISTS (select * from funcionario where cpf = NEW.func_cpf AND nome = NEW.func_nome) 
        OR NOT EXISTS (select * from projeto where pnumero = NEW.proj_numero AND pnome = NEW.proj_nome)
          then Raise Exception 'O funcionário apontando ou o projeto não existe no banco.';
        ELSE
            insert into func_proj values(NEW.func_cpf, NEW.proj_numero, NEW.horas);
        END IF;
      RETURN NULL;
END
$BODY$

我尝试了本应“转换”它的在线网站,但效果不佳。你们能帮帮我吗?关于我该怎么做的任何想法?

【问题讨论】:

  • 您能说得更具体一点吗?你要修改谁的工资?如果经理要插入新员工,为什么他们不提供工资作为该信息的一部分?
  • 对不起,我没有说出所有的信息。 “经理”是我将创建的角色,我将授予他在不是视图的表 funcionario 中插入更新和删除的权限。例如,当他在 funcionario 表中插入一名员工时,视图 vwHorasTrabFunc 必须使用此新信息进行更新。我在想这样的事情:更新视图后,创建任何触发器来更新工作超过 40 小时的员工的工资。我正在考虑这样做,但我不知道该怎么做。
  • 为什么在插入新员工时更新工作时间超过40小时的员工的工资?那根本没有任何意义。你会把它更新成什么?在有人可以提供帮助之前,您需要提供更多信息。这是一个很好的起点。 spaghettidba.com/2015/04/24/…
  • @SeanLange 感谢您的帮助。我一到家就用你的小费重新提出我的问题。在插入员工后更新薪水真的没有任何意义。我将跳过插入员工的这一部分,并专注于触发增加工作超过 40 小时的员工工资。我认为这更有意义。
  • 将对话移回问题(而不是我的答案)。为什么需要触发器来进行插入?我认为我们在这里真正需要的是一些示例数据和 DDL。提供经理可能会运行的INSERT 语句,然后提供您希望表中数据在INSERT 之后的样子的预期输出。我现在真的很难想象你在追求什么。

标签: sql-server stored-procedures triggers


【解决方案1】:

作为答案发布,因为评论太深入了。

我认为您误解了 VIEW 是什么。当视图引用的对象添加了值时,您不会“更新”视图。引用Views:

视图是一个虚拟表,其内容由查询定义。像 一个表,一个视图由一组命名的列和数据行组成。 除非被索引,否则视图不会作为一组存储的数据值存在 在数据库中。数据的行和列来自表 在定义视图的查询中引用并动态生成 当视图被引用时。

当您在 bjet 中 UPDATEINSERT 等时,该视图也会反映这一点。举个简单的例子:

USE Sandbox;
GO

CREATE TABLE SampleTable (ID int);
GO
CREATE VIEW SampleView AS
    SELECT ID, ID + 2 as ModdedID
    FROM SampleTable;
GO

INSERT INTO SampleTable VALUES (1),(2);

--This'll return the rows I just inserted.
SELECT *
FROM SampleView;
GO

DELETE FROM SampleTable
WHERE ID = 1;

--This'll return just ID 2 now..
SELECT *
FROM SampleView;
Go

--Clean up
DROP VIEW SampleView;
DROP TABLE SampleTable;
GO

希望对您有所帮助。

如果我错过了您评论的目的,请告诉我。

【讨论】:

  • 它帮助我更好地理解了视图的含义。我知道我必须在不是视图的表中进行插入、更新等操作。主要的疑问是,我必须使用触发器来执行此插入、更新和删除操作,但我不知道该怎么做。
  • 我只是在这里更新我的疑问。如果可以,请你帮助我。我使用 postgres 进行了触发器,但我不知道如何将它们“转换”为 sql server。
猜你喜欢
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2019-09-12
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
相关资源
最近更新 更多