Рефакторинг Add CRUD Method в БД MS SQL Server

добавлено: 08 сен 13
понравилось:0
просмотров: 2348
комментов: 1

теги:

Автор: SQL Refactor Studio Team

Тема будет полезна тем, кто для доступа к таблицам БД использует процедурный подход...

Пусть для примера у Вас есть n-таблиц в БД, редактирование которых нужно вынести в UI посредством хранимых процедур.
Перед Вами стоит задача, создать для каждой таблицы процедуры вставки, чтения, обновления, удаления.
Согласитесь, каждый раз создавать процедуры ручками (ну или копировать+подгонять существующие) довольно утомительно, да и шансы сделать ошибку (или отойти от стандарта кодирования) достаточно высоки.

Давайте попробуем упросить нашу задачу, скачиваем и устанавливаем бесплатный Addin для SQL Server Management Studio (SSMS).
Находясь в Object Explorer выбираем нужную таблицу, далее в контекстном меню выбираем "SQL Refactor Studio => Add CRUD Methods" (также можно использовать комбинацию клавиш "Shift+Ctrl+M").

В появившемся диалоге корректируем (при необходимости) названия процедур. Если Вам нужно создать не все процедуры, а только некоторые их них, снимите галки напротив тех которые не ходите создавать.

Картинка с другого сайта.

Нажимаем кнопку Next и переходим на следующий шаг мастера. При необходимости здесь можно отметить роли БД, члены которых будут иметь право на EXECUTE создаваемых хранимых процедур.
Картинка с другого сайта.

Нажимаем Finish и addin любезно генерирует в новых окнах редактора запросов хранимые процедуры (если Вы на первом шаге мастера включите флаг Open scripts in one window, код всех процедур окажется в одном окне).

IF (object_id(N'dbo.Customers_ins') IS NULL)
BEGIN
	EXEC ('create procedure dbo.Customers_ins as return 0')
END
GO

-- =============================================
--
-- 	dbo.Customers_ins
--
--	Create method.
--
-- 	Date: 16.09.2013, admin
--
-- =============================================
ALTER PROCEDURE dbo.Customers_ins 
   @CustomerID NCHAR(5)
	,@CompanyName NVARCHAR(40)
	,@ContactName NVARCHAR(30) = NULL
	,@ContactTitle NVARCHAR(30) = NULL
	,@Address NVARCHAR(60) = NULL
	,@City NVARCHAR(15) = NULL
	,@Region NVARCHAR(15) = NULL
	,@PostalCode NVARCHAR(10) = NULL
	,@Country NVARCHAR(15) = NULL
	,@Phone NVARCHAR(24) = NULL
	,@Fax NVARCHAR(24) = NULL
AS
BEGIN
	SET NOCOUNT ON

	INSERT INTO dbo.Customers (
		CustomerID
		,CompanyName
		,ContactName
		,ContactTitle
		,Address
		,City
		,Region
		,PostalCode
		,Country
		,Phone
		,Fax
		)
	VALUES (
		@CustomerID
		,@CompanyName
		,@ContactName
		,@ContactTitle
		,@Address
		,@City
		,@Region
		,@PostalCode
		,@Country
		,@Phone
		,@Fax
		)

	RETURN 0
END
	/*
declare
	@CustomerID nchar(5),	
	@CompanyName nvarchar(40),	
	@ContactName nvarchar(30),	
	@ContactTitle nvarchar(30),	
	@Address nvarchar(60),	
	@City nvarchar(15),	
	@Region nvarchar(15),	
	@PostalCode nvarchar(10),	
	@Country nvarchar(15),	
	@Phone nvarchar(24),	
	@Fax nvarchar(24)	

select
	@CustomerID = 'CustomerID',	
	@CompanyName = 'CompanyName',	
	@ContactName = 'ContactName',	
	@ContactTitle = 'ContactTitle',	
	@Address = 'Address',	
	@City = 'City',	
	@Region = 'Region',	
	@PostalCode = 'PostalCode',	
	@Country = 'Country',	
	@Phone = 'Phone',	
	@Fax = 'Fax'	

exec  dbo.Customers_ins
	@CustomerID = @CustomerID,	
	@CompanyName = @CompanyName,	
	@ContactName = @ContactName,	
	@ContactTitle = @ContactTitle,	
	@Address = @Address,	
	@City = @City,	
	@Region = @Region,	
	@PostalCode = @PostalCode,	
	@Country = @Country,	
	@Phone = @Phone,	
	@Fax = @Fax	

*/
GO

