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!