ورود

View Full Version : ایجاد دیتا بیس جدید با استفاده از کوئری



araz_pashazadeh
شنبه 29 مرداد 1390, 17:26 عصر
با عرض سلام و خسته نباشید خدمت دوستان.
من پروسیجرای را برای ایجاد کردن یک دیتا بیس جدید که کاربر اسمش را مشخص میکنه نوشتم درست هم کار میکنه مشکلی در این مورد ندارم.
همین طور که در کد هم مشخص هستش قسمت مربوط به تراکنش ها را کامنت کردم چون وقتی این قسمت ها باز هستن دیتا بیس ایجاد نمیشه در ضمن خطای هم نمیده فقط کار نمی کنه.
من علاوه بر این که یک دیتا بیس جدید می خوام در این پروسیجر ایجاد کنم کارهای محاسباتی هم دارم و مقادیر موجود درجداول را هم تغییر می دم برای همین باید این تراکنش فعال بمونه که در صورت به وجود آمدن مشکل اطلاعات قبلی به همون صورتی که بود برگرده.
من چطوری میتونم در تکه کد زیر تراکنش ها را فعال کنم و دیتا بیس جدید را همراه محاسبات ایجاد کنم؟
لطفا دوستان من را در این مورد راهنایی کنن.

ALTER PROCEDURE [dbo].[CreateDB](
@DBName nvarchar(128))
AS
BEGIN
BEGIN TRY
--BEGIN TRANSACTION
SET @DBName=RTRIM(LTRIM(@DBName))

IF DB_ID (N''+@DBName+'') IS NOT NULL
EXECUTE('DROP DATABASE '+@DBName)
-- Get the SQL Server data path
DECLARE @data_path nvarchar(256);
SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
FROM master.sys.master_files
WHERE database_id = 1 AND file_id = 1);
EXECUTE ('CREATE DATABASE '+@DBName+'
ON
( NAME = '+@DBName+'_dat,
FILENAME = '''+ @data_path + @DBName+'dat.mdf'',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5 )
LOG ON
( NAME = '+@DBName+'_log,
FILENAME = '''+ @data_path + @DBName+'log.ldf'',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB )')
--COMMIT TRANSACTION
END TRY
BEGIN CATCH
--ROLLBACK TRANSACTION
END CATCH
END

Reza_Yarahmadi
شنبه 29 مرداد 1390, 22:38 عصر
مسلما کدتون زمان اجرا دچار یک Exceptin میشه ولی وقتی شما کدتون رو توب بلاک Try میذارید به این معنیه که میخواید مدیریت خطاها رو خودتون انجام بدید به همین دلیل خطایی نمایش داده نمیشه. توی بلاک Catch میتونید متن خطا رو از طریق تابع Error_Message بدست بیارید و ببینید چه Exeptionی رخ داده.
برای مثال ، 2 نمونه کد زیر اجرا کنید تا به منظور حرف من پی ببرید
Begin Try
Declare @I int
Set @I = 1/0
Select @I as I
End Try
Begin Catch
End Catch

Begin Try
Declare @I int
Set @I = 1/0
Select @I as I
End Try
Begin Catch
Print Error_Message()
End Catch

araz_pashazadeh
سه شنبه 15 شهریور 1390, 16:04 عصر
دوست عزیز کد من خطای نداره چون من همین کد را در اسکیول اجرا می کنم خطای نمیده وقتی داخل پروسیجر قرار می دم خطا می ده و یا وقتی ترکنش را فعال می کنم.
دلیل این کارو نمی دونم؟
ممنون میشم اگه کمکم کنید.

حمیدرضاصادقیان
سه شنبه 15 شهریور 1390, 16:50 عصر
سلام.
مشکل اینجاست که دستور Drop Database نمیتواند داخل یک User Transaction باشد و باید به صورت AutoCommit Transaction باشه که این مد هم به صورت پیش فرض فعاله تا زمانی که شما با استفاده از Begin Transaction این مد رو غیر فعال کنید.
من این رو تست کردم جواب داد.

Alter PROCEDURE [dbo].[CreateDB](@DBName nvarchar(128))
AS
BEGIN
--BEGIN TRY
--BEGIN TRANSACTION
-- Get the SQL Server data path
SET @DBName=RTRIM(LTRIM(@DBName))

IF DB_ID(N''+@DBName+'')IS NOT NULL
EXECUTE('DROP DATABASE '+@DBName)

DECLARE @data_path nvarchar(256);
SET @data_path =(SELECT SUBSTRING(physical_name, 1,CHARINDEX(N'master.mdf',LOWER(physical_name))- 1)
FROM master.sys.master_files
WHERE database_id = 1 AND file_id= 1);
EXECUTE ('CREATE DATABASE '+@DBName+'
ON
( NAME = '+@DBName+'_dat,
FILENAME = '''+ @data_path + @DBName+'dat.mdf'',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5 )
LOG ON
( NAME = '+@DBName+'_log,
FILENAME = '''+ @data_path + @DBName+'log.ldf'',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB )')
--COMMIT TRANSACTION
--ENDTRY
--BEGINCATCH
--ROLLBACK TRANSACTION
--ENDCATCH
END