Sql server 使用替代SQL触发器插入或更新视图

Sql server 使用替代SQL触发器插入或更新视图,sql-server,tsql,triggers,Sql Server,Tsql,Triggers,我想给视图写一个触发器,VW_BANKBRANCH: 如果插入的行包含表中存在的bankcode,则更新 bName包含插入数据的银行表列 否则,将行插入银行表以反映新信息 但是我的扳机坏了 我的桌子 CREATE TABLE bank( code VARCHAR(30) PRIMARY KEY, bName VARCHAR(50) ); CREATE TABLE branch( brNum INT PRIMARY KEY, brName VARCHAR(50), br

我想给视图写一个触发器,
VW_BANKBRANCH

  • 如果插入的行包含表中存在的
    bankcode
    ,则更新
    bName
    包含插入数据的银行表列
  • 否则,将行插入银行表以反映新信息
但是我的扳机坏了

我的桌子

CREATE TABLE bank(
  code VARCHAR(30) PRIMARY KEY,
  bName VARCHAR(50)
);

CREATE TABLE branch(
  brNum INT PRIMARY KEY,
  brName VARCHAR(50),
  braddress VARCHAR(50),
  bcode VARCHAR(30) REFERENCES bank(code)
);

CREATE VIEW VW_BANKBRANCH
AS
  SELECT code,bname,brnum,brName
  FROM bank ,branch
  WHERE code=bcode
我的触发器

CREATE TRIGGER tr_VW_BANKBRANCH_INSERT ON VW_BANKBRANCH
INSTEAD OF INSERT
AS
BEGIN
  DECLARE @insertedBankCode INT
    @insertedbname varchar
    @insertedbrnum int
    @insertedbrName varchar

SELECT @insertedBankCode = code
FROM INSERTED

IF(@insertedBankCode=code)
  SET code=@insertedBankCode
bname=@insertedbname
    brnum=@insertedbrnum
    brName=@insertedbrName
ELSE
    insert(code,bname,brnum,brName)
END

我在下面的视图中修改了instead of触发器-我假设您希望相应地向上插入银行和分行(尽管请注意,分行地址当前不在视图中)

也就是说,我会小心(ab)在
INSERT
上使用一个代替触发器来进行升级-这对读者来说可能不是完全直观的

另外,请记住,
插入的
伪表可能包含一组行,因此需要相应地调整为基于集合的方法

CREATE TRIGGER tr_VW_BANKBRANCH_INSERT ON VW_BANKBRANCH
INSTEAD OF INSERT
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE b
        SET bname = i.bname
        FROM bank b
            INNER JOIN inserted i
            ON i.code = b.code;

    UPDATE br
        SET
            br.brName = i.brName,
            br.braddress = NULL -- TODO add this to the view
        FROM branch br
            INNER JOIN inserted i
            ON br.bcode = i.code
            AND br.brNum = i.brNum;

    INSERT INTO bank(code, bname)
        SELECT code, bname
        FROM inserted i
        WHERE NOT EXISTS
            (SELECT 1 FROM bank b WHERE b.code = i.Code);

    INSERT INTO Branch(brNum, brName, braddress, bcode)
        SELECT brNum, brName, NULL, code
        FROM inserted i
        WHERE NOT EXISTS
            (SELECT 1 
                     FROM branch br 
                     WHERE br.bcode = i.Code AND br.brNum = i.brNum);

END;
GO
-我还调整了视图以使用连接,而不是旧式的WHERE连接


如果您使用的是SQLServer2008或更高版本,您也可以使用它,而不是单独的插入和更新。

到底是什么不起作用?根本跑不动?它不会产生预期的结果吗?它不会编译吗。。。?是的,它不会产生预期的结果很高兴我能帮忙!我希望你不介意-我改变了你问题的标题-这可能会在将来帮助其他人。