物件名稱解析錯誤
在寫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時便會得到如下的錯誤訊息:
後來發現
Drop / Delete / Create 時,會自動帶入User1的預設Schema
Insert / Update/Select時,卻又會以dbo為Schema
所以得在Stored procedure裡指定schema name,或將User1的預設schema改為dbo以避免物件名稱解析錯誤問題。