پارس دیتا
کد: KB-WP-C2-FA-160
زمان انتشار: یکشنبه 10 آذر 1398

نحوه تغییر schema جداول و Store Procedures در MSSQL

گاها نیاز می شود Owner یک و یا کلیه schema ها ، یا جداول تغییر پیدا کند و یا در نظر دارید User فعلی دیتابیس را حذف نمائید ولی با خطا مواجه می گردید. برای این منظور می بایست owner کلیه جداول و یا schema ها به dbo تغییر یابد. در ذیل به سه روش اشاره شده است.

جهت اطلاع از نحوه تغییر schema و یا جداول دیتابیس مراحل ذیل را دنبال نمائید:

  • در ابتدا می بایست برنامه Microsoft SQL Server Management Studio را در سیستم خود نصب کرده و سپس به دیتابیس کانکت شوید. پس از انتخاب نام دیتابیس بر روی گزینه "Query" جهت قرار دادن کد کلیک نمائید.
  • حال می بایست کد ذیل را در قسمتی که در تصویر نمایش داده شده است قرار داده و سپس جهت اجرای کوئری می بایست بر روی گزینه "Execute" کلیک نمائید. لازم به ذکر است به جای "oldschema" می بایست نام یوزری که وجود دارد را قرار دهید.
    SELECT 'ALTER SCHEMA dbo TRANSFER ' + s.Name + '.' + o.Name
    FROM sys.Objects o
    INNER JOIN sys.Schemas s on o.schema_id = s.schema_id
    WHERE s.Name = 'oldschema'
    And (o.Type = 'U' Or o.Type = 'P' Or o.Type = 'V')
    
  • حال می بایست خروجی که پس از اجرا در مرحله ابتدایی به شما داد را کپی و سپس مجدد در قسمت اجرای کوئری paste نموده و مجدد بر روی "Execute" کلیک نمائید. کد زیر یک مثال می باشد.
        ALTER SCHEMA dbo TRANSFER yourschema.Table1
        ALTER SCHEMA dbo TRANSFER yourschema.Table2
        ALTER SCHEMA dbo TRANSFER yourschema.Table3
        ALTER SCHEMA dbo TRANSFER yourschema.Table4
        ALTER SCHEMA dbo TRANSFER yourschema.Table5
        ALTER SCHEMA dbo TRANSFER yourschema.Table6
    
  • در صورتی که با کد مرحله ابتدایی نتوانستید یوزر دیتابیس را حذف نمایید و یا Owner جداول تغییر پیدا نکرد، از کد ذیل استفاده نمائید. پس از کپی کردن در قسمت مربوطه مجدد به مانند قبل بر روی گزینه "Execute" کلیک نمائید.
    IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id(N'[dbo].[ChangeAllObjectOwnersToDBO]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
    
    DROP procedure [dbo].[ChangeAllObjectOwnersToDBO]
    
    GO
    
    SET QUOTED_IDENTIFIER OFF    SET ANSI_NULLS  ON
    
    GO
    
     
    
    CREATE proc ChangeAllObjectOwnersToDBO
    
    AS
    
    SET nocount ON
    
     
    
    declare @uid int
    
    declare @objName varchar(50)
    
    declare @userName varchar(50)
    
    declare @currObjName varchar(50)
    
    declare @outStr varchar(256)
    
    SET @uid = user_id('dbo')
    
     
    
    declare chObjOwnerCur cursor static
    
    FOR
    
    SELECT user_name(uid) AS 'username', [name] AS 'name' FROM sysobjects WHERE uid <> @uid
    
     
    
    open chObjOwnerCur
    
    IF @@cursor_rows = 0
    
    begin
    
      print 'All objects are already owned by dbo!'
    
      close chObjOwnerCur
    
      deallocate chObjOwnerCur
    
      RETURN 1
    
    end
    
     
    
    fetch next FROM chObjOwnerCur INTO @userName, @objName
    
    while @@fetch_status = 0
    
    begin
    
      SET @currObjName = 'dbo.' + @objName
    
      IF (object_id(@currObjName) > 0)
    
        print 'WARNING *** ' + @currObjName + ' already exists ***'
    
      SET @outStr = 'sp_changeobjectowner "' + @userName + '.' + @objName + '", "dbo"'
    
      print @outStr
    
      print 'go'
    
      fetch next FROM chObjOwnerCur INTO @userName, @objName
    
    end
    
     
    
    close chObjOwnerCur
    
    deallocate chObjOwnerCur
    
    SET nocount off
    
    RETURN 0
    
     
    
    GO
    
    SET QUOTED_IDENTIFIER OFF    SET ANSI_NULLS  ON
    
    GO
    
  • در صورتی که تمامی مراحل بالا را طی نمودید ولی یک جدول و یا یک schema تغییر owner نداشت می توانید از کد ذیل استفاده نمائید. به جای"current_owner"می بایست نام Owner فعلی که قصد تغییر آن را دارید را وارد کرده و در قسمت "tablename" کافی است نام جدولی که در نظر است را قرار دهید. پس از آن بر روی گزینه "Execute" مجدد کلیک نمائید.
      ALTER SCHEMA dbo TRANSFER [current_owner].tablename;
    
آخرین بروزرسانی: یکشنبه 10 آذر 1398 9:23:55