2010-11-16 15 views
9

Khách hàng của chúng tôi muốn đặt hàng trước ngày tạo hồ sơ. Đối với tôi, điều này có vẻ giống như một biến hệ thống, một số loại dữ liệu meta cho chính bản ghi đó.Microsoft SQL Server: Bất kỳ cách nào để cho biết khi nào một bản ghi được tạo ra?

Có cách nào để biết khi nào một bản ghi được tạo mà không thực sự tạo trường datetime với mặc định là GetDate() và hy vọng rằng không ai sửa đổi nó?

Trả lời

13

Không.

Bạn cần có cột cho mục này.

Hãy tưởng tượng mức độ siêu dữ liệu sẽ là bao nhiêu nếu bạn cần lưu giữ hồ sơ cho mỗi bản ghi để tạo! Bạn cũng muốn giữ siêu dữ liệu trên siêu dữ liệu để biết khi nào siêu dữ liệu được cập nhật? Việc sử dụng không gian có thể nhanh chóng leo thang.

Máy chủ SQL giữ một số thống kê nhưng điều cụ thể này sẽ cần phải đến từ một trường do người dùng xác định.

Là một lưu ý phụ, bạn có thể gây khó khăn hơn để giả mạo ngày trên trường đã tạo của mình nếu bạn sử dụng bảng tra cứu. Tạo một bảng "TableName_CreateDate" và sử dụng PK từ bảng thực tế của bạn và một giá trị ngày tháng. Ngày của bạn ở một vị trí riêng biệt và ít có khả năng được sửa đổi nhưng bạn vẫn có thể JOIN trên đó để nhận đơn đặt hàng của bạn. Bạn sẽ cần tạo trình kích hoạt để cập nhật điều này với các giá trị mới.

Nếu bạn chỉ muốn DATE và không cần giá trị ngày giờ, bạn có thể tiến thêm một bước và chỉ cần có bảng ngày và bảng tra cứu tham gia. Tức là .:

Table->Table.PK + Date.Pk -> DateTable

Điều này sẽ tiết kiệm rất nhiều không gian ổ đĩa nếu bạn có rất nhiều hàng (4 byte cho mỗi hàng tôi nghĩ).

1

Không, ngay cả trong bảng hệ thống đối với kiến ​​thức của tôi. Bạn có thể khai thác thông qua nhật ký giao dịch cũ, tôi chắc chắn, nhưng nguyên bản là không.

-4

Nếu chỉ muốn đặt hàng, bạn có thể xem xét sử dụng cột timestamp.

Không thể liên quan đến ngày thực tế nhưng bạn có thể sắp xếp ngày đó.

+1

Tuy nhiên, có thể có vấn đề nếu họ muốn so sánh giữa các bảng xuống đường với phương pháp này. – JNK

+0

không biggie miễn là OP biết tất cả các lợi ích và rủi ro. :) – JNK

+0

Aah!Tôi chỉ nghĩ rằng tôi đã mắc sai lầm trong câu trả lời này, nhưng bây giờ tôi nghĩ rằng tôi đã không. Đa đên giơ đi ngủ. Dù sao, mod nó xuống nếu nó không sử dụng;) – thomaspaulb

4

Trường creationdate sẽ được thêm vào. Bạn sửa chữa 'hy vọng rằng không ai sửa đổi nó' bằng cách thêm một trình kích hoạt trên bản cập nhật mà không cho phép trường đó được cập nhật, bao giờ.

0

Tôi đã từng gặp một tình huống mà thứ tự của các hàng của một bảng là bắt buộc nhưng không có cột dấu thời gian (CreateDateTime, UpdateDateTime, ..., v.v.) có sẵn. Vì vậy, chỉ dữ liệu tôi có là nhật ký giao dịch. Đọc nhật ký giao dịch trực tiếp không hữu ích vì không dễ phân tích cú pháp. tìm thấy một chương trình có tên là "ApexSQL Log" rất hữu ích, nó có tất cả các tùy chọn lọc và bạn có thể đọc tất cả dữ liệu nhật ký mà không cần đến các hoạt động của hardcore. và Thời gian kết thúc) theo hoạt động giao dịch.Nếu bạn đang tìm kiếm một hoạt động truy vấn, ví dụ như một chèn, được đóng gói trong một giao dịch, bạn không thể lấy lại thời gian chèn chính xác (ít nhất tôi không thể tìm thấy một cách), chỉ có thời gian giao dịch. Nếu hoạt động của bạn là tất cả nguyên tử, thì bạn có thể biết chữ có tất cả các hàng tạo thông tin ngày tháng.

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