GRANT EXECUTE
	ON dbo.Customers_ins
	TO [Admins]
GO



go
IF (object_id(N'dbo.Customers_get') IS NULL)
BEGIN
	EXEC ('create procedure dbo.Customers_get as return 0')
END
GO

-- =============================================
--
-- 	dbo.Customers_get
--
--	Read method.
--
-- 	Date: 16.09.2013, admin
--
-- =============================================
ALTER PROCEDURE dbo.Customers_get
  @CustomerID NCHAR(5)
AS
BEGIN
	SET NOCOUNT ON

	SELECT CustomerID
		,CompanyName
		,ContactName
		,ContactTitle
		,Address
		,City
		,Region
		,PostalCode
		,Country
		,Phone
		,Fax
	FROM dbo.Customers
	WHERE CustomerID = @CustomerID

	RETURN 0
END
	/*
declare
	@CustomerID nchar(5)	

select
	@CustomerID = ?	

exec dbo.Customers_get
	@CustomerID = @CustomerID	

*/
GO

GRANT EXECUTE
	ON dbo.Customers_get
	TO [Admins]
GO



go
IF (object_id(N'dbo.Customers_upd') IS NULL)
BEGIN
	EXEC ('create procedure dbo.Customers_upd as return 0')
END
GO

-- =============================================
--
-- 	dbo.Customers_upd
--
--	Update method.
--
-- 	Date: 16.09.2013, admin
--
-- =============================================
ALTER PROCEDURE dbo.Customers_upd 
   @CustomerID NCHAR(5)
	,@CompanyName NVARCHAR(40)
	,@ContactName NVARCHAR(30) = NULL
	,@ContactTitle NVARCHAR(30) = NULL
	,@Address NVARCHAR(60) = NULL
	,@City NVARCHAR(15) = NULL
	,@Region NVARCHAR(15) = NULL
	,@PostalCode NVARCHAR(10) = NULL
	,@Country NVARCHAR(15) = NULL
	,@Phone NVARCHAR(24) = NULL
	,@Fax NVARCHAR(24) = NULL
AS
BEGIN
	SET NOCOUNT ON

	UPDATE t
	SET t.CompanyName = @CompanyName
		,t.ContactName = @ContactName
		,t.ContactTitle = @ContactTitle
		,t.Address = @Address
		,t.City = @City
		,t.Region = @Region
		,t.PostalCode = @PostalCode
		,t.Country = @Country
		,t.Phone = @Phone
		,t.Fax = @Fax
	FROM dbo.Customers AS t
	WHERE t.CustomerID = @CustomerID

	RETURN 0
END
	/*
	set nocount on
	set quoted_identifier, ansi_nulls, ansi_warnings, arithabort, concat_null_yields_null, ansi_padding on
	set numeric_roundabort off
	set transaction isolation level read uncommitted

	declare
		@CustomerID nchar(5),	
		@CompanyName nvarchar(40),	
		@ContactName nvarchar(30),	
		@ContactTitle nvarchar(30),	
		@Address nvarchar(60),	
		@City nvarchar(15),	
		@Region nvarchar(15),	
		@PostalCode nvarchar(10),	
		@Country nvarchar(15),	
		@Phone nvarchar(24),	
		@Fax nvarchar(24)	

	select
		@CustomerID = 'CustomerID',	
		@CompanyName = 'CompanyName',	
		@ContactName = 'ContactName',	
		@ContactTitle = 'ContactTitle',	
		@Address = 'Address',	
		@City = 'City',	
		@Region = 'Region',	
		@PostalCode = 'PostalCode',	
		@Country = 'Country',	
		@Phone = 'Phone',	
		@Fax = 'Fax'	

	begin try
		begin tran
			exec dbo.Customers_upd
				@CustomerID = @CustomerID,	
				@CompanyName = @CompanyName,	
				@ContactName = @ContactName,	
				@ContactTitle = @ContactTitle,	
				@Address = @Address,	
				@City = @City,	
				@Region = @Region,	
				@PostalCode = @PostalCode,	
				@Country = @Country,	
				@Phone = @Phone,	
				@Fax = @Fax	
	
			select t.*
			from dbo.Customers as t
			where
				t.CustomerID = @CustomerID
	

			if @@trancount > 0
				rollback tran

	end try
	begin catch
		if @@trancount > 0
			rollback tran
	
		declare
			@err nvarchar(2000)
		
		  set @err = 
			  'login: ' + suser_sname() + char(10)
			+ 'ErrorNumber: ' + cast(isnull(error_number(), 0) as varchar) + char(10)
			+ 'ErrorProcedure: ' + isnull(error_procedure(), '') + char(10)
			+ 'ErrorLine: ' + cast(isnull(error_line(), 0) as varchar) + char(10)
			+ 'ErrorMessage: ' + isnull(error_message(), '') + char(10)
			+ 'Date: ' + cast(getdate() as varchar) + char(10)
	
		print @err
		raiserror(@err, 16, 1)
	end catch
*/
GO

