SQL Server автоматически не создаст индекс на внешнем ключе. Также из MSDN:
ограничение FOREIGN KEY А не должно быть связано только с ограничением PRIMARY KEY в другой таблице; это может также быть определено для ссылки на столбцы ограничения UNIQUE в другой таблице. Ограничение FOREIGN KEY может содержать нулевые значения; однако, если какой-либо столбец составного ограничения FOREIGN KEY содержит нулевые значения, проверка всех значений, которые составляют ограничение FOREIGN KEY, пропускается. Чтобы удостовериться, что все значения составного ограничения FOREIGN KEY проверяются, определите NOT NULL на всех участвующих столбцах.
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
I'll use either depending on context: my initial-build or major refactoring scripts will use check/drop/create, pure maintenance scripts use alter.
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.
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
Каждый раз, когда разработчик пишет IF EXISTS (...) DROP
, щенка тюленя бьют дубинкой. Вы должны точно знать, что находится в базе данных, и ваш сценарий обновления должен выполнить CREATe или ALTER в зависимости от текущей версии схемы вашего приложения: Контроль версий и ваша база данных .