Database
 sql >> база данни >  >> RDS >> Database

По-добре ALTER, отколкото DROP

В тази статия ще предоставя конструкция за изтриване на обект, преди да го създам.

В нашия екип има около двадесет разработчици на SQL Ninja. Всички те описват тази конструкция по различни начини.

Нашият екип се състои от около двадесет SQL Ninjas и всички те използват следното изявление по различен начин:

АКО OBJECT_ID('dbo.Function', 'TF') НЕ Е NULL DROP FUNCTION dbo.Function;GOCREATE FUNCTION dbo.Function ..

Или:

АКО СЪЩЕСТВУВА ( SELECT * FROM sys.objects WHERE name ='Procedure' AND type ='P' ) DROP PROCEDURE dbo.Procedure;GOCREATE PROCEDURE dbo.Procedure ..

Или:

АКО СЪЩЕСТВУВА ( ИЗБЕРЕТЕ 1 ОТ sys.objects WHERE object_id =OBJECT_ID(N'dbo.Function') И въведете IN (N'FN', N'IF', N'TF', N'FS', N' FT')) DROP FUNCTION dbo.Function;GOCREATE FUNCTION dbo.Function ..

В StackOverflow потребителите харесаха тази версия:

АКО СЪЩЕСТВУВА ( SELECT * FROM sysobjects WHERE id =object_id(N'function_name') И xtype IN (N'FN', N'IF', N'TF')) DROP FUNCTION function_nameGO

Звездите са подравнени и намерих подходяща реализация в един от SQL сайтовете. Първоначално бях шокиран, но след това хората помогнаха да разберат защо работи добре.

АКО OBJECT_ID('dbo.Function', 'TF') Е NULL EXEC('CREATE FUNCTION dbo.Function() ВРЪЩА @t TABLE(i INT) BEGIN RETURN END');GOALTER FUNCTION dbo.Function .. 

Въпросът е, че ако използвате операторите DROP и CREATE всеки път, тогава изтривате разрешенията за обект. В допълнение, обектът може да бъде в репликацията и той също ще бъде изтрит, след като бъде създаден отново.

И така, харесах тази версия и реших да я опакова в dbo.antidrop процедура.

Процедурата приема само два аргумента:име на обект и неговия тип. За да проверите типа обект, изпълнете следния оператор:

ИЗБЕРЕТЕ тип FROM sys.objects WHERE name ='Име'

Ето как ще изглежда:

EXEC dbo.antidrop('dbo.Name', 'FN'); GOALTER FUNCTION dbo.Name ..

И накрая, кодът на процедурата е както следва:

АКО OBJECT_ID('dbo.antidrop', 'P') Е NULL EXEC('CREATE PROC dbo.antidrop AS');GOCREATE PROC dbo.antidrop @name SYSNAME, @type SYSNAMEASBEGIN ДЕКЛАРИРАНЕ @if_tf NVARCHAR(512) =' АКО OBJECT_ID(''' + @name + ''', ''' + @type + ''') Е NULL EXEC(''CREATE FUNCTION ' + @name + '() ВРЪЩА @t TABLE(i INT) НАЧАЛО ВРЪЩАНЕ КРАЙ''); ОТИВАМ '; ДЕКЛАРИРАНЕ @fn NVARCHAR(512) =' АКО OBJECT_ID(''' + @name + ''', ''' + @type + ''') Е NULL EXEC(''СЪЗДАВАНЕ НА ФУНКЦИЯ ' + @name + '(@ i INT) ВРЪЩА INT КАТО НАЧАЛО RETURN @i + 1 END''); ОТИВАМ '; DECLARE @p NVARCHAR(512) =' АКО OBJECT_ID(''' + @name + ''', ''' + @type + ''') Е NULL EXEC(''CREATE PROC ' + @name + 'AS' '); ОТИВАМ '; DECLARE @v NVARCHAR(512) =' АКО OBJECT_ID(''' + @name + ''', ''' + @type + ''') Е NULL EXEC(''CREATE VIEW ' + @name + ' КАТО SELECT 1 AS i''); ОТИВАМ '; IF @type in (N'IF', N'TF') BEGIN EXEC(@if_tf); END ELSE IF @type =N'FN' BEGIN EXEC(@fn); END ELSE IF @type =N'P' BEGIN EXEC(@p); END ELSE IF @type =N'V' BEGIN EXEC(@v); ENDENDGO

Благодаря ви за вниманието!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Мониторинг на архивиране в различни инстанции

  2. Уебинар за Plan Explorer 3.0 – Примери и въпроси и отговори

  3. Разбиране на анализа на големи данни

  4. Топ 10 причини защо трябва да научите SQL

  5. Управление на сигурността на данните