[MSSQL 2008] 物件名稱解析錯誤

物件名稱解析錯誤

在寫T-SQL語法時我們常習慣省略四部份名稱前的serve_name,database_name及schema_name,而只使用object_name,沒想到在Stored Procedure若沒指定schema_name時有可能造成物件名稱解析錯亂 @@

-- 建立SQL Login

USE [master]

GO

CREATE LOGIN [User1] WITH PASSWORD=N'test'

GO

-- 建立DB

CREATE DATABASE TestDB

GO

-- 建立使用者/指定Default schema/賦付db_owner權限

USE [TestDB]

GO

CREATE SCHEMA [User1]

GO

CREATE USER [User1] FOR LOGIN [User1] WITH DEFAULT_SCHEMA=[User1]

GO

USE [TestDB]

GO

EXEC sp_addrolemember N'db_owner', N'User1'

GO

-- 建立Stored Procedure

Use [TestDB]

GO

CREATE PROC SP_Test

AS

BEGIN

IF EXISTS(SELECT * FROM sys.tables WHERE type='U' AND name='TB_Test')

DROP TABLE TB_Test

CREATE TABLE TB_Test (C1 char(1))

INSERT TB_Test Values ('1')

UPDATE TB_Test Set C1 = '2'

DELETE TB_Test

SELECT * FROM TB_Test

END

 

使用者User1的預設 schema不為dbo,當執行Stored procedure - dbo.SP_Test時便會得到如下的錯誤訊息:

clip_image002

 

後來發現

Drop / Delete / Create 時,會自動帶入User1的預設Schema

Insert / Update/Select時,卻又會以dbo為Schema

 

所以得在Stored procedure裡指定schema name,或將User1的預設schema改為dbo以避免物件名稱解析錯誤問題。