ฉันสามารถดึงวัตถุฐานข้อมูลทั้งหมดที่ผู้ใช้นั้นเป็นเจ้าของได้หรือไม่


16

เรามีผู้ใช้ที่กำลังออกจากและฉันจำเป็นต้องรู้ทุกวัตถุฐานข้อมูลที่เขาเป็นเจ้าของ มีแบบสอบถามที่จะให้ข้อมูลนี้หรือไม่?

คำตอบ:


22

สิ่งนี้จะทำให้คุณได้สิ่งที่คุณต้องการ:

;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';

นี้จะได้รับวัตถุที่เป็นเจ้าของโดยผู้ใช้ของคุณโดยเฉพาะ (แทน'YourUser'แน่นอน) ประเภทของวัตถุที่แบบสอบถามดึงนี้คือ:

  • FN = ฟังก์ชันสเกลาร์ SQL
  • FS = ฟังก์ชันสเกลาร์ประกอบ (CLR) สเกลาร์
  • FT = ฟังก์ชั่นที่มีค่าเป็นตารางประกอบ (CLR)
  • IF = ฟังก์ชัน SQL ตารางที่มีค่าแบบอินไลน์ SQL
  • P = โพรซีเดอร์ที่เก็บ SQL
  • PC = Assembly (CLR) ขั้นตอนการจัดเก็บ
  • TA = ทริกเกอร์ DML Assembly (CLR)
  • TF = ฟังก์ชันตารางที่มีค่าเป็น SQL
  • TR = ทริกเกอร์ SQL DML
  • U = ตาราง (กำหนดโดยผู้ใช้)
  • V = ดู

1
(พบสิ่งนี้จากการค้นหา) สิ่งนี้ไม่รวมออบเจ็กต์ที่ไม่ได้กำหนดขอบเขตเช่นประเภทข้อความ Service Broker คุณรู้วิธีง่ายๆในการรับข้อมูลนั้นโดยไม่ต้องขุดลงในมุมมองข้อมูลเมตาของวัตถุทั้งหมดหรือไม่ (นอกจากนี้ฉันไม่แน่ใจว่าทำไมคุณ จำกัด ประเภทของวัตถุที่ส่งคืนในแบบสอบถามนี้เนื่องจากอาจแยกวัตถุบางอย่างที่น่าสนใจ)
Jon Seigel

ฉันลงเอยด้วยการสร้างมุมมองของตัวเอง หากคุณรู้วิธีการแก้ปัญหาที่ดีกว่าโปรดแจ้งให้เราทราบ
Jon Seigel

@ JonSeigel ฉันได้เขียนโดยใช้ยูเนี่ยนข้างต้น คุณสามารถโพสต์ของคุณเพื่อที่ฉันจะได้เปรียบเทียบและปรับปรุงของฉัน
PseudoToad

3

ในการแสดงเจ้าของฐานข้อมูลที่ไม่ใช่ sa ทั้งหมด:

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

หากคุณต้องการเจ้าของระบบ SQL:

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
คำถามที่ถามสำหรับทุกวัตถุฐานข้อมูลและไม่ใช่แค่ฐานข้อมูลเอง
SqlWorldWide

@SqlWorldWide - แต่คำตอบที่ยอมรับไม่รวมฐานข้อมูลที่เป็นเจ้าของดังนั้นคำตอบนี้มีประโยชน์เพิ่มเติม (ที่น่าสนใจชื่อ 'เจ้าของ' กลับมาที่นี่ไม่ได้อยู่ในตาราง sys.database_principals ที่อ้างอิงในคำตอบที่ได้รับการยอมรับจะรักที่จะรู้ว่าสิ่งที่เกิดขึ้น..)
youcantryreachingme

2

สำหรับงานคุณไม่สามารถใช้ syslogins ได้เนื่องจากเจ้าของอาจเป็นส่วนหนึ่งของกลุ่มและไม่มีอยู่ในการเข้าสู่ระบบ ใช้ด้านล่าง

select msdb.[dbo].[SQLAGENT_SUSER_SNAME](owner_sid), * 
from msdb.dbo.sysjobs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.