نحوه تغییر 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;