PDA

View Full Version : آموزش: تغییر مالکیت sp



Beyondsoft
دوشنبه 16 فروردین 1389, 17:05 عصر
سلام دوستان

بسیار پیش می آید که در طول یک پروژه برخی از sp های به نام کاربران مختلف دیتابیس باشد ( مخصوصاً وقتی نیمی از دیتابیس local طراحی شده باشد و نیمه دیگر در اینترنت اضافه شده باشد.

برای رفع این مشکل از مراحل زیر استفاده کنید:

1- sp زیر را بسازید:



if exists (select * from sysobjects where id = object_id(N'[dbo].[chObjOwner]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[chObjOwner]
GO

SET QUOTED_IDENTIFIER OFF SET ANSI_NULLS ON
GO

CREATE proc chObjOwner( @usrName varchar(20), @newUsrName varchar(50))
as
-- @usrName is the current user
-- @newUsrName is the new user

set nocount on
declare @uid int -- UID of the user
declare @objName varchar(50) -- Object name owned by user
declare @currObjName varchar(50) -- Checks for existing object owned by new user
declare @outStr varchar(256) -- SQL command with 'sp_changeobjectowner'
set @uid = user_id(@usrName)

declare chObjOwnerCur cursor static
for
select name from sysobjects where uid = @uid

open chObjOwnerCur
if @@cursor_rows = 0
begin
print 'Error: No objects owned by ' + @usrName
close chObjOwnerCur
deallocate chObjOwnerCur
return 1
end

fetch next from chObjOwnerCur into @objName

while @@fetch_status = 0
begin
set @currObjName = @newUsrName + "." + @objName
if (object_id(@currObjName) > 0)
print 'WARNING *** ' + @currObjName + ' already exists ***'
set @outStr = "sp_changeobjectowner '" + @usrName + "." + @objName + "','" + @newUsrName + "'"
print @outStr
print 'go'
fetch next from chObjOwnerCur into @objName
end

close chObjOwnerCur
deallocate chObjOwnerCur
set nocount off
return 0

GO
SET QUOTED_IDENTIFIER OFF SET ANSI_NULLS ON
GO



2- این sp را اجرا کنید :



exec chObjOwner 'Arvan', 'dbo'



3- خروجی را که بر می گرداند را اجرا کنید: مثلاً:




go
sp_changeobjectowner 'Arvan.sp_Log_SelectAll','dbo'
go
sp_changeobjectowner 'Arvan.sp_Log_SelectRow','dbo'
go
sp_changeobjectowner 'Arvan.sp_Log_Insert','dbo'
go
sp_changeobjectowner 'Arvan.sp_Log_Update','dbo'
go
sp_changeobjectowner 'Arvan.sp_Log_DeleteRow','dbo'
go





منبع:
http://support.microsoft.com/kb/275312

Beyondsoft
شنبه 21 فروردین 1389, 23:51 عصر
توجه داشته باشید که خروجی بدون دقت اجرا نکنید،
گاهی در خروجی پیغام خطا مبنی بر وجود داشتن sp به نام کاربری که قصد تبدیل به آن را دارید وجود دارد.