DROP SQL Таблицы, если дата создания более недели - MS SQL Server - PullRequest
5 голосов
/ 13 января 2010

Я хочу создать хранимую процедуру и задание на сервере SQL Ms, которая бы удаляла все таблицы в схеме, возраст которых превышает одну неделю.

Я создаю резервные копии каждый день, и я хочу автоматизировать процесс, запланировав задание на удаление всех резервных копий (таблиц SQL), которые старше недели.

Ваша помощь будет принята с благодарностью.

Ответы [ 2 ]

7 голосов
/ 13 января 2010

Для этого можно использовать ключевое слово sys.objects в SQL Server.

Запрос будет выглядеть примерно так:

USE [Your_Database_Name];
GO
SELECT name AS object_name 
  ,SCHEMA_NAME(schema_id) AS schema_name
  ,type_desc
  ,create_date
  ,modify_date
FROM sys.objects
WHERE create_date > GETDATE() - [No_Of_Days_Old]
ORDER BY create_date;
GO

Этот пример, приведенный выше, представляет собой небольшое изменение в первом примере, показанном на странице MSDN, в котором указано ключевое слово sys.objects ( A. Возвращает все объекты, которые были изменены за последние N дней ).

Эту страницу можно найти здесь:

sys.objects (Transact-SQL)

и является отличным ресурсом для множества различных методов запроса «метаданных» объектов вашей базы данных.

Конечно, вышеизложенное просто "ВЫБРАЕТ" имя таблицы, которую необходимо удалить, и фактически не удаляет (или УДАЛЯЕТ) таблицу из вашей базы данных.

Для этого вам понадобится механизм для выдачи команды DROP TABLE. К сожалению, команда DROP TABLE не примет имя таблицы со значением параметра (т. Е. Вы не можете сделать DROP TABLE @tablename), но вы можете создать строку / varchar полного оператора T-SQL и EXECUTE его).

Чтобы достичь этого, вы можете использовать CURSOR для циклического просмотра результатов предыдущего оператора SELECT, создав новую команду T-SQL в строке / varchar, которая удалит имя таблицы. Пример этого ниже:

DECLARE @tname VARCHAR(100)
DECLARE @sql VARCHAR(max)

DECLARE db_cursor CURSOR FOR 
SELECT name AS tname
FROM sys.objects
WHERE create_date > GETDATE() - 7

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @tname  

WHILE @@FETCH_STATUS = 0  
BEGIN  
       SET @sql = 'DROP TABLE ' + @tname
       --EXEC (@sql)
       PRINT @sql

       FETCH NEXT FROM db_cursor INTO @tname  
END  

CLOSE db_cursor  
DEALLOCATE db_cursor

Обратите внимание, что в приведенном выше примере я закомментировал строку EXEC (@sql). Это строка, которая фактически выполняет оператор T-SQL в переменной @sql, и, поскольку это деструктивная команда, я просто закомментировал ее и вместо нее использовал команду PRINT @sql (строка ниже). Запустите это как есть, чтобы увидеть, какие таблицы вы, вероятно, удаляете, и, когда вы довольны, раскомментируйте команду EXEC (@sql) и закомментируйте команду PRINT @sql!

0 голосов
/ 13 января 2010

Вы можете использовать этот запрос, чтобы получить список таблиц, которым больше недели:

SELECT
        [name]
       ,create_date
FROM
        sys.tables
WHERE   DATEDIFF(day, create_date, getdate()) > 7

Таким образом, в вашем SP вы можете написать SP для циклического перебора таблиц, возвращенных из этого запроса, и удалить их. Вы должны будете принять во внимание, что если у таблиц есть внешние ключи, порядок их удаления важен, поэтому эта идея, вероятно, потребует некоторой настройки, если это ваш сценарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...