我们建立了一个新的SQL Server 2012.
每次创建存储过程时,存储过程的名称都会更改为开发人员所在的AD组名称和开发人员用户名。
造成这种情况的原因是什么?我们如何纠正它?
答案 0 :(得分:4)
最简单,最安全的方法是使用模式加前缀,例如
CREATE PROCEDURE dbo.usp_myProc
AS ...
答案 1 :(得分: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
答案 2 :(得分:0)
当用户在CREATE语句中创建没有模式名称的数据库对象时,它将在默认用户模式中创建。
有两种方法可以创建特定模式所拥有的对象。
1在CREATE语句中明确标识模式名称
CREATE PROC [MySchema]。[ProcName]
2设置默认用户架构并创建没有架构名称的数据库对象。
ALTER USER UserName WITH DEFAULT_SCHEMA = MySchema;
CREATE PROC [ProcName]