3

特定の日数を経過したすべてのレコードを削除するには、SQL クエリ (SQL Server の sqlcmd.exe によって実行される .sql ファイル) を作成する必要があります。ただし、外部キー制約を回避する方法に困惑しています。問題を説明するために、同様の関係を持つ 3 つのテーブルを示します (これは疑似コードであることに注意してください)。

CREATE TABLE runlog(
    row_id int identity(1,1) NOT NULL,
    run_id nvarchar(25) NULL FOREIGN KEY REFERENCES status(run_id),
    master_id nvarchar(25) NULL FOREIGN KEY REFERENCES master(master_id),
)

CREATE TABLE status(
    run_id nvarchar(25) NOT NULL,
    master_id nvarchar(25) NULL FOREIGN KEY REFERENCES master(master_id),
    status_date datetime NULL,
)

CREATE TABLE master(
    master_id nvarchar(25) NOT NULL,
)

通常、削除はランログ、ステータス、マスターの順に行われますが、レコードの古さを判断するために必要なフィールドはステータス テーブルにあります。したがって、マスターテーブルの前にステータステーブルから論理的に削除することはできませんが、その逆もできません。runlog テーブルには、これを使用できます。

delete from runlog 
inner join status on status.run_id = runlog.run_id 
where status.status_date <= DATEADD(DAY, -30, GETDATE())

必要な master_id を選択するには、次を使用できます。

select master_id from status 
where status.status_date <= DATEADD(DAY, -30, GETDATE())

次に、このリストをキャッシュする方法があれば、それを使用してステータスからリストを削除し、次にマスターからリストを削除できますが、新しいストアドプロシージャがなければ、その方法がわかりません。助言がありますか?

4

1 に答える 1