Что Вы делаете в SQL Server, чтобы СОЗДАТЬ ИЛИ ИЗМЕНИТЬСЯ?

SQL Server автоматически не создаст индекс на внешнем ключе. Также из MSDN:

ограничение FOREIGN KEY А не должно быть связано только с ограничением PRIMARY KEY в другой таблице; это может также быть определено для ссылки на столбцы ограничения UNIQUE в другой таблице. Ограничение FOREIGN KEY может содержать нулевые значения; однако, если какой-либо столбец составного ограничения FOREIGN KEY содержит нулевые значения, проверка всех значений, которые составляют ограничение FOREIGN KEY, пропускается. Чтобы удостовериться, что все значения составного ограничения FOREIGN KEY проверяются, определите NOT NULL на всех участвующих столбцах.

61
задан Lukasz Szozda 28 July 2017 в 13:48
поделиться

5 ответов

Looks like it's a while off: link text

typical script for me:

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'ig_InsertDealer' AND type = 'P')
    DROP PROC dbo.ig_InsertDealer
GO 
CREATE PROCEDURE dbo.ig_InsertDealer
...
GO
GRANT EXECUTE ON dbo.ig_InsertDealer TO ...
GO
1
ответ дан 24 November 2019 в 17:06
поделиться

I'll use either depending on context: my initial-build or major refactoring scripts will use check/drop/create, pure maintenance scripts use alter.

1
ответ дан 24 November 2019 в 17:06
поделиться

I'd use OBJECT_ID(...) IS NOT NULL before a DROP.

Object identifiers have to be unique, so it works without using system tables:

CREATE TRIGGER dbo.ExistingTable ON dbo.AnotherTable FOR UPDATE
AS 
SET NOCOUNT ON
GO

gives

Msg 2714, Level 16, State 2, Procedure MetaClass, Line 3
There is already an object named ExistingTable ' in the database.

I normally use ALTER because of how we work with source control, etc.

4
ответ дан 24 November 2019 в 17:06
поделиться

That's basically the way to do it, yes. I just wonder if you have a particular reason to use the "EXEC" approach:

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'SynchronizeRemoteCatalog' AND ROUTINE_SCHEMA = 'dbo' AND ROUTINE_TYPE = 'PROCEDURE')
    EXEC ('DROP PROCEDURE dbo.SynchronizeRemoteCatalog')

Why not just:

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'SynchronizeRemoteCatalog' AND ROUTINE_SCHEMA = 'dbo' AND ROUTINE_TYPE = 'PROCEDURE')
    DROP PROCEDURE dbo.SynchronizeRemoteCatalog

???

For triggers, there's sys.triggers. Those are system catalog views in the "sys" schema - not strictly or directly tables, really.

Marc

2
ответ дан 24 November 2019 в 17:06
поделиться

Каждый раз, когда разработчик пишет IF EXISTS (...) DROP , щенка тюленя бьют дубинкой. Вы должны точно знать, что находится в базе данных, и ваш сценарий обновления должен выполнить CREATe или ALTER в зависимости от текущей версии схемы вашего приложения: Контроль версий и ваша база данных .

7
ответ дан 24 November 2019 в 17:06
поделиться