tSQLt 如何判断 table 是否被伪造
tSQLt How can I tell if a table has been faked
我刚刚开始为我的数据库创建一些单元测试。
如果我伪造了 table,
EXEC tSQLt.FakeTable
@TableName = 'dbo.[My Table]',
@Identity = 0,
@ComputedColumns = 0,
@Defaults = 0
我可以检查它是否被伪造了吗?
请注意,可以找到有关 FakeTable SP 的文档 here。
动机
我希望能够做到这一点,因为我想象创建几个存储过程来填充这些伪造的 tables 以便我可以执行测试。
但是我不想处理伪造存储过程中的 tables(所以我可以多次调用它们,每次输入不同的信息)。
我不想在添加数据之前忘记伪造 table(这几乎肯定会导致我无法通过测试)。
您可以检查存储过程开头是否存在 table。
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
tSQLt 将扩展的 属性 添加到伪造的 table 以跟踪它伪造的 table。这可以使用函数 tSQLt.Private_GetOriginalTableName
:
轻松测试
SELECT tSQLt.Private_GetOriginalTableName('dbo','[My Table]')
如果 table 不是伪造的,这将 return NULL
。
如果想做的比较复杂,可以直接查询sys.extended_properties
。 tSQLt.Private_GetOriginalTableName
.
的定义参见tSQLt.class.sql
脚本的内容(在tSQLt distribution中)
我刚刚开始为我的数据库创建一些单元测试。
如果我伪造了 table,
EXEC tSQLt.FakeTable
@TableName = 'dbo.[My Table]',
@Identity = 0,
@ComputedColumns = 0,
@Defaults = 0
我可以检查它是否被伪造了吗?
请注意,可以找到有关 FakeTable SP 的文档 here。
动机
我希望能够做到这一点,因为我想象创建几个存储过程来填充这些伪造的 tables 以便我可以执行测试。 但是我不想处理伪造存储过程中的 tables(所以我可以多次调用它们,每次输入不同的信息)。
我不想在添加数据之前忘记伪造 table(这几乎肯定会导致我无法通过测试)。
您可以检查存储过程开头是否存在 table。
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
tSQLt 将扩展的 属性 添加到伪造的 table 以跟踪它伪造的 table。这可以使用函数 tSQLt.Private_GetOriginalTableName
:
SELECT tSQLt.Private_GetOriginalTableName('dbo','[My Table]')
如果 table 不是伪造的,这将 return NULL
。
如果想做的比较复杂,可以直接查询sys.extended_properties
。 tSQLt.Private_GetOriginalTableName
.
tSQLt.class.sql
脚本的内容(在tSQLt distribution中)