Вернуться к статье
Листинг 1. Текст хранимой процедуры Showind.
CREATE PROC Showind @table varchar(30) = ?sys%? AS SELECT TABLE_NAME = sysobjects.name, INDEX_NAME = sysindexes.name, INDEX_ID = indid FROM sysindexes INNER JOIN sysobjects ON sysobjects.id = sysindexes.id WHERE sysobjects.name LIKE @table declare @calldate datetime select @calldate = getdate() EXEC sp_updateextendedproperty ?call? ,@calldate , ?user?, dbo, ?procedure?, ?showind? GO
Листинг 2. Пример триггера, который запрещает изменение таблицы.
CREATE TRIGGER [audit] ON [dbo].[example] FOR INSERT, UPDATE, DELETE AS declare @currentuser varchar(30) set @currentuser = current_user EXEC sp_updateextendedproperty ?table_audit? , @currentuser, ?user?, dbo,?table?,?example? EXEC sp_updateextendedproperty ?user_audit? , ?example?, ?user?, @currentuser - .......... - .......... - .......... Rollback transaction
Вернуться к статье
Листинг 3. Процедура работы со свойством Text in row.
CREATE PROC Text_in_row as - Декларирование переменных DECLARE @tablename VARCHAR (128) - Декларирование курсора для перечня таблиц в базе DECLARE tables CURSOR FOR select sysobjects.name from sysindexes inner join sysobjects on sysindexes.id = sysobjects.id where indid = 255 and type = ?U? - Открываем курсор с перечнем таблиц OPEN tables - Заходим в курсор FETCH NEXT FROM tables INTO @tablename WHILE @@FETCH_STATUS = 0 BEGIN - Устанавливаем значение расширенного свойства If OBJECTPROPERTY(OBJECT_ID(@tablename), ?TableTextInRowLimit?)!= 0 EXEC sp_updateextendedproperty ?text_in_row?, ?yes?, ?user?, dbo, ?table?, @tablename FETCH NEXT FROM tables INTO @tablename END - Закрываем и убираем курсор CLOSE tables DEALLOCATE tables
Вернуться к статье
Листинг 4. Процедура дефрагментации индекса.
CREATE PROC DEFRAG (@MAXFRAG DECIMAL) AS - Декларирование переменных DECLARE @tablename VARCHAR (128) DECLARE @execstr VARCHAR (255) DECLARE @objectid INT DECLARE @indexid INT DECLARE @frag DECIMAL DECLARE @defragdate DATETIME - Установка даты и времени предполагаемой дефрагментации индексов SELECT @defragdate = getdate() - Декларирование курсора для перечня таблиц в базе DECLARE tables CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ?BASE TABLE? - Создание временной таблицы для перечня индексов CREATE TABLE #fraglist( ObjectName CHAR (255), ObjectId INT, IndexName CHAR (255), IndexId INT, Lvl INT, CountPages INT, CountRows INT, MinRecSize INT, MaxRecSize INT, AvgRecSize INT, ForRecCount INT, Extents INT, ExtentSwitches INT, AvgFreeBytes INT, AvgPageDensity INT, ScanDensity DECIMAL, BestCount INT, ActualCount INT, LogicalFrag DECIMAL, ExtentFrag DECIMAL) - Открываем курсор с перечнем таблиц OPEN tables - Заходим в курсор FETCH NEXT FROM tables INTO @tablename WHILE @@FETCH_STATUS = 0 BEGIN - Проверяем фрагментированность для всех индексов и всех таблиц INSERT INTO #fraglist EXEC (?DBCC SHOWCONTIG (??? + @tablename + ???) WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS?) FETCH NEXT FROM tables INTO @tablename END - Закрываем и убираем курсор CLOSE tables DEALLOCATE tables - Декларируем курсор с перечнем индексов, которые нужно дефрагментировать DECLARE indexes CURSOR FOR SELECT ObjectName, ObjectId, IndexId, LogicalFrag FROM #fraglist WHERE LogicalFrag >= @maxfrag AND INDEXPROPERTY (ObjectId, IndexName, ?IndexDepth?) > 0 - Открываем курсор и двигаемся внутри него OPEN indexes FETCH NEXT FROM indexes INTO @tablename, @objectid, @indexid, @frag WHILE @@FETCH_STATUS = 0 BEGIN SELECT @execstr = ?DBCC INDEXDEFRAG (0, ? + RTRIM(@objectid) + ?, ? + RTRIM(@indexid) + ?)? EXEC (@execstr) - Устанавливаем значения расширенных свойств EXEC sp_updateextendedproperty ?Defrag_Date? , @defragdate , ?user?, dbo, ?table?, @tablename, ?index?, @indexid EXEC sp_updateextendedproperty ?LogicalFrag? , @frag , ?user?, dbo, ?table?, @tablename, ?index?, @indexid FETCH NEXT FROM indexes INTO @tablename, @objectid, @indexid, @frag END - Закрываем и убираем курсор CLOSE indexes DEALLOCATE indexes - Удаляем временную таблицу DROP TABLE #fraglist GO
Вернуться к статье