PDA

View Full Version : سوال: ایجاد sp در master به صورت اتوماتیک (وقتی کاربر می خواد نرم افزار رو نصب کنه)



farzadkamali
پنج شنبه 07 اسفند 1393, 20:35 عصر
با سلام
من یه sp دارم که برای بازگردانی بک آپ هست و در master هست. که البته فایلشو ذخیره کردم.
حالا این sp چون توی پایگاه نیست ، با attach پایگاه به master اضافه نمیشه.
می خوام اتوماتیک این sp رو در master ایجاد کنم.(حالا با کدنویسی در دلفی با...)
کلاً برای sp هایی که در پایگاه نیستند چه باید کرد؟

یوسف زالی
پنج شنبه 07 اسفند 1393, 23:11 عصر
سلام.
مستقیم کوئری رو روی Master ران کنید.
مشکل چیه؟

farzadkamali
جمعه 08 اسفند 1393, 10:58 صبح
سلام.
مستقیم کوئری رو روی Master ران کنید.
مشکل چیه؟
مشکلی توی ران کردن ندارم. مشکل اینجاست که برای اولین بار باید این sp به صورت دستی روی سیستم کاربر run بشه.
من می خوام اتوماتیک این کار رو انجام بدم.مثلاً یه دستور ، پروسیجر یا... که نام و آدرس sp ذخیره شده روی سیستم رو بگیره و اتوماتیک اونو توی master یا... run کنه.
چه روش هایی هست؟ توی sp های آماده موجود در master پروسیجری نیست که این کار رو انجام بده؟ ساده ترین راه چیه؟
تا جایی که فهمیدم کامپوننت UniDAC این قابلیت رو داره. راه ساده تری نیست!؟

یوسف زالی
جمعه 08 اسفند 1393, 11:33 صبح
من واقعا متوجه صورت سوال نمی شم.
یک کوئری با ADOQuery بسازید که کانکشن استرینگش روی مستر سیستم مقصده.
محتوای این کوئری می شه چیزی شبیه به این:


create procedure MyProc
@Param1
@Param2
.
.
as
begin
.
.
end


این کوئری رو ران می کنید، اس پی ساخته می شه.
سپس با استفاده از یک ADOStoredProc این اس پی رو ران می کنید.

farzadkamali
جمعه 08 اسفند 1393, 12:04 عصر
من واقعا متوجه صورت سوال نمی شم.
یک کوئری با ADOQuery بسازید که کانکسشن استرینگش روی مستر سیستم مقصده.
محتوای این کوئری می شه چیزی شبیه به این:


create procedure MyProc
@Param1
@Param2
.
.
as
begin
.
.
end


این کوئری رو ران می کنید، اس پی ساخته می شه.
سپس با استفاده از یک ADOStoredProc این اس پی رو ران می کنید.

آهان! گرفتم چی شد. باید دستور ساخت sp رو توی یک کوئری در دلفی نوشت و کوئری رو ران کرد.
من این دستورات ساخت sp رو توی sql نوشتم و فایلش sql ش رو با پسوند .sql روی سیستم ذخیره کردم. برای ران کردنش هم اونو باز می کنم و execute رو میزنم.
این sp من هست. دستور زیر درسته؟


with adoquery1 do
begin
Close;
create PROCEDURE [dbo].[sp_sys_restore](@dbname NVARCHAR(100),@masir NVARCHAR(500) )
AS

BEGIN

DECLARE @r_name NVARCHAR(500)
DECLARE @r_path NVARCHAR(500)
DECLARE @r_x NVARCHAR(1000)

SELECT @r_name=sys.master_files.name ,
@r_path=sys.master_files.physical_name
FROM sys.databases
INNER JOIN sys.master_files
ON sys.databases.database_id = sys.master_files.database_id
WHERE sys.databases.name=@dbname AND sys.master_files.type_desc='ROWS'
SET @r_x=+' ,MOVE '+''''+@r_name+''''+' to '+''''+@r_path+''''
SET @r_x=ISNULL(@r_x,'')





DECLARE @l_name NVARCHAR(500)
DECLARE @l_path NVARCHAR(500)
DECLARE @l_x NVARCHAR(1000)



SELECT @l_name=sys.master_files.name ,
@l_path=sys.master_files.physical_name
FROM sys.databases
INNER JOIN sys.master_files
ON sys.databases.database_id = sys.master_files.database_id
WHERE sys.databases.name=@dbname AND sys.master_files.type_desc='LOG'

SET @l_x=+' ,MOVE '+''''+@l_name+''''+' to '+''''+@l_path+''''
SET @l_x=ISNULL(@l_x,'')





DECLARE @runer NVARCHAR(max)
SET @runer='RESTORE DATABASE ['+@dbname+'] FROM DISK = '+''''+@masir+''''+' WITH FILE = 1'
+@r_x
+@l_x

+', NOUNLOAD, REPLACE, STATS = 10 '



exec ('ALTER DATABASE '+ @dbname +' SET SINGLE_USER WITH ROLLBACK IMMEDIATE ')

EXEC (@runer)

exec ('ALTER DATABASE '+@dbname +' SET MULTI_USER ')








END

ExecSQL;

end

یوسف زالی
جمعه 08 اسفند 1393, 12:18 عصر
درستی یا نادرستی اس پی رو باید خودتون تشخیص بدید دیگه.
نیازی به ساخت فایل نیست.
همین کوئری رو در قالب یک کوئری ران کنید ساخته می شه.

farzadkamali
جمعه 08 اسفند 1393, 12:44 عصر
درستی یا نادرستی اس پی رو باید خودتون تشخیص بدید دیگه.

sp درسته و کار میکنه. منظورم ساختار نوشتن adoquery بود.


نیازی به ساخت فایل نیست.. همین کوئری رو در قالب یک کوئری ران کنید ساخته می شه

اجرا کردم. درست شد و جواب داد. ممنون.