زمان انتشار:
یکشنبه 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;