2016-12-15 48 views
1

我刚开始为我的数据库创建一些单元测试。tSQLt如何判断表是否已被伪造

如果我伪造了一张桌子,

EXEC tSQLt.FakeTable 
    @TableName = 'dbo.[My Table]', 
    @Identity = 0, 
    @ComputedColumns = 0, 
    @Defaults = 0 

我可以检查它是否已被伪造?

请注意,有关FakeTable SP的文档可以找到here

动机

我希望能够做到这一点,因为我想象创造其填充这些伪造表格,以便我可以进行测试的存储过程。 但是我不想处理在存储过程中伪造表格(所以我可以多次调用它们,每次输入不同的信息)。

我不希望有可能在添加数据之前忘记伪造表格(因为几乎肯定会导致我的测试失败)。

回答

3

tSQLt将扩展属性添加到假表中以跟踪它伪造的表。这是很容易使用的功能tSQLt.Private_GetOriginalTableName测试:

SELECT tSQLt.Private_GetOriginalTableName('dbo','[My Table]') 

这将返回NULL如果表是不是伪造的。

如果你想做更复杂的事情,你可以直接查询sys.extended_properties。有关tSQLt.Private_GetOriginalTableName的定义,请参见tSQLt.class.sql脚本的内容(在tSQLt distribution中)。

+0

脸棕榈。只是认识到tSQLt是一种工具,而不是OP的错字.... –

+0

对不起,我可以在我的问题中更清楚地说明我正在使用特定的工具。 – Malrig

+0

@Ed谢谢,我会在我的代码中进行一些测试,并将其标记为接受后,我有一些工作。 – Malrig

0

您可以检查存储过程开始时是否存在该表。

If Not Exists (Select 1 From Sys.Objects Where [Name] = 'YOURTABLENAME' And [Type] = 'U') 
    Begin 
    -- Your Create Table Statement Here 
    ENd 

根据您的意见,该工具已经在做这样的事情,使用模式:

Create table dbo.MisterPositive (test int) 
Create table developers.MisterPositive (test Int) 

-- Both statements below work 
Select * From dbo.MisterPositive 
Select * From developers.MisterPositive 

- 使用此功能查找存在之前

Select 1 from sys.objects 
    Inner join sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id 
where sys.objects.[Name] = 'MisterPositive' And sys.schemas.name = 'dbo' 

Select 1 from sys.objects 
    Inner join sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id 
where sys.objects.[Name] = 'MisterPositive' And sys.schemas.name = 'Developers' 

所以你将是

If Not Exists (Select 1 from sys.objects 
    Inner join sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id 
where sys.objects.[Name] = 'YOURTABLE' And sys.schemas.[Name] = 'tSQLt') 
    Begin 
    -- create table here 
    End 
+0

这是否专门检查表是否已经使用tSQLt工具伪造?或者只是表格存在? – Malrig

+0

如果是伪造的,你的意思是它存在于数据库中,那么是的,这正是该声明所做的。我不知道会检查哪个方法是创建表的声明。 (SSMS或其他一些DBMS工具) –

+0

啊,那么我认为这不适用于这种情况。当我“伪造”一个表格时,我选择一个已经存在于数据库中的表格,并用工具类型替换为同名的空表格(不知道这是如何工作的)。 所以这个表在我伪装之前就已经存在了。 – Malrig

相关问题