Tôi có thể truy xuất tất cả các đối tượng cơ sở dữ liệu thuộc sở hữu của một người dùng cụ thể không?


16

Chúng tôi có một người dùng đang rời đi và tôi cần biết mọi đối tượng cơ sở dữ liệu mà anh ta sở hữu. Có một truy vấn sẽ cung cấp thông tin này?

Câu trả lời:


22

Điều này sẽ giúp bạn có được những gì bạn đang tìm kiếm:

;with objects_cte as
(
    select
        o.name,
        o.type_desc,
        case
            when o.principal_id is null then s.principal_id
            else o.principal_id
        end as principal_id
    from sys.objects o
    inner join sys.schemas s
    on o.schema_id = s.schema_id
    where o.is_ms_shipped = 0
    and o.type in ('U', 'FN', 'FS', 'FT', 'IF', 'P', 'PC', 'TA', 'TF', 'TR', 'V')
)
select
    cte.name,
    cte.type_desc,
    dp.name
from objects_cte cte
inner join sys.database_principals dp
on cte.principal_id = dp.principal_id
where dp.name = 'YourUser';

Điều này sẽ nhận được các đối tượng được sở hữu bởi người dùng cụ thể của bạn ( 'YourUser'tất nhiên thay thế ). Các loại đối tượng mà truy vấn này kéo là:

  • Hàm vô hướng FN = SQL
  • Hàm vô hướng FS = hội (CLR)
  • Hàm có giá trị bảng FT = hội (CLR)
  • Hàm IF có giá trị bảng nội tuyến SQL
  • P = Thủ tục lưu trữ SQL
  • Thủ tục lưu trữ PC = hội (CLR)
  • Trình kích hoạt DML TA = hội (CLR)
  • Hàm TF = giá trị bảng SQL
  • TR = SQL kích hoạt DML
  • Bảng U = (do người dùng định nghĩa)
  • V = Xem

1
(Tìm thấy điều này thông qua tìm kiếm.) Điều này không bao gồm các đối tượng không có lược đồ như các loại thông báo của Nhà môi giới dịch vụ. Bạn có biết một cách dễ dàng để có được thông tin đó mà không cần đào sâu vào tất cả các chế độ xem siêu dữ liệu của đối tượng cụ thể không? (Ngoài ra, tôi không chắc tại sao bạn lại giới hạn các loại đối tượng được trả về trong truy vấn này, vì nó có thể loại trừ một số đối tượng quan tâm.)
Jon Seigel

Vâng, tôi đã kết thúc việc tạo ra quan điểm của riêng tôi. Nếu bạn biết về một giải pháp tốt hơn, xin vui lòng cho tôi biết.
Jon Seigel

@JonSeigel Tôi đã viết một cái bằng cách sử dụng UNION ở trên. Bạn có thể đăng bài của bạn để tôi có thể so sánh và cải thiện của tôi?
PseudoToad

3

Để hiển thị tất cả các chủ sở hữu cơ sở dữ liệu không sa:

SELECT suser_sname( owner_sid ) OwnerID , * FROM sys.databases where suser_sname( owner_sid ) <> 'sa'

Nếu bạn cần hệ thống SQL Chủ sở hữu công việc:

select s.name,l.name  
from  msdb..sysjobs s 
left join master.sys.syslogins l on s.owner_sid = l.sid 
where l.name is not null and l.name <> 'sa'
order by l.name

1
Câu hỏi yêu cầu cho mọi đối tượng cơ sở dữ liệu và không chỉ cơ sở dữ liệu.
SqlWorldWide

@SqlWorldWide - nhưng câu trả lời được chấp nhận không bao gồm các cơ sở dữ liệu được sở hữu, vì vậy câu trả lời này rất hữu ích. (Điều thú vị là tên của Chủ đầu tư 'trở lại đây thậm chí không tồn tại trong bảng sys.database_principals tham chiếu trong câu trả lời được chấp nhận rất thích biết những gì đang xảy ra..)
youcantryreachingme
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.