7回ALTER 1ドロップ

画像






それはすべて、私が会社のT-SQLスタイリング標準を書き始めたことから始まりました。 このトピックでは、オブジェクトを作成する前に削除する構成に焦点を当てます。



私たちのチームには約20人のSQL Ninja開発者がいて、誰もがこの構成をさまざまな方法で説明しています。たとえば、次のようなものです。



IF OBJECT_ID('dbo.Function', 'TF') IS NOT NULL DROP FUNCTION dbo.Function; GO CREATE FUNCTION dbo.Function ..
      
      





または:



 IF EXISTS ( SELECT * FROM sys.objects WHERE name = 'Procedure' AND type = 'P' ) DROP PROCEDURE dbo.Procedure; GO CREATE PROCEDURE dbo.Procedure ..
      
      





それにしても:



 IF EXISTS ( SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.Function') AND type IN (N'FN', N'IF', N'TF', N'FS', N'FT') ) DROP FUNCTION dbo.Function; GO CREATE FUNCTION dbo.Function ..
      
      





StackOverflowでは、次のオプションのほとんどを収集しました。



 IF EXISTS ( SELECT * FROM sysobjects WHERE id = object_id(N'function_name') AND xtype IN (N'FN', N'IF', N'TF') ) DROP FUNCTION function_name GO
      
      





星は私に会いに行って、私はSQLサイトの1つで実装に出会いました。それは最初私を怒らせましたが、その後、彼らはそれが次のようであると私に言いました:



 IF OBJECT_ID('dbo.Function', 'TF') IS NULL EXEC('CREATE FUNCTION dbo.Function() RETURNS @t TABLE(i INT) BEGIN RETURN END'); GO ALTER FUNCTION dbo.Function ..
      
      





実際には、毎回DROPとCREATEを実行すると、オブジェクトに対する権限が削除され、オブジェクトも複製状態になり、再作成されるとオブジェクトからも削除されます。



一般に、私はこのラムダデコレータメソッドが好きで、それをカプセル化することにしました

dbo.antidropと呼ばれるプロシージャに。



プロシージャには2つの引数しかありません。これはオブジェクトの名前とその型です。 次のようにオブジェクトのタイプを確認できます。



 SELECT type FROM sys.objects WHERE name = 'Name'
      
      





その結果、次のようになります。



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





そしてもちろん、プロシージャ自体のコード:



 IF OBJECT_ID('dbo.antidrop', 'P') IS NULL EXEC('CREATE PROC dbo.antidrop AS'); GO CREATE PROC dbo.antidrop @name SYSNAME, @type SYSNAME AS BEGIN DECLARE @if_tf NVARCHAR(512) = ' IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL EXEC(''CREATE FUNCTION ' + @name + '() RETURNS @t TABLE(i INT) BEGIN RETURN END''); GO '; DECLARE @fn NVARCHAR(512) = ' IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL EXEC(''CREATE FUNCTION ' + @name + '(@i INT) RETURNS INT AS BEGIN RETURN @i + 1 END''); GO '; DECLARE @p NVARCHAR(512) = ' IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL EXEC(''CREATE PROC ' + @name + 'AS''); GO '; DECLARE @v NVARCHAR(512) = ' IF OBJECT_ID(''' + @name + ''', ''' + @type + ''') IS NULL EXEC(''CREATE VIEW ' + @name + ' AS SELECT 1 AS i''); GO '; 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); END END GO
      
      





ご清聴ありがとうございました!



All Articles