我们建立了一个新的 SQL Server 2012。
每次我们创建存储过程时,存储过程的名称都会更改为开发人员所在的 AD 组名称和开发人员用户名。
是什么导致了这种情况,我们如何才能纠正它?
我们建立了一个新的 SQL Server 2012。
每次我们创建存储过程时,存储过程的名称都会更改为开发人员所在的 AD 组名称和开发人员用户名。
是什么导致了这种情况,我们如何才能纠正它?
最简单和最安全的方法是在模式前面加上前缀,例如
CREATE PROCEDURE dbo.usp_myProc
AS ...
当用户在 CREATE 语句中创建没有模式名称的数据库对象时,它是在默认用户模式中创建的。
有两种方法可以创建特定模式拥有的对象。
1 在 CREATE 语句中显式标识模式名称
创建过程 [MySchema].[ProcName]
2 设置默认用户架构并创建没有架构名称的数据库对象。
ALTER USER UserName WITH DEFAULT_SCHEMA = MySchema;
创建过程 [ProcName]
您是否使用模式名称创建过程?
最有可能的是,您正在这样做:
CREATE PROCEDURE [uspMyProcedure]
至少,你应该这样做:
CREATE PROCEDURE [dbo].[uspMyProcedure]
下面是一个小例子,展示了使用模式名称命名的功能。
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[uspGetVersion]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[uspGetVersion]
GO
CREATE PROCEDURE [dbo].[uspGetVersion]
AS
SET NOCOUNT ON
SELECT 'dbo Version : ' + @@VERSION
SET NOCOUNT OFF
GO
EXEC [dbo].[uspGetVersion]
GO
if not exists(select 1 from information_schema.schemata where schema_name='LookupSchema')
BEGIN
print 'Creating the schema : [LookupSchema]'
EXEC ('CREATE SCHEMA [LookupSchema] AUTHORIZATION dbo;')
END
if exists(select 1 from information_schema.schemata where schema_name='LookupSchema')
BEGIN
print 'Schema Exists : [LookupSchema]'
END
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[LookupSchema].[uspGetVersion]') AND type in (N'P', N'PC'))
DROP PROCEDURE [LookupSchema].[uspGetVersion]
GO
CREATE PROCEDURE [LookupSchema].[uspGetVersion]
AS
SET NOCOUNT ON
SELECT 'LookupSchema Version : ' + @@VERSION
SET NOCOUNT OFF
GO
GRANT EXECUTE ON [LookupSchema].[uspGetVersion] TO [public]
go
EXEC [LookupSchema].[uspGetVersion]
GO