2009-10-25 32 views
5

Tôi đang thực hiện thay đổi đối với cơ sở dữ liệu hiện có trong khi phát triển phần mềm mới. Ngoài ra còn có khá nhiều phần mềm kế thừa mà sử dụng cơ sở dữ liệu mà cần phải tiếp tục làm việc, tức là tôi muốn duy trì các bảng cơ sở dữ liệu hiện có, procs vvCÀI ĐẶT CẬP NHẬT Kích hoạt và Cập nhật Khóa Chính

Hiện nay tôi có bàn

 
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) 
) 

Tôi cần bao gồm một trường mới trong bảng này đề cập đến một Nhà máy (cơ sở sản xuất) và di chuyển tx_current_order_num sang một bảng khác vì nó không bắt buộc đối với tất cả các hàng. Vì vậy, tôi đã tạo ra bảng mới: -

 
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) 
) 

Bây giờ, tôi không muốn có cùng dữ liệu ở hai nơi vì vậy tôi quyết định thay đổi bảng dbo.t_station vào một cái nhìn và cung cấp thay vì kích hoạt để thực hiện DELETE, INSERT và UPDATE. Không có vấn đề tôi có [hầu hết] họ làm việc.

Câu hỏi của tôi liên quan đến trình kích hoạt INSTEAD OF UPDATE, cập nhật cột Primary Key (tx_station_id) và cập nhật cho nhiều hàng.

Bên trong khối trình kích hoạt, có cách nào để nối các bảng [psuedo] được chèn vào và đã xóa để tôi biết 'trước khi cập nhật khóa chính' và 'sau khi cập nhật khóa chính' không? Một cái gì đó như thế này ...

 
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 

Ở giai đoạn này, tôi đã đặt dấu kiểm vào khối kích hoạt để khôi phục cập nhật nếu cột khóa chính được cập nhật và có nhiều hàng trong chèn hoặc xóa , bàn.

+1

Tôi đã hy vọng ai đó có thể có câu trả lời hay hơn! Vấn đề này đã làm tôi thất vọng trong quá khứ. –

Trả lời

3

Câu trả lời ngắn gọn là không.

Bạn có thể đặt khóa thay thế trên Private.Station và hiển thị khóa đó thông qua chế độ xem và sử dụng để xác định trước và sau giá trị. Bạn sẽ không cần phải thay đổi khóa chính hoặc mối quan hệ khóa ngoài, nhưng bạn sẽ phải trưng ra một số cruft không thể cập nhật thông qua khung nhìn, để nó xuất hiện trong các bảng giả. ví dụ:

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

Lưu ý, điều này có thể phá vỡ ứng dụng cũ nếu sử dụng SELECT *. Tuy nhiên, các câu lệnh INSERT mà không có các danh sách cột chèn rõ ràng sẽ là ok.

ngắn đó, có thể có một số không có giấy tờ & trật tự nhất quán giữa chèn và xóa, sao cho ROW_NUMBER() OVER (ORDER BY NULLIF (StationId, StationId)) sẽ cho phép bạn tham gia vào hai, nhưng tôi muốn rất do dự khi đi tuyến đường. Rất, rất do dự.

Bạn đã cố ý không bật cập nhật xếp tầng? Chúng hữu ích khi các giá trị khóa chính có thể được cập nhật. ví dụ:

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 
) 

Ai đó có thể có mẹo tốt hơn. Đợi đã!

+0

Có, nghĩ về ý tưởng thay thế chính nhưng tôi muốn bảo toàn tên bảng và cột chính xác. Đối với các bản cập nhật tầng và xóa sẽ không làm việc cho mối quan tâm chính của tôi. StationId được tham chiếu trên toàn bộ cơ sở dữ liệu và tôi muốn đảm bảo rằng các bảng tham chiếu tiếp tục tham khảo chính xác, hợp lý, trạm. – Kepboy

+0

Tôi nên chỉ ra rằng tôi không hoàn toàn không hài lòng với giải pháp hàng duy nhất của tôi, chỉ nghĩ rằng tôi muốn hỏi vì tôi muốn biết những điều này. – Kepboy

+0

Các bản cập nhật cho t_station.tx_station_id có được phép trong lược đồ hiện tại không? Nếu không, hãy kiểm tra các bản cập nhật bằng COLUMNS_UPDATED(), khôi phục và phát sinh lỗi nếu bạn phát hiện bất kỳ thay đổi nào. –

Các vấn đề liên quan