Вернуться к статье

Листинг 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


Вернуться к статье