SQL 服务器聚集索引"Partitioning" .主键问题



我正在尝试实现"穷人的分区"策略,即将多个表与聚簇索引与视图相结合。以下是我如何实现这一目标的示例:

CREATE TABLE customer_data_Q1_2014
(
    customer_index integer not null,
    customer_id int not null,
    customer_name varchar(128),
    transaction_date datetime2,
    CONSTRAINT PK_data_Q1_2014 PRIMARY KEY CLUSTERED (customer_index, customer_id)
) ON [FileGroup_1];

CREATE TABLE customer_data_Q2_2014
(
    -- same as above
)
CREATE TABLE customer_data_Q3_2014
(
    --same as above
)
--and so on...
ALTER TABLE DBO.customer_data_Q1_2014
ADD CONSTRAINT CK_customer_data_Q1_2014 CHECK (transaction_date >= '2014-01-01 00:00:00.000000' AND transaction_date < '2014-04-01 00:00:00.000000');
-- and so on...

USE PROD_DB
GO
CREATE VIEW customer_data_view 
WITH SCHEMABINDING
AS
SELECT customer_index, customer_id, customer_name, transaction_date 
FROM DBO.customer_data_Q1_2014
UNION ALL
SELECT customer_index, customer_id, customer_name, transaction_date 
FROM DBO.customer_data_Q1_2014
UNION ALL
-- AND SO ON...

现在这一切都很好,直到我尝试在我的视图中插入任何东西。我收到的消息是"分区视图不可更新">

据我所知,这与没有将日期作为主键的一部分有关。这样做的问题是,对我来说,将日期作为主键的一部分是没有意义的,实际上是不正确的。

例如:

假设我正在尝试插入重复的customer_index并customer_id

insert into customer_data (customer_index, customer_id, transaction_date) 
values (1,2,'2018-01-01 00:00:00.000000')
insert into customer_data (customer_index, customer_id, transaction_date) 
values (1,2,'2017-05-12 00:00:00.000000')

如果日期是我的群集主键的一部分,这将被允许,我将留下一个重复的customer_id,customer_index组合。

如何在没有将日期作为群集主键的一部分的情况下实现我的穷人分区?

我建议创建一个INSTEAD OF触发器:https://msdn.microsoft.com/en-us/library/def01zh2.aspx

这样,您可以手动实现更新逻辑。当尝试对视图执行 INSERT 时,触发器可以触发并实现您自己的自定义逻辑,以便根据记录的日期将记录添加到哪个基础表。

最新更新