2009-08-10 24 views
34

Tôi đang cố gắng để đi qua DB phát triển của chúng tôi ngay bây giờ và làm sạch một số thử nghiệm procs/bảng. Có thể xác định những gì người dùng tạo ra các đối tượng trong một cơ sở dữ liệu SQL Server 2005? Nếu vậy, làm thế nào tôi sẽ đi về việc tìm kiếm thông tin đó?Xác định những gì người dùng tạo ra đối tượng trong SQL Server

Chỉnh sửa: Chỉ muốn làm rõ rằng các đối tượng được đề cập đã tồn tại. Thiết lập kiểm toán và kích hoạt có thể sẽ không làm tôi tốt. Tôi đoán tôi hầu như đang tìm cách sử dụng các bảng/khung nhìn hệ thống để nhận thông tin.

Trả lời

28

Câu trả lời là "không, có thể bạn không thể".

Trong khi có nội dung trong đó có thể nói ai đã tạo một đối tượng nhất định, có rất nhiều "ifs" phía sau chúng. Đánh giá nhanh (và không nhất thiết phải hoàn tất):

sys.objects (và do đó sys.tables, sys.procedures, sys.views, v.v.) có cột principal_id. Giá trị này là khóa ngoài có liên quan đến danh sách người dùng cơ sở dữ liệu, do đó có thể được nối với danh sách các thông tin đăng nhập SQL (ví dụ). (Tất cả thông tin này có thể được tìm thấy trong các chế độ xem hệ thống khác.)

Nhưng.

Kiểm tra nhanh thiết lập của chúng tôi tại đây và đánh giá cursive BOL cho biết giá trị này chỉ được đặt (tức là không null) nếu nó "khác với chủ sở hữu giản đồ". Trong hệ thống phát triển của chúng tôi, và chúng tôi đã có dbo + hai lược đồ khác, mọi thứ xuất hiện dưới dạng NULL. Điều này có lẽ vì mọi người đều có quyền dbo trong các cơ sở dữ liệu này.

Điều này đang sử dụng xác thực NT. Xác thực SQL có thể hoạt động giống nhau. Ngoài ra, mọi người đều có và sử dụng thông tin đăng nhập duy nhất hoặc chúng được chia sẻ không? Nếu bạn có đăng nhập doanh thu của nhân viên và tên miền (hoặc SQL) bị loại bỏ, một lần nữa dữ liệu có thể không có hoặc có thể không đầy đủ.

Bạn có thể xem dữ liệu này qua (chọn * từ sys.objects), nhưng nếu principal_id là null, có thể bạn không may mắn.

+0

Câu trả lời hay, bao gồm tất cả các cơ sở ... – gbn

+0

Đó là khá nhiều điều tôi nghĩ câu trả lời sắp xảy ra. Cảm ơn đã giúp đỡ. – bcasp

1

Nếu bạn cần một cơ chế nhỏ và cụ thể, bạn có thể tìm kiếm thông tin DLL Triggers.

11

Nếu mỗi người dùng có SQL Server riêng của mình đăng nhập bạn có thể thử này

select 
    so.name, su.name, so.crdate 
from 
    sysobjects so 
join 
    sysusers su on so.uid = su.uid 
order by 
    so.crdate 
+0

Nhưng nó xuất hiện so.uid thực sự là một SchemaId cho dbs không nhập khẩu: http://msdn.microsoft.com/en-us/library/ms177596.aspx – crokusek

0

Bạn đã cố gắng truy vấn này:

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, 
last_user_update,* 
FROM sys.dm_db_index_usage_stats 
WHERE database_id = DB_ID('<db name>') 
AND OBJECT_ID=OBJECT_ID('<table name>') 
30

Nếu đối tượng thời gian gần đây đã được tạo ra, bạn có thể kiểm tra các thay đổi Schema Báo cáo lịch sử, trong SQL Server Management Studio, "cung cấp lịch sử của tất cả các lệnh thực thi lệnh DDL đã cam kết trong Cơ sở dữ liệu được ghi lại theo dấu vết mặc định":

enter image description here

Sau đó, bạn có thể tìm kiếm các câu lệnh tạo của đối tượng. Trong số tất cả các thông tin được hiển thị, có tên đăng nhập của người thực thi câu lệnh DDL.

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