В этой статье я расскажу о примерах проектов и запросов, которые могут быть полезны для автоматизации и сокращения времени, затрачиваемого на оперативные работы с базой данных.
В приложениях, ориентированных на данные, существует много рабочих заданий в базе данных. Эти рабочие задания могут зависеть от количества баз данных, размера данных, организационной структуры. Давайте подумаем об этом:
- Если у вас как у фирмы больше разработок программного обеспечения, у вас одновременно будет больше серверов баз данных (базы данных). Вы можете импортировать и экспортировать данные для синхронизации данных между базами данных.
- Возможно, вы вручную развертываете свою базу данных
- Вы можете делать текстовый поиск в объектах базы данных
- Вы можете подготовить сценарии вставки и обновления операторов для данных, которые вы добавили в базу данных.
- Если в базе данных есть открытые транзакции, вы должны перечислить ее и затем завершить.
- Вы можете менять жестко запрограммированные места во всех хранимых процедурах
и многое другое бизнес-сценарий. Мы потратили время на такие оперативные работы. Я думаю, что это проблема. Мы не должны тратить время на это. Что мы можем сделать, чтобы решить эту проблему? Давайте посмотрим:
- Мы можем разработать консольные приложения для конкретных ежегодных и ежемесячных работ по базе данных.
- Мы можем подготовить сценарии для ежедневных работ по базе данных
- Мы можем использовать существующий плагин или программы. Например; Бесплатные инструменты фирмы Redgate находятся здесь
- Мы можем разработать веб-приложение или приложение для Windows, которое мы используем во всех работах с базами данных. Вы можете эффективно использовать MS Sql сервер SMO kütüphane
Теперь мы рассмотрим примеры хранимых процедур, запросов и проектов по пунктам ниже. Кстати, я написал хранимые процедуры, запросы и проекты (C #) с transact-sql.
Сценарии
1 — Search.sql
Вы увидите выбранные запросы, которые вы используете для поиска текста в объектах базы данных (хранимая процедура, триггер, функция…). Мы используем системные таблицы для поиска ниже, и я должен просмотреть системные таблицы (действительно полезный запрос).
-- database object contents
SELECT * FROM sys.syscomments(NOLOCK)
-- For schema names of tables
SELECT * FROM sys.schemas(NOLOCK)
-- All database objects' names
SELECT * FROM sys.all_objects(NOLOCK)
-- main select query
SELECT S.name AS SP_SCHEMA,
O.name AS SP_NAME,
C.text AS SP_TEXT
FROM sys.syscomments(NOLOCK) AS C
JOIN sys.all_objects(NOLOCK) AS O
ON C.id = O.object_id
JOIN sys.schemas AS S
ON S.schema_id = O.schema_id
WHERE O.type in ('P','FN','IF','FS','AF','X','TF','TR','PC') AND
C.text like '%' + 'ARANACAK KELIME' + '%'
T-SQL скрипт для вложенного поиска. Вы можете легко создать хранимую процедуру для этого:
DECLARE @text1 VARCHAR(MAX),
@text2 VARCHAR(MAX),
@text3 VARCHAR(MAX),
@text4 VARCHAR(MAX),
@text5 VARCHAR(MAX),
@dbname VARCHAR(64)
SET @dbname='DB_NAME'
SET @text1='TEXT1_TO_SEARCH'
SET @text2='TEXT2_TO_SEARCH'
SET @text3='TEXT3_TO_SEARCH'
SET @text4='TEXT4_TO_SEARCH'
SET @text5='TEXT5_TO_SEARCH'
DECLARE @sql VARCHAR(MAX)
SELECT @sql = ''
SELECT @sql = @sql + 'SELECT * FROM ('
SELECT @sql = @sql + 'SELECT * FROM ('
SELECT @sql = @sql + 'SELECT * FROM ('
SELECT @sql = @sql + 'SELECT * FROM ('
select @sql = @sql + 'SELECT ''' + @dbname + ''' AS db, o.name,m.definition '
select @sql = @sql + ' FROM '+@dbname+'.sys.sql_modules m '
select @sql = @sql + ' INNER JOIN '+@dbname+'..sysobjects o on m.object_id=o.id'
select @sql = @sql + ' WHERE [definition] LIKE ''%'+@text1+'%'''
SELECT @sql = @sql + ' ) X WHERE [definition] LIKE ''%'+@text2+'%'''
SELECT @sql = @sql + ' ) X WHERE [definition] LIKE ''%'+@text3+'%'''
SELECT @sql = @sql + ' ) X WHERE [definition] LIKE ''%'+@text4+'%'''
SELECT @sql = @sql + ' ) X WHERE [definition] LIKE ''%'+@text5+'%'''
--PRINT @sql
execute (@sql)
3- OpenTransactionListingAndKill.sql
Он работает более профессионально и команда на базе данных корпорации. Они могут запускать команды или запросы (хранимые процедуры), которые могут быть критическими. Эти транзакции иногда могут быть незавершенными, и открытые транзакции влияют непосредственно на производительность базы данных. Вы можете перечислить открытые транзакции с помощью следующего запроса на выборку для базы данных, а затем завершить эти транзакции командой KILL. :
SELECT L.request_session_id AS SPID, DB_NAME(L.resource_database_id) AS DatabaseName, O.Name AS LockedObjectName, P.object_id AS LockedObjectId, L.resource_type AS LockedResource, L.request_mode AS LockType, ST.text AS SqlStatementText, ES.login_name AS LoginName, ES.host_name AS HostName, TST.is_user_transaction as IsUserTransaction, AT.name as TransactionName, CN.auth_scheme as AuthenticationMethod FROM sys.dm_tran_locks L JOIN sys.partitions P ON P.hobt_id = L.resource_associated_entity_id JOIN sys.objects O ON O.object_id = P.object_id JOIN sys.dm_exec_sessions ES ON ES.session_id = L.request_session_id JOIN sys.dm_tran_session_transactions TST ON ES.session_id = TST.session_id JOIN sys.dm_tran_active_transactions AT ON TST.transaction_id = AT.transaction_id JOIN sys.dm_exec_connections CN ON CN.session_id = ES.session_id CROSS APPLY sys.dm_exec_sql_text(CN.most_recent_sql_handle) AS ST WHERE resource_database_id = db_id() ORDER BY L.request_session_id -- We get KILL to open transaction with SPID --KILL SPID
4- INSERT.sql
Эта хранимая процедура подготавливает операторы INSERT INTO для данных, которые вы вставили в таблицу. Это действительно практичная хранимая процедура, когда вам нужно развернуть данные в базе данных разных сред. Вы также найдете его ниже:
GO
/****** Object: StoredProcedure [dbo].[INSERT] Script Date: ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--drop proc [dbo].[INSERT]
CREATE procedure [dbo].[INSERT]
(
@Query Varchar(MAX)
)
AS
SET nocount ON
DECLARE @WithStrINdex AS INT
DECLARE @WHEREStrINdex AS INT
DECLARE @INDExtouse AS INT
DECLARE @SchemaANDTAble VArchar(270)
DECLARE @Schema_name varchar(30)
DECLARE @Table_name varchar(240)
DECLARE @Condition Varchar(MAX)
SET @WithStrINdex=0
SELECT @WithStrINdex=CHARINDEX('With',@Query )
, @WHEREStrINdex=CHARINDEX('WHERE', @Query)
IF(@WithStrINdex!=0)
SELECT @INDExtouse=@WithStrINdex
ELSE
SELECT @INDExtouse=@WHEREStrINdex
SELECT @SchemaANDTAble=LEFT (@Query,@INDExtouse-1)
SELECT @SchemaANDTAble=LTRIM (RTRIM( @SchemaANDTAble))
SELECT @Schema_name= LEFT (@SchemaANDTAble, CharINdex('.',@SchemaANDTAble )-1)
, @Table_name = SUBSTRING( @SchemaANDTAble , CharINdex('.',@SchemaANDTAble )+1,LEN(@SchemaANDTAble) )
, @Condition=SUBSTRING(@Query,@WHEREStrINdex+6,LEN(@Query))--27+6
DECLARE @COLUMNS table (Row_number SmallINT , Column_Name VArchar(Max) )
DECLARE @CONDITIONS AS varchar(MAX)
DECLARE @Total_Rows AS SmallINT
DECLARE @Counter AS SmallINT
DECLARE @ComaCol AS varchar(MAX)
SELECT @ComaCol=''
SET @Counter=1
SET @CONDITIONS=''
INsert INTO @COLUMNS
SELECT Row_number()Over (Order by ORDINAL_POSITION ) [Count] ,Column_Name FROM INFORMATION_SCHEMA.columns WHERE Table_schema=@Schema_name
AND table_name=@Table_name
AND Column_Name NOT IN ('FTP_PASSWORD','FTP_ENCRYPTED_PASSWORD')
SELECT @Total_Rows= Count(1) FROM @COLUMNS
SELECT @Table_name= '['+@Table_name+']'
SELECT @Schema_name='['+@Schema_name+']'
While (@Counter<=@Total_Rows )
begIN
--PRINT @Counter
SELECT @ComaCol= @ComaCol+'['+Column_Name+'],'
FROM @COLUMNS
WHERE [Row_number]=@Counter
SELECT @CONDITIONS=@CONDITIONS+ ' +Case When ['+Column_Name+'] is null then ''Null'' Else ''''''''+
Replace( Convert(varchar(Max),['+Column_Name+'] ) ,'''''''','''' )
+'''''''' end+'+''','''
FROM @COLUMNS
WHERE [Row_number]=@Counter
AND Column_name NOT IN ('FTP_PASSWORD','FTP_ENCRYPTED_PASSWORD')
SET @Counter=@Counter+1
End
SELECT @CONDITIONS=RIGHT(@CONDITIONS,LEN(@CONDITIONS)-2)
SELECT @CONDITIONS=LEFT(@CONDITIONS,LEN(@CONDITIONS)-4)
SELECT @ComaCol= substrINg (@ComaCol,0, len(@ComaCol) )
SELECT @CONDITIONS= '''INSERT INTO '+@Schema_name+'.'+@Table_name+ '('+@ComaCol+')' +' Values( '+'''' + '+'+@CONDITIONS
SELECT @CONDITIONS=@CONDITIONS+'+'+ ''')'''
--PrINt(@Condition)
SELECT @CONDITIONS= 'SELECT '+@CONDITIONS +'FROM ' +@Schema_name+'.'+@Table_name+' With(NOLOCK) ' + ' WHERE '+@Condition
--prINt(@CONDITIONS)
Exec(@CONDITIONS)
/****** let's use it ******/
EXEC [dbo].[INSERT] 'dbo.TABLE WHERE COLUMN_NAME=''TEXT'''
проектов
Вы, как фирма, имеете более программную среду ( DEV — UAT — PREPORD ). Вы должны изменить имя часто используемой таблицы и изменить в результате. Вы должны обновить хранимые процедуры, представления, триггеры, которые использовали эту таблицу одновременно. Это действительно надоедливая работа. Это не причина делать эту работу особенно. Я посвятил себя созданию консольного приложения для этого. Я хочу сделать это автоматически, и я разработал этот проект. Я использовал объекты управления SQL Server (SMO) для доступа к базе данных. Вероятно, вы можете найти файл Microsoft.SqlServer.Smo.dll в каталоге « C: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ SDK \ Assemblies \ Microsoft.SqlServer.Smo.dll ».
посетите здесь для получения более подробной информации http://technet.microsoft.com/en-us/library/ms162557.aspx a
2 — Db.JunkFinder
Я разработал этот проект как консольное приложение. Он находит временные или ненужные объекты базы данных (хранимая процедура, таблица, триггер, представление, функция), которые мы создали в базе данных, а затем экспортирует их в виде списка. Если вы хотите после тестирования, вы можете удалить эти объекты. Команды разработчиков особенно должны выполнять эти виды работ и управлять процессами в корпоративной базе данных. Эта работа повышает производительность базы данных.
Вы можете получить доступ к страницам GitHub и Gist , нажав на заголовок. Это все на данный момент. Хорошего кодирования