Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

ALTER tốt hơn DROP

Trong bài viết này, tôi sẽ cung cấp một cấu trúc để xóa một đối tượng trước khi tạo nó.

Trong nhóm của chúng tôi, có khoảng 20 nhà phát triển SQL Ninja. Tất cả chúng đều mô tả cấu trúc này theo những cách khác nhau.

Nhóm của chúng tôi bao gồm khoảng 20 nhân viên hỗ trợ SQL và tất cả họ đều sử dụng câu lệnh sau theo một cách khác:

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

Hoặc:

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

Hoặc:

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 ..

Trên StackOverflow, người dùng thích phiên bản này:

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

Các ngôi sao được căn chỉnh và tôi tìm thấy một triển khai thích hợp trong một trong các trang web SQL. Lúc đầu, tôi bị sốc, nhưng sau đó mọi người đã giúp tìm hiểu lý do tại sao nó hoạt động tốt.

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 ..

Vấn đề là nếu bạn sử dụng câu lệnh DROP và CREATE mỗi lần, thì bạn sẽ xóa quyền đối tượng. Ngoài ra, đối tượng có thể nằm trong bản sao và nó cũng sẽ bị xóa sau khi được tạo lại.

Vì vậy, tôi thích phiên bản này và quyết định đưa nó vào dbo.antidrop thủ tục.

Thủ tục chỉ nhận hai đối số:tên đối tượng và kiểu của nó. Để kiểm tra loại đối tượng, hãy thực hiện câu lệnh sau:

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

Đây là cách nó sẽ trông như thế nào:

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

Cuối cùng, mã của thủ tục như sau:

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

Cảm ơn bạn đã chú ý theo dõi!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. So sánh Hiệu suất Windows Azure VM, Phần 2

  2. Số lượng SQL

  3. SQL SUM () cho người mới bắt đầu

  4. Thiết kế cơ sở dữ liệu cho các ứng dụng đa ngôn ngữ

  5. Các blog cơ sở dữ liệu hàng đầu để theo dõi