SQL Server Enterprise Manager - حذف جماعي من الجداول وتغيير ملكية الجداول

StackOverflow https://stackoverflow.com/questions/3736230

سؤال

ليس لدي أي خبرة إلى حد كبير مع مدير مؤسسة SQL Server ، لذا لست متأكدًا مما إذا كان هذا ممكنًا (أو نأمل أن يكون بسيطًا!)

أثناء الاستيراد إلى قاعدة بيانات ، حدث شيء ما حيث قام كل جدول بتكرار نفسه باختلافين مهمين.

الأول هو أن المالك على كلا الجدولين مختلفون ، والثاني هو أن الهيكل فقط قد تم نسخه على إحدى النسخ.

أشار قانون SOD إلى أنه بالطبع تم تخزين البيانات على الجداول التي يملكها الشخص الخطأ ، لذلك سؤالي هو هل يمكنني حذف جميع الجداول التي يملكها أحد مستخدمين بسرعة ، ويمكنني تغيير ملكية جميع الجداول الأخرى بسرعة لجلبها.

هناك ما يكفي من الجداول أن الأتمتة ستكون خياري المفضل بمسافة طويلة!

أي مساعدة سيكون موضع تقدير كبير ، أنا أقوم بتشغيل SQL Server 2000

هل كانت مفيدة؟

المحلول

declare @emptyOwner varchar(20)
declare @wrongOwner varchar(20)
declare @emptyOwnerID bigint
declare @wrongOwnerID bigint
declare @tableName nvarchar(255)

set @emptyOwner = 'dbo'
set @wrongOwner = 'guest'

select @emptyOwnerID = (select uid from sysusers where name = @emptyOwner)
select @wrongOwnerID = (select uid from sysusers where name = @wrongOwner)

select name as tableName
into #tempTable
from systables
where type='U'
and exists (select 1 from systables where type = 'U' and uid = @emptyOwnerID)
and exists (select 1 from systables where type = 'U' and uid = @wrongOwnerID)

declare @dynSQL nvarchar(MAX)

declare ownme cursor for
  select tableName from #tempTable

open ownme
fetch next from ownme into @tableName

while @@FETCH_STATUS = 0
begin
    @dynSQL = 'DROP TABLE [' + @emptyOwner + '].[' + @tableName + ']'
    exec(@dynSQL)

    @dynSQL = 'sp_changeobjectowner ''[' + @wrongOwner + '].[' + @tableName + ']'',''' + @emptyOwner + ''''
    exec(@dynSQL)

    fetch next from ownme into @tableName
end

close ownme
deallocate ownme

نصائح أخرى

لتغيير الملكية ، انظر: تغييرات ملكية جدول SQL ، سريعة وسهلة

الرمز الوارد في الرابط أعلاه هو:

DECLARE @old sysname, @new sysname, @sql varchar(1000)

SELECT
  @old = 'oldOwner_CHANGE_THIS'
  , @new = 'dbo'
  , @sql = '
  IF EXISTS (SELECT NULL FROM INFORMATION_SCHEMA.TABLES
  WHERE
      QUOTENAME(TABLE_SCHEMA)+''.''+QUOTENAME(TABLE_NAME) = ''?''
      AND TABLE_SCHEMA = ''' + @old + '''
  )
  EXECUTE sp_changeobjectowner ''?'', ''' + @new + ''''

EXECUTE sp_MSforeachtable @sql
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top