0

我们建立了一个新的 SQL Server 2012。

每次我们创建存储过程时,存储过程的名称都会更改为开发人员所在的 AD 组名称和开发人员用户名。

是什么导致了这种情况,我们如何才能纠正它?

4

3 回答 3

4

最简单和最安全的方法是在模式前面加上前缀,例如

CREATE PROCEDURE dbo.usp_myProc
AS ...
于 2013-09-17T15:41:10.997 回答
0

当用户在 CREATE 语句中创建没有模式名称的数据库对象时,它是在默认用户模式中创建的。

有两种方法可以创建特定模式拥有的对象。

1 在 CREATE 语句中显式标识模式名称

创建过程 [MySchema].[ProcName]

2 设置默认用户架构并创建没有架构名称的数据库对象。

ALTER USER UserName WITH DEFAULT_SCHEMA = MySchema;

创建过程 [ProcName]

于 2013-09-17T16:37:15.803 回答
0

您是否使用模式名称创建过程?

最有可能的是,您正在这样做:

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
于 2013-09-17T15:39:34.890 回答