gpt4 book ai didi

sql-server - INSTEAD OF UPDATE 触发并更新主键

转载 作者:行者123 更新时间:2023-12-03 00:29:17 24 4
gpt4 key购买 nike

我正在开发新软件时对现有数据库进行更改。还有相当多使用数据库的遗留软件需要继续工作,即我想维护现有的数据库表、过程等。

目前我有 table

CREATE TABLE dbo.t_station (    tx_station_id        VARCHAR(4)    NOT NULL,    tx_description       NVARCHAR(max) NOT NULL,    tx_station_type      CHAR(1)       NOT NULL,    tx_current_order_num VARCHAR(20)   NOT NULL,    PRIMARY KEY (tx_station_id))

我需要在此表中包含一个引用工厂(生产设施)的新字段,并将 tx_current_order_num 移至另一个表,因为并非所有行都需要它。所以我创建了新表:-

CREATE TABLE Private.Plant (    PlantCode   INT           NOT NULL,    Description NVARCHAR(max) NOT NULL,    PRIMARY KEY (PlantCode))CREATE TABLE Private.Station (    StationId   VARCHAR(4)    NOT NULL,    Description NVARCHAR(max) NOT NULL,    StationType CHAR(1)       NOT NULL,    PlantCode   INT           NOT NULL,    PRIMARY KEY (StationId),    FOREIGN KEY (PlantCode) REFERENCES Private.Plant (PlantCode))CREATE TABLE Private.StationOrder (    StationId   VARCHAR(4)  NOT NULL,    OrderNumber VARCHAR(20) NOT NULL,    PRIMARY KEY (StationId))

现在,我不想在两个地方拥有相同的数据,因此我决定将 dbo.t_station 表更改为 View ,并提供而不是触发器来执行 DELETE、INSERT 和 UPDATE。没问题,我让它们[大多数]工作。

我的问题涉及 INSTEAD OF UPDATE 触发器,更新主键列 (tx_station_id) 并更新多行。

在触发器 block 内,是否有任何方法可以连接插入和删除的[psuedo]表,以便我知道“更新前主键”和“更新后主键”?像这样的事情...

UPDATE sta    SET sta.StationId = ins.tx_station_id    FROM Private.Station AS sta        INNER JOIN deleted AS del            INNER JOIN inserted AS ins                ON ROW_IDENTITY_OF(del) = ROW_IDENTITY_OF(ins)            ON del.tx_station_id = sta.StationId

在此阶段,我在触发器 block 中进行了一项检查,如果主键列已更新并且插入或删除的表中有多于一行,则回滚更新。

最佳答案

简短的回答是否定的。

可以在 Private.Station 上放置一个代理键,并通过 View 公开它,并使用它来识别之前和之后的值。您不需要更改主键或外键关系,但您必须通过 View 公开一些不可更新的错误,以便它显示在伪表中。例如:

alter table Private.Station add StationSk int identity(1,1) not null

请注意,如果旧应用程序使用 SELECT *,这可能会破坏旧应用程序。不过,没有显式插入列列表的 INSERT 语句应该没问题。

除此之外,INSERTED 和 DELETED 之间可能存在一些未记录且一致的顺序,例如 ROW_NUMBER() OVER (ORDER BY NULLIF(StationId,StationId)) 可以让您将两者连接起来,但我会非常犹豫要不要走这条路。非常非常犹豫。

您是否故意不启用级联更新?当主键值可以更新时它们非常有用。例如:

CREATE TABLE Private.Station (
StationId VARCHAR(4) NOT NULL,
Description NVARCHAR(max) NOT NULL,
StationType CHAR(1) NOT NULL,
PlantCode INT NOT NULL,
PRIMARY KEY (StationId),
FOREIGN KEY (PlantCode) REFERENCES Private.Plant (PlantCode)
ON UPDATE CASCADE
-- maybe this too:
-- ON DELETE CASCADE
)

有人可能有更好的技巧。等等看!

关于sql-server - INSTEAD OF UPDATE 触发并更新主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1622389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com