GRANT EXECUTE
	ON dbo.Customers_upd
	TO [Admins]
GO



go
IF (object_id(N'dbo.Customers_del') IS NULL)
BEGIN
	EXEC ('create procedure dbo.Customers_del as return 0')
END
GO

-- =============================================
--
-- 	dbo.Customers_del
--
--	Delete method.
--
-- 	Date: 16.09.2013, admin
--
-- =============================================
ALTER PROCEDURE dbo.Customers_del
  @CustomerID NCHAR(5)
AS
BEGIN
	SET NOCOUNT ON

	/* uncomment if needed

	DELETE FROM dbo.Orders WHERE CustomerID = ?
	DELETE FROM dbo.CustomerCustomerDemo WHERE CustomerID = ? 
	*/

	DELETE
	FROM dbo.Customers
	WHERE CustomerID = @CustomerID

	RETURN 0
END
	/*
declare
	@CustomerID nchar(5)	

select
	@CustomerID = ?	

exec dbo.Customers_del
	@CustomerID = @CustomerID	

*/
GO

GRANT EXECUTE
	ON dbo.Customers_del
	TO [Admins]
GO



go
IF (object_id(N'dbo.Customers_list') IS NULL)
BEGIN
	EXEC ('create procedure dbo.Customers_list as return 0')
END
GO

-- =============================================
--
-- 	dbo.Customers_list
--
--	List method.
--
-- 	Date: 16.09.2013, admin
--
-- =============================================
ALTER PROCEDURE dbo.Customers_list
AS
BEGIN
	SET NOCOUNT ON

	SELECT CustomerID
		,CompanyName
		,ContactName
		,ContactTitle
		,Address
		,City
		,Region
		,PostalCode
		,Country
		,Phone
		,Fax
	FROM dbo.Customers

	RETURN 0
END
	/*
exec dbo.Customers_list
*/
GO

GRANT EXECUTE
	ON dbo.Customers_list
	TO [Admins]
GO



go


Теперь о настройках...
Разумеется Вам сразу захочется поменять шаблоны процедур ;).
Для этого выбираем в главном меню "SQL Refactor Studio => Configure".
В появившемся окне отображается список конфигураций (по умолчанию у Вас одна конфигурация default).
Вы можете здесь создать сколько угодно конфигураций, настроить каждую из них под свои задачи (например для каждой БД у Вас будут свои шаблоны процедур).
Далее Вам достаточно будет переключаться между конфигурациями (кнопка Set current), чтобы применить настройки к IDE.

Картинка с другого сайта.

По двойному клику открываем нужный конфиг, переходим на вкладку "Refactoring=>Add CRUD Methods".
Здесь можно задать окончание хранимых процедур (по умолчанию _get, _ind, _del, _upd), включить/отключить создание определенных процедур, и отредактировать шаблон каждой процедуры (шаблоны созданы при помощи T4).

Картинка с другого сайта.

Комментарии


  • есть спец-тег, чтобы на главное странице остался только первый абзац с "о чем запись"...



Необходимо войти на сайт, чтобы оставлять комментарии