برنامه نویسی

پرس و جو از گذشته: جداول زمانی در SQL Server و PostgreSQL

جداول موقتی و نمایش داده های سفر زمانی

پرس و جو از گذشته: جداول زمانی در SQL Server و PostgreSQL

“سفر زمان فقط علمی تخیلی نیست – در SQL ، این یک ویژگی است.”

در سیستم های داده مدرن ، تغییرات حسابرسی و ردیابی با گذشت زمان برای:

  • انطباق (به عنوان مثال ، GDPR ، HIPAA)
  • گزارش تاریخی
  • به آرامی ابعاد را تغییر می دهد (SCD نوع 2)
  • بازگشت و اشکال زدایی

میزهای زمانی شما را فعال کنید داده های خود را همانطور که در گذشته بود پرس و جو کنید، بدون ایجاد منطق ردیابی تاریخچه سفارشی.

این پست از نحوه استفاده از ویژگی های زمانی در:

  • SQL Server (جداول با وضوح سیستم)
  • postgresql (محرک + جداول حسابرسی)

مرحله 1: طرح زمانی خود را تعریف کنید

بیایید یک Employees جدول با ردیابی تاریخ تغییر کامل.

سرور SQL (بومی)

CREATE TABLE Employees (
  ID INT PRIMARY KEY,
  Name NVARCHAR(100),
  Title NVARCHAR(100),
  ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START,
  ValidTo DATETIME2 GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

✅ سرور SQL به طور خودکار یک جدول تاریخچهبشر

postgresql (دستی)

CREATE TABLE employees (
  id SERIAL PRIMARY KEY,
  name TEXT,
  title TEXT
);

CREATE TABLE employees_history (
  id INT,
  name TEXT,
  title TEXT,
  valid_from TIMESTAMP,
  valid_to TIMESTAMP
);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


مرحله 2: تغییر ورود به سیستم در postgresql

از یک ماشه برای ردیابی دستی تغییرات استفاده کنید:

CREATE OR REPLACE FUNCTION log_employee_update()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO employees_history
  SELECT OLD.*, now(), now();
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_emp_update
BEFORE UPDATE ON employees
FOR EACH ROW EXECUTE FUNCTION log_employee_update();
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

✅ محرک ها مسیرهای حسابرسی ایجاد می کنند که از رفتار زمانی تقلید می کنند.


مرحله 3: ایالت های گذشته را پرس و جو کنید

سرور SQL

-- Snapshot at a specific time
SELECT *
FROM Employees
FOR SYSTEM_TIME AS OF '2024-01-01T00:00:00';

-- Range of time
SELECT *
FROM Employees
FOR SYSTEM_TIME BETWEEN '2024-01-01' AND '2024-03-01';
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پس از

SELECT * FROM employees_history
WHERE valid_from <= '2024-01-01' AND valid_to > '2023-12-01';
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


از مورد استفاده کنید: حسابرسی نقش تغییرات را تغییر دهید

بیایید بگوییم که می خواهیم برای یک کارمند به نام حوا تغییر نقش داشته باشیم:

SELECT *
FROM employees_history
WHERE name = 'Eve'
ORDER BY valid_from;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

✅ دقیقاً چگونه او را ببینید title با گذشت زمان تغییر کرد


مبادله

نشان سرور SQL پس از
حمایت بومی ✅ بله ❌ نه (فقط دستی)
محرک دستی ❌ لازم نیست ✅ مورد نیاز است
تاریخچه قابل توصیف ✅ بله ✅ بله (دستی)
پرس و جو آسان ✅ برای System_Time ⚠ به منطق نیاز دارد

بهترین روشها

  • سازگار استفاده کنید ValidFrom / ValidTo ستون
  • منطق ماشه را در توابع برای قابلیت حفظ خودکار خودکار کنید
  • بطور دوره ای تاریخ قدیمی بایگانی
  • محافظت از تاریخ از دستکاری کاربر

افکار نهایی: یک جدول زمانی در SQL بسازید

جداول موقتی به پایگاه داده شما می دهند خاطره – به شما اجازه می دهد:

  • ببینید چه چیزی تغییر کرده است ، چه زمانی و توسط چه کسی
  • به عکسهای فوری شناخته شده خوب برگردید
  • تاریخچه را بدون میزهای تولید نفخ پیگیری کنید

“داده های شما سزاوار یک حافظه است. با جداول زمانی ، یکی از آنها را دارد.”

#sql #temporaltables #Auditing #history #datagovernance #sqlserver #postgresql

